题目:
首先将J5处的跳帽接到2~3引脚,即s5按键接到P3.2/INT0,s4按键接到P3.3/INT1。
定义一个Working()函数,使L1指示灯不断闪烁。将P3.2引脚定义成外部中断功能,按键s5按键就会产生外部中断触发信号,在中断响应函数中,点亮L8指示灯,延时一段较长的时间后熄灭。
方式一:直接在中断服务函数中延时(L8点亮时,L1可能处于熄灭状态,可能处于点亮状态)
#include "reg52.h"
sbit L1=P0^0;
sbit L8=P0^7;
/*==========和LED灯连接的锁存==========*/
void Select_HC573()
{
P2=(P2&0x1f)|0x80;
}
/*==========延时函数==========*/
void delay(unsigned int t)
{
while(t--);
while(t--);
while(t--);
}
/*==========L1指示灯不断闪烁==========*/
void Working()
{
Select_HC573();
L1=0;
delay(60000);
L1=1;
delay(60000);
}
/*==========外部中断0初始化函数==========*/
void Init_INT0()
{
IT0=1; //下降沿触发
EX0=1; //打开INT0的中断允许
EA=1; //打开总中断
}
/*==========外部中断0服务函数==========*/
void Service_INT0() interrupt 0
{
L8=0;
delay(60000);
delay(60000);
L8=1;
}
void main()
{
Init_INT0();
while(1)
{
Working();
}
}
方式二:在中断服务函数中标志变量,在外部执行延时(L8点亮时,L1处于熄灭状态)
#include "reg52.h"
sbit L1=P0^0;
sbit L8=P0^7;
/*==========和LED灯连接的锁存==========*/
void Select_HC573()
{
P2=(P2&0x1f)|0x80;
}
/*==========延时函数==========*/
void delay(unsigned int t)
{
while(t--);
while(t--);
while(t--);
}
/*==========L1指示灯不断闪烁==========*/
void Working()
{
Select_HC573();
L1=0;
delay(60000);
L1=1;
delay(60000);
}
/*==========外部中断0初始化函数==========*/
void Init_INT0()
{
IT0=1; //下降沿触发
EX0=1; //打开INT0的中断允许
EA=1; //打开总中断
}
/*==========外部中断0服务函数==========*/
unsigned char stat_int=0; //中断标志变量
void Service_INT0() interrupt 0
{
stat_int=1;
}
void LED_L8()
{
if(stat_int==1)
{
L8=0;
delay(60000);
delay(60000);
L8=1;
}
stat_int=0;
}
void main()
{
Init_INT0();
while(1)
{
Working();
LED_L8();
}
}