51单片机中断被打断后,for循环中的变量重置问题

本文探讨了一位开发者在使用Keil5编写单片机数码管流水显示时遇到的问题,通过对比for和while循环,揭示了中断优先级与循环结构对程序执行的影响。作者分享了利用while循环解决中断重入导致的数码管显示问题的方法,并期待读者讨论可能的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在写单片机数码管中断流水显示时,发现一个比较有意思的事情。

在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仿真后发现,没什么问题;出现这种问题,我也没仔细去找具体什么原因,有大神了解的欢迎评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值