如何结束 8051 中的外部中断服务程序 (ISR)
How to end external Interrupt Service Routine (ISR) in 8051
我用 8051 的硬件中断 0 写了一个简单的 LED 闪烁代码。
按下按钮时,它会进入中断服务程序 (ISR)。执行后它应该在 main 函数中返回,但它没有出现。
这是我的C代码。任何积极的答复将不胜感激。
sbit LED = P1^0;
void delay(int ms)
{
int i;
for(i=0;i<ms;i++)
{
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x66;
TR0 = 1;
while(TF0==0);
TR0 = 0;
TF0 = 0;
}
}
void main(void)
{
P1 = 0x00;
/// P3 = 0x04;
IT0 = 1;
EX0 = 1;
EA = 1;
LED=1;
while(1)
{
LED=~LED;
delay(200);
}
return ;
}
void external0_isr() interrupt 0
{
EA=0;
LED =0 ;
delay(2000);
LED=1;
EX0=1;
EA=1;
return;
}
进入按键中断时,禁用全局中断EA=0;
这也禁用了定时器中断。因此,您的程序将在 delay(2000)
例程中的 while(TF0==0)
挂起。
我用 8051 的硬件中断 0 写了一个简单的 LED 闪烁代码。 按下按钮时,它会进入中断服务程序 (ISR)。执行后它应该在 main 函数中返回,但它没有出现。 这是我的C代码。任何积极的答复将不胜感激。
sbit LED = P1^0;
void delay(int ms)
{
int i;
for(i=0;i<ms;i++)
{
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x66;
TR0 = 1;
while(TF0==0);
TR0 = 0;
TF0 = 0;
}
}
void main(void)
{
P1 = 0x00;
/// P3 = 0x04;
IT0 = 1;
EX0 = 1;
EA = 1;
LED=1;
while(1)
{
LED=~LED;
delay(200);
}
return ;
}
void external0_isr() interrupt 0
{
EA=0;
LED =0 ;
delay(2000);
LED=1;
EX0=1;
EA=1;
return;
}
进入按键中断时,禁用全局中断EA=0;
这也禁用了定时器中断。因此,您的程序将在 delay(2000)
例程中的 while(TF0==0)
挂起。