这节小蜜蜂老师讲了两个办法,一个是将中断后要执行的命令放在中断服务函数里,一个是设置一个状态值state初始化为0,当出现中断时,state 值变为1,执行相应的命令。
第二种方法的部分代码如下:
void ServiceINT0() interrupt 0//中断服务函数
{
state=1;
}
void LEDINT()
{
if(state==1)
{
L8=0;
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8=1;
state=0;
}
}
void main()
{
init_INT0();
while(1)
{
working();
LEDINT();
}
}
但是在实际的应用中,发现这种方法只能在出现中断时,改变state的值,然后继续执行原命令(闪烁L1),在执行完后再点亮L8。
同时,按照中断的原理来看,L8点亮的时候可能出现在L1亮的时候也可能出现在L1熄灭的时候,但如果采用第二种设置状态值的方法,就只会在一种情况下点亮L8,具体情况只需要看working()函数里L1最后的状态即可。
这是因为,中断服务函数中的即为中断后需要执行的命令,这个方法运行时,中断后执行的命令就是将状态值state变为1,变完了又去执行原操作闪烁L1,等到working函数执行完了,接着执行主函数中排在working函数后面的LEDINT函数。
虽然小蜜蜂老师说中断服务函数最好简单点,但为了确保程序的正确性,还是采用第一种将中断后要执行的命令直接放入到中断服务函数中比较稳妥。
#include <REGX52.H>
sbit L1=P0^0;
sbit L8=P0^7;
void SELECT_HC138(unsigned char n)
{
switch(n)
{
case 4:
P2=(P2&0x1f)|0x80;
break;
case 5:
P2=(P2&0x1f)|0xa0;
break;
case 6:
P2=(P2&0x1f)|0xc0;
break;
case 7:
P2=(P2&0x1f)|0xe0;
break;
}
}
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
void working()
{
SELECT_HC138(4);
L1=0;
Delay(60000);
L1=1;
Delay(60000);
}
//==========================
void init_INT0()//初始化中断
{
IT0=1;//外部中断触发标志
EX0=1;
EA=1;
}
void ServiceINT0() interrupt 0//中断服务函数
{
L8=0;
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8=1;
}
void main()
{
init_INT0();
while(1)
{
working();
}
}