写了这么一个东西在8位数码管上滚动显示数字0 - 9,但是发现运行一段时间后就开始显示乱七八糟的东西了。
#include<reg52.h>
sbit LATCH1 = P2 ^ 2; //段锁存
sbit LATCH2 = P2 ^ 3; //位锁存
char code digit[8] = {0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};//0 - 7 位
char code num[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数字 0 - 9
void delay(unsigned int i);
void main()
{
char a = 0;
while (1)
{
P1 = digit[a % 8];
LATCH2 = 1;
LATCH2 = 0;
P1 = num[a % 10];
LATCH1 = 1;
LATCH1 = 0;
delay(5000);
}
}
void delay(unsigned int i)
{
while(i--);
}
于是想可能是那个变量a超过255溢出后出错(但是溢出了为什么会影响这个程序?难道a%10还能得到比9大的数?或者a%8还能得到比7大的数?)
所以还是加了句防止溢出的判断
while (1)
{
P1 = digit[a % 8];
LATCH2 = 1;
LATCH2 = 0;
P1 = num[a % 10];
LATCH1 = 1;
LATCH1 = 0;
a == 255 ? a = 0 : a++;//这里防止a溢出
delay(5000);
}
但是发现不管用啊?当a等于255时,他还是会去加1,然后a就还是会溢出,cy位会置为1,仿真和实际单片机上都测试了,都是这个效果,a都会溢出,过一段时间就开始显示乱七八糟的东西。
然后感觉可能是那个?表达式有问题,于是干脆用if来
if (a == 255)
{
a = 0;
}else
{
a++;
}
但还是没有解决问题。。。a到了255还是去加1。。。
大神求解啊。。小弟初学单片机,每天遇到各种莫名其妙的错误。。
51单片机 C/C++
------解决方案--------------------
char型数据范围是 -128~127啊,unsigned char 才是0~255
------解决方案--------------------
一个是LS提到的数据类型问题,一个是就算你的a是无符合号的char,怎么加,也不会超过255
不用做判断就可以了.反正不会溢出的
对数据类型的基础,LZ还得加强