1秒加一个数字,求指点?中断里面该怎么写?
#define uchar unsigned char
#define uint unsigned int
uchar code S[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar x;
uint j=0;
delay1ms(uint i)//延时1毫秒
{
uchar t;
while(i--)
{
for(t=0;t<115;t++);
}
}
display(uchar x)//数码管显示
{
P2=0xef;
P0=S[x/10];
delay1ms(5);
P2=0xdf;
P0=S[x%10];
delay1ms(5);
P2=0xff;
}
void main()
{
TMOD=0x01;
EA=1;
IT0=0;
ET0=1;
TR0=1;
TH0=0x4c;
TL0=0x00;
while(1) //20个50毫秒
{
do
{
TH0=0x4c;
TL0=0x00;
j=j+1;
}while(j<20);
j=0;
display(x);
x++;
}
}
void T0zhongduan() interrupt 1
{
}
.....
..... //以上是你原来的程序
bit _1_second_flag = 0;
main()
{
....
.... //这几句是你原来的
while(1)
{
if(_1_second_flag)
{
_1_second_flag = 0;
display(x++);
}
}
}
void T0zhongduan() interrupt 1
{
if(++j == 20)
{
j = 0;
_1_second_flag = 1; //1秒
}
TH0=0x4c;
TL0=0x00;
}
基本上行了,但是为什么两个数码管亮了1秒又灭1秒啊?哪里出错了?
你的x变量都没有限制范围,x++是从0~255循环, S[x/10]超出数组范围了
x变量没有限制范围,x从0~255循环,S[x/10]超出数组范围
.....
..... //以上是你原来的程序
bit _1_second_flag = 0;
main()
{
....
.... //这几句是你原来的
while(1)
{
display(x);
if(_1_second_flag)
{
_1_second_flag = 0;
if(++x >= 100)
x = 0;
}
}
}
void T0zhongduan() interrupt 1
{
if(++j == 20)
{
j = 0;
_1_second_flag = 1; //1秒
}
TH0=0x4c;
TL0=0x00;
}
OK了非常感谢。