今天在写单片机数码管中断流水显示时,发现一个比较有意思的事情。
在keil5中编程写了两个外部中断,优先级设置的PX1>PX0;
在两个中断中采用的都是for循环显示;
中断EX0使数码管由低位到高位流水显示1~8,
中断EX1使数码管由高位到低位流水显示8~1,
中断代码如下:
void inputi() interrupt 0 //中断EX0,外部中断0
{
uchar x=0xfe;
EX0=0;
for(n=1;n<9;n++) //数码管由低位到高位流水显示1~8
{
P2=x;
x=_crol_(x,1);
P0=s1[n];
delay(500);
}
EX0=1;
}
void inputo() interrupt 2 //中断EX1,外部中断1
{
uchar m=0x7f;
EX1=0;
for(n=8;n>0;n--) //数码管由高位到低位流水显示8~1
{
P2=m;
P0=s1[n];
m=_cror_(m,1);
delay(50);
}
EX1=1;
}
经过proteus仿真后,发现在中断0执行时,中断1打断后再次回到中断0时,数码管不在按照应有的顺序点亮,数码管而是接着中断前的位置重新从1显示到8(等于说是for循环被重新执行了);
解决方法如下:
void inputi() interrupt 0
{
uchar x=0xfe;
uint p=1;
EX0=0;
while(1) //数码管由低位到高位流水显示1~8
{
P2=x;
x=_crol_(x,1);
P0=s1[p];
p++;
delay(500);
if(p==9)
{
goto error;
}
}
error:
EX0=1;
}
void inputo() interrupt 2
{
uchar m=0x7f;
EX1=0;
for(n=8;n>0;n--) //数码管由高位到低位流水显示8~1
{
P2=m;
P0=s1[n];
m=_cror_(m,1);
delay(50);
}
EX1=1;
}
利用 while 循环加 goto 语句代替 for 循环,proteus仿真后发现,没什么问题;出现这种问题,我也没仔细去找具体什么原因,有大神了解的欢迎评论区留言。