打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
分享在Keil C51中遇到的一个小bug的解决过程


51黑电子论坛网址:51hei.com

用Keil C51编写一个遍历LED多段数码管的所有管脚的程序,想使用sprintf函数把实际运行时的数值显示出来,结果遇到一个很奇怪的问题,就是显示的数值并不是参数的实际数值。程序如下:

#include 'stc15.h'
#include 'stdio.h'

char myBuf[50];
void main(void)
{
unsigned char i1,i2,i3; //这个定义导致的sprintf出错,并且移位操作也显得异常。
unsigned int tp;

for (tp=0; tp4096;tp++) {
sprintf(myBuf, 'nP=%#x:', tp);
SendString(myBuf); //通过串口把数值显示出来。
//P2.0-P2.4
i1 = tp & 0x1F;
P2 &= 0xE0;
P2 |= i1;
sprintf(myBuf, 'P2=%#x:', i1);
SendString(myBuf);

//P4.5-P4.7
P4 &= 0x1F;
i2 = ((tp>>5) & 0x7)<>;
P4 |= i2;
sprintf(myBuf, 'P4=%#x: ', i2);
SendString(myBuf);

//P3.4-P3.7
P3 &= 0x0F;
i3 = (tp>>8)4;
P3 |= i3;
sprintf(myBuf, 'P3=%#x\r\n', i3);
SendString(myBuf);

delay(4000);
}
}
以上的运行结果,nP, P2,P3,P4都是0xFFFF类似的格式,而不是所期望的0xFF。如下所示:
Test Uart at 115200.
nP=0x0:P2=0x0:P4=0x0: P3=0x0
nP=0x1:P2=0x101:P4=0x1: P3=0x1
nP=0x2:P2=0x202:P4=0x2: P3=0x2
nP=0x3:P2=0x303:P4=0x3: P3=0x3
nP=0x4:P2=0x404:P4=0x4: P3=0x4
nP=0x5:P2=0x505:P4=0x5: P3=0x5
......
......
nP=0x1d7:P2=0x17d7:P4=0x6d7: P3=0x1d7
nP=0x1d8:P2=0x18d8:P4=0x6d8: P3=0x1d8
nP=0x1d9:P2=0x19d9:P4=0x6d9: P3=0x1d9
nP=0x1da:P2=0x1ada:P4=0x6da: P3=0x1da
nP=0x1db:P2=0x1bdb:P4=0x6db: P3=0x1db
这个问题折腾了将近1天的时间,最后发现把i1,i2,i3的定义由unsigned char修改为unsigned int,这个问题就消失了。究其原因,是因为sprintf函数中的x变量是整数型的,在C51中把unsigned char变量发送时,就出现了错误。

具体原因不清楚,算不算Keil C51编译器的Bug呢?这里用的是Keil C51 9.54a。




本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
如何在 KEIL C51(v6.21) 中调用汇编函数的一个示例
怎样用keil编写4位数码管显示1234的程序
在Delphi编程中使用C语言代码
零成本学习单片机编程之从hello word开始
Keil
Keil C51中变量和函数的绝对地址定位问题:
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服