51单片机用“sprintf”遇到问题,输出变量自动扩大256倍

2020-01-18 18:41发布

不知道这样标题对不对?

单片机用的是STC12C5608AD,
准备用他的4路PWM做一个电脑风扇的调速器。但是刚开始折腾显示部分就遇到了一个小麻烦。
屏幕用了两个,一个是MP3拆的12864液晶。显示正常。
另一个是某宝买的串口通讯彩屏。
在使用“sprintf”函数然后输出串口时,里面的变量会有一个随机的初始值(比如照片中原本应显示0,实际显示221)。然后变量会自动扩大256倍,实际显示出来的数值就是变量扩大256倍在加上这个初始值(比如第二张照片中原本应该显示1,现在显示“221+1*256”=477)
除了变量以外的数值显示正常!
折腾了好久也没有一个所以然……
所以请各位大神帮忙出出主意

相关代码:
#include "stdio.h"
uchar Aold=0,Bold=0,st=0,num=0;//±àÂëÆ÷²âÊÔ
uchar idata buf[64];

void SendData(uchar dat1)
{
        ES=0;
        TI=0;
        //TB8=~P;
        SBUF=dat1;
        while(!TI);
        TI=0;
}

void SendString(char *s)
{
        while(*s)
        {
        SendData(*s++);
        }
        delay(10);
}       

sprintf(buf,"DS16(115,147,'0-255:%02d',15); ",num);
SendString(buf);       

下面是图:

初始值应为0,实际显示221
P60222-121054.jpg (107.52 KB, 下载次数: 0) 下载附件 2016-2-22 12:56 上传

“完整”源代码,就算不能解决问题,也可以给初学者一个参考,(st7567液晶当做字符屏,中断方式驱动旋转编码器)
st7567点阵当字符.rar (10.79 KB, 下载次数: 9) 2016-2-22 13:02 上传 点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
1a2b3c
1楼-- · 2020-01-19 07:26
8位机
打印格式默认是 int

所以两个解决办法 1.前面加'b'表示UCHAR,例如 %02bd
2.printf("%02d",(unsigned int)num)

实际上都是强制转换的概念

也许你后面遇到  long的还会出错,所以补充一下,logn的需要加'l'转换
jswd0810
2楼-- · 2020-01-18 21:41
你的buf是uchar,后面的格式是%d
sdf159372008
3楼-- · 2020-01-19 00:55
jswd0810 发表于 2016-2-22 13:42
你的buf是uchar,后面的格式是%d

虽然还是不怎么懂,但是百度了一下,
buf改成char,效果一样
后面的格式%02hu也一样
羊羊的老爸
4楼-- · 2020-01-19 05:17
 精彩回答 2  元偷偷看……
bbglx
5楼-- · 2020-01-19 06:52
把num定义成int就可以正常显示了
这个问题不知道有没有好的解决方法,当时好像试过强制转换也不行
jswd0810
6楼-- · 2020-01-19 12:53
sdf159372008 发表于 2016-2-22 14:04
虽然还是不怎么懂,但是百度了一下,
buf改成char,效果一样
后面的格式%02hu也一样 ...

sprintf(buf,"DS16(115,147,'0-255:%02c',15); ",num);
这样试试

一周热门 更多>