怪异啊,怪异啊,不知道哪里出来问题从0加到99时后就变回了00再加到99,不停重复00加到99,不知道为什么会突破
怪异啊,怪异啊,不知道哪里出来问题
从0加到99时后就变回了00再加到99,不停重复00加到99,不知道为什么会突破100的额?求解啊。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar t,z,qian,bai,shi,ge;
uint i;
uchar code dulama[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void init();
void delay(uint z);
void display_1();
void display_2(uchar shi,uchar ge);
void display_3(uchar bai,uchar shi,uchar ge);
void display_4(uchar qian,uchar bai,uchar shi,uchar ge);
void main()
{
init();
while(1)
{
while(i<10)
{display_1();}
while(10<=i<100)
{display_2(shi,ge);}
while(100<=i<1000)
{display_3(bai,shi,ge);}
while(1000<=i<10000)
{display_4(qian,bai,shi,ge);}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==10)
{
t=0;
i++;
if(i==10000)
{i=0;}
}
if(10<=i<100)
{
shi=i/10;
ge=i%10;
}
if(100<=i<1000)
{
bai=i/100;
shi=i%100/10;
ge=i%10;
}
if(1000<=i<10000)
{
qian=i/1000;
bai=i%1000/100;
shi=i%1000%100/10;
ge=i%10;
}
}
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display_1()
{
dula=1;
P0=dulama[i];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
}
void display_2(uchar shi,uchar ge)
{
dula=1;
P0=dulama[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=dulama[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
}
void display_3(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=dulama[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=dulama[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=dulama[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
}
void display_4(uchar qian,uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=dulama[qian];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=dulama[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=dulama[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
dula=1;
P0=dulama[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(1);
}
[最优解释]
噗,这种错误我最近一周内也犯过,木有办法,只能怪自己大意了。
[其他解释]看不懂 一堆拼音字母
------其他解决方案--------------------
程序上没看出什么,你仿真看下过了99后i值是多少
[其他解释]好乱,其实显示程序只要一个就可以了。。。。。
个十百千都可以用一个变量表示的。。。。
LZ可以看下书。
假设变量是i。
各位是i%10
十位是i/10%10
百位是i/100%10.
就可以了。。。
然后只要在中断中不断的加i,
然后当i=100的时候,使i=0就可以了。。。。
[其他解释]我在仿真调试那里观察i,qian,bai,shi,ge这几个变量,而qian,bai,shi,ge合起来就是i值,理应应该没问题才对喔
[其他解释]#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar t,z,qian,bai,shi,ge;
uint i;
uchar code dulama[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数组元素依次是0-9
void init();
void delay(uint z);
void display_1();
void display_2(uchar shi,uchar ge);
void display_3(uchar bai,uchar shi,uchar ge);
void display_4(uchar qian,uchar bai,uchar shi,uchar ge);
void main()
{
init();
while(1)
{
while(i<10) //显示一位数
{display_1();}
while(10<=i<100)//显示两位数
{display_2(shi,ge);}
while(100<=i<1000)//显示三位数
{display_3(bai,shi,ge);}
while(1000<=i<10000)//显示四位数
{display_4(qian,bai,shi,ge);}
}
}
void timer0() interrupt 1 //定时器
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==10)//隔一定时间,使i自加1
{
t=0;
i++;
if(i==10000)
{i=0;}
}
if(10<=i<100)//两位数表示方法
{
shi=i/10;
ge=i%10;
}
if(100<=i<1000)//三位数表示方法
{
bai=i/100;
shi=i%100/10;
ge=i%10;
}
if(1000<=i<10000)//四位数表示方法
{
qian=i/1000;
bai=i%1000/100;
shi=i%1000%100/10;
ge=i%10;
}
}
void init() //初始化
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(uint z)//延时作用
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display_1()//显示一位数
{
dula=1;//显示个位
P0=dulama[i];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
}
void display_2(uchar shi,uchar ge)//显示两位数
{
dula=1;//显示十位
P0=dulama[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;//显示个位
P0=dulama[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
}
void display_3(uchar bai,uchar shi,uchar ge) //显示三位数
{
dula=1;//显示百位
P0=dulama[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;//显示十位
P0=dulama[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;//显示个位
P0=dulama[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
}
void display_4(uchar qian,uchar bai,uchar shi,uchar ge)//显示四位数
{
dula=1;//显示千位
P0=dulama[qian];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;//显示百位
P0=dulama[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;//显示十位
P0=dulama[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
dula=1;//显示个位
P0=dulama[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(1);
}
[其他解释]
不好意思额,我加上注释看看,谢谢。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar t,z,qian,bai,shi,ge;
uint i;
uchar code dulama[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数组元素依次是0-9
void init();
void delay(uint z);
void display_1();
void display_2(uchar shi,uchar ge);
void display_3(uchar bai,uchar shi,uchar ge);
void display_4(uchar qian,uchar bai,uchar shi,uchar ge);
void main()
{
init();
while(1)
{
while(i<10) //显示一位数
{display_1();}
while(10<=i<100)//显示两位数
{display_2(shi,ge);}
while(100<=i<1000)//显示三位数
{display_3(bai,shi,ge);}
while(1000<=i<10000)//显示四位数
{display_4(qian,bai,shi,ge);}
}
}
void timer0() interrupt 1 //定时器
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==10)//隔一定时间,使i自加1
{
t=0;
i++;
if(i==10000)
{i=0;}
}
if(10<=i<100)//两位数表示方法
{
shi=i/10;
ge=i%10;
}
if(100<=i<1000)//三位数表示方法
{
bai=i/100;
shi=i%100/10;
ge=i%10;
}
if(1000<=i<10000)//四位数表示方法
{
qian=i/1000;
bai=i%1000/100;
shi=i%1000%100/10;
ge=i%10;
}
}
void init() //初始化
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(uint z)//延时作用
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display_1()//显示一位数
{
dula=1;//显示个位
P0=dulama[i];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
}
void display_2(uchar shi,uchar ge)//显示两位数
{
dula=1;//显示十位
P0=dulama[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;//显示个位
P0=dulama[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
}
void display_3(uchar bai,uchar shi,uchar ge) //显示三位数
{
dula=1;//显示百位
P0=dulama[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;//显示十位
P0=dulama[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;//显示个位
P0=dulama[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
}
void display_4(uchar qian,uchar bai,uchar shi,uchar ge)//显示四位数
{
dula=1;//显示千位
P0=dulama[qian];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;//显示百位
P0=dulama[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;//显示十位
P0=dulama[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
dula=1;//显示个位
P0=dulama[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(1);
}
[其他解释]
//由于不能连续恢复三次,就用另一个号恢复
我试过将每个display()显示都分开显示,发现无论是一位数,两位数,三位数,还是四位数都可以动态显示出来,那应该定时那里应该没问题吧?那会不会是程序循环这里出问题了?但是我就这样看好像没什么问题额。。。。。
void main()
{
init();
while(1)
{
while(i<10)
{display_1();}
while(10<=i<100)
{display_2(shi,ge);}
while(100<=i<1000)
{display_3(bai,shi,ge);}
while(1000<=i<10000)
{display_4(qian,bai,shi,ge);}
}
}
[其他解释]volatile uchar qian,bai,shi,ge
[其他解释]额?请问什么意思啊?
[其他解释]自己搜C语言volatile关键字的功能。我怀疑你这个问题是别的什么地方造成的。比如你中断里头会不会对不该赋值的变量赋值了导致程序异常。有时候程序结构混乱很容易出现一些全局变量莫名其妙被修改的事,跟volatile没有太大关系。
[其他解释]因为你中断中使用了他们,
而主程序也使用了他们,
没有volatile关键字,编译器会优化掉,重读这些值的代码。
[其他解释]我解决了,其实是我主循环里面的大小关系的表达不正确造成的
[其他解释]我解决了,其实是我主循环里面的大小关系的表达不正确造成的
[其他解释]跟着各位学习了~~