为什么大于32767就显示乱码

[复制链接]
5076|32
 楼主| sdzccfx 发表于 2012-6-17 22:28 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned long  aa;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管编码
                    0x07,0x7f,0x6f};
void delay(uchar i)  //延时程序
{
  uchar j,k;
     for(j=i;j>0;j--)
      for(k=125;k>0;k--);
}
void display(aa)
{
P0=table[aa/10%10];
dula=1;
dula=0;

P0=0xef; //显示十位
wela=1;
wela=0;
delay(2);
P0=table[aa%10];
dula=1;
dula=0;

P0=0xdf; //显示个位
wela=1;
wela=0;
delay(2);

P0=table[aa/1000%10];
dula=1;
dula=0;

P0=0xfb; //显示千位
wela=1;
wela=0;
delay(2);
P0=table[aa/100%10];
dula=1;
dula=0;

P0=0xf7; //显示百位
wela=1;
wela=0;
delay(2);

P0=table[aa/100000];
dula=1;
dula=0;

P0=0xfe; //显示十万位
wela=1;
wela=0;
delay(2);
P0=table[aa/10000%10];
dula=1;
dula=0;

P0=0xfd; //显示万位
wela=1;
wela=0;
delay(2);
}

void main()
{
while(1)
{

  display(aa);
  
  aa=32768;
  
}
}
 楼主| sdzccfx 发表于 2012-6-17 22:55 | 显示全部楼层
有知道原因的吗
冷雨寒风 发表于 2012-6-17 23:16 | 显示全部楼层
普通的C51单片机,signed int 最大数应该是 32767 ,大于 32767 就是负数了。
但是你定义的是:unsigned int 应该无此问题。
没用C51单片机机处理过long类型,不知道编译器会如何处理数据类型转换。问题可能出在这里:
像 P0=table[aa/100000]; 此类语句,你可以先定义一个中间变量,unsigned char 或者 unsigned char 类型。
例如:unsigned char temp = 0;
temp = (unsigned char)(aa/100000);//显式转换
P0=table[temp];
试一下,我也想知道结果。
 楼主| sdzccfx 发表于 2012-6-17 23:46 | 显示全部楼层
试了一下,还是不行,我用的KEIL 4.0,是不是编译器有问题?
wukunshan 发表于 2012-6-18 13:02 | 显示全部楼层
楼主的取位数处理有问题,应该这样取:
P0=table[aa%10];//个位
P0=table[aa%100/10];//十位
P0=table[aa%1000/100];//百位
P0=table[aa%10000/1000];//千位
P0=table[aa%100000/10000];//万位
:)
coody 发表于 2012-6-18 15:56 | 显示全部楼层
不要怀疑MCU,更不要怀疑编译器,先怀疑自己的程序。
 楼主| sdzccfx 发表于 2012-6-18 21:13 | 显示全部楼层
按5楼的方法试了一下,还是一样,就是超过32767 就溢出了,但是unsigned long型为什么还溢出呢?
wukunshan 发表于 2012-6-18 22:05 | 显示全部楼层
还不行?我也纳闷了。
你把unsigned long  aa 改成unsigned int aa,赋值 aa=65535试一下,如果没有问题,那就是编译器问题,然后定义为unsigned long int aa试一下。如果还有问题,那就检查你的硬件电路了。
 楼主| sdzccfx 发表于 2012-6-18 22:28 | 显示全部楼层
还不行,我安装了KEIL2.0试了一下,也不行。如果输入65535显示全是零
wukunshan 发表于 2012-6-19 09:17 | 显示全部楼层
有那么奇怪?你用时是什么单片机?换个单片机试一试。
zhaoyu2005 发表于 2012-6-19 10:07 | 显示全部楼层
你是用proteus类软件仿真还是在电路板上运行?
如果是软件仿真,那显示不正常是很常见的
 楼主| sdzccfx 发表于 2012-6-19 12:14 | 显示全部楼层
在实验板上试的,我把aa直接换成了十进制数,就会正常显示,用上变量aa就溢出,不管是unsigned int 型还是 unsigned long 型都是正常显示到32767
994920256 发表于 2012-6-19 12:17 | 显示全部楼层
因为int型变量的最大值为32767,楼主写的void display(aa)这个函数形参有问题,没有指明其类型,也就是实参和形参类型不匹配,改为void display(unsigned long aa)试一下;   
另外unsigned long  aa;这句话最好给aa初始化,赋予一个确定的值
 楼主| sdzccfx 发表于 2012-6-19 12:35 | 显示全部楼层
按照13楼的方法试了一下,终于正常了,太感谢了。不初始化aa也正常。
wukunshan 发表于 2012-6-19 13:01 | 显示全部楼层
原来如此!又学到一招:看代码,不要光看函数体,还要注意看函数形参和实参是不是匹配!
wukunshan 发表于 2012-6-19 13:12 | 显示全部楼层
楼主,void display(aa) 这样写Keil不警告吗?在keilc51里没有指明数据类型时,系统默认为int型。你这个代码错得很有意思,那么多人都看不出来,13楼兄弟,厉害。。。
hotyong 发表于 2012-6-19 13:53 | 显示全部楼层
不会警告,13楼厉害
qingjunfa01 发表于 2012-6-19 16:08 | 显示全部楼层
学习了.13楼厉害.
qingjunfa01 发表于 2012-6-19 16:09 | 显示全部楼层
学习了.13楼厉害.
qingjunfa01 发表于 2012-6-19 16:09 | 显示全部楼层
:)学习了.13楼厉害.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部