打印

为什么大于32767就显示乱码

[复制链接]
3748|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,是不是编译器有问题?

使用特权

评论回复
5
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];//万位
:)

使用特权

评论回复
6
coody| | 2012-6-18 15:56 | 只看该作者
不要怀疑MCU,更不要怀疑编译器,先怀疑自己的程序。

使用特权

评论回复
7
sdzccfx|  楼主 | 2012-6-18 21:13 | 只看该作者
按5楼的方法试了一下,还是一样,就是超过32767 就溢出了,但是unsigned long型为什么还溢出呢?

使用特权

评论回复
8
wukunshan| | 2012-6-18 22:05 | 只看该作者
还不行?我也纳闷了。
你把unsigned long  aa 改成unsigned int aa,赋值 aa=65535试一下,如果没有问题,那就是编译器问题,然后定义为unsigned long int aa试一下。如果还有问题,那就检查你的硬件电路了。

使用特权

评论回复
9
sdzccfx|  楼主 | 2012-6-18 22:28 | 只看该作者
还不行,我安装了KEIL2.0试了一下,也不行。如果输入65535显示全是零

使用特权

评论回复
10
wukunshan| | 2012-6-19 09:17 | 只看该作者
有那么奇怪?你用时是什么单片机?换个单片机试一试。

使用特权

评论回复
11
zhaoyu2005| | 2012-6-19 10:07 | 只看该作者
你是用proteus类软件仿真还是在电路板上运行?
如果是软件仿真,那显示不正常是很常见的

使用特权

评论回复
12
sdzccfx|  楼主 | 2012-6-19 12:14 | 只看该作者
在实验板上试的,我把aa直接换成了十进制数,就会正常显示,用上变量aa就溢出,不管是unsigned int 型还是 unsigned long 型都是正常显示到32767

使用特权

评论回复
13
994920256| | 2012-6-19 12:17 | 只看该作者
因为int型变量的最大值为32767,楼主写的void display(aa)这个函数形参有问题,没有指明其类型,也就是实参和形参类型不匹配,改为void display(unsigned long aa)试一下;   
另外unsigned long  aa;这句话最好给aa初始化,赋予一个确定的值

使用特权

评论回复
14
sdzccfx|  楼主 | 2012-6-19 12:35 | 只看该作者
按照13楼的方法试了一下,终于正常了,太感谢了。不初始化aa也正常。

使用特权

评论回复
15
wukunshan| | 2012-6-19 13:01 | 只看该作者
原来如此!又学到一招:看代码,不要光看函数体,还要注意看函数形参和实参是不是匹配!

使用特权

评论回复
16
wukunshan| | 2012-6-19 13:12 | 只看该作者
楼主,void display(aa) 这样写Keil不警告吗?在keilc51里没有指明数据类型时,系统默认为int型。你这个代码错得很有意思,那么多人都看不出来,13楼兄弟,厉害。。。

使用特权

评论回复
17
hotyong| | 2012-6-19 13:53 | 只看该作者
不会警告,13楼厉害

使用特权

评论回复
18
qingjunfa01| | 2012-6-19 16:08 | 只看该作者
学习了.13楼厉害.

使用特权

评论回复
19
qingjunfa01| | 2012-6-19 16:09 | 只看该作者
学习了.13楼厉害.

使用特权

评论回复
20
qingjunfa01| | 2012-6-19 16:09 | 只看该作者
:)学习了.13楼厉害.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝