第16集 IO中断
1、外部中断与IO中断区别
外部中断适用用单此信号,检测信号上升沿或下降沿。
IO口中断适用于持续进入中断信号,检测信号为高电平或低电平,如按键一直按下信号。
2、什么是IO口中断
3、实例-简易中央门禁控制系统
1).用8个按键代表每个门的门锁开关,8个LED作为每个门的工作状态,点亮表示门已经打开,熄灭表示门打开。
2).如遇突发火灾,按下应急按钮立刻打开所有门锁,方便人逃生。
3).按下应急按钮后,所有按钮门锁不能上锁
4).松开应急按钮后,倒计时5秒后恢复之前的状态,并可以操作门锁,
简易中央门禁控制系统部分程序
u16 Tme_countDown =0;
void Time0_init (void) //1毫秒,24MHZ, 12分频
{
AUXR &= 0X7F;
TMOD &= 0XF0;
TL0 = 0X30;
TH0 = 0XF8;
TF0 =0;
TR0 = 1;
ET0 = 1;
IP = 0X02; //设置为最高优先集
IPH =0X02;
}
void P3Exit_Init(void)
{
P3IM0 = 0X00;
P3IM1 = 0XFF; //低电平中断
P3INTE = 0X20; //P35中断 0010 0000
}
void main()
{
u8 LOCK_State =0xff;//门锁工作状态
u8 KEY_NUM = 0; // 保存矩阵按键的键码
u8 KEY_Str =0; //表示当前输入几个密码位
sys_init () ;
usb_init () ;
Timer0_Init ();
P3Exit_Init();
EA = 1;
LED =LOCK_State ;
while(1)
{
if(DeviceState !=DEVSTATE_CONFIGURED)
continue;
if( bUsbOutReady )
{
usb_OUT_done();
}
if(TIM_10MS_Flag==1 )
{
TIM_10MS_Flag=0;
if( Tme_countDown ==0)
{
KEY_NUM = MateixKEY_Read( );
BEEP_RUN();
if(KEY_NUM>0 )
{
BEEP_ON(2); //蜂鸣器2ms
LOCK_State ^= (1<< KEY_NUM-1) //获取当前第几个按键按下,(1-8)-1
}
LED = LOCK_State;
SEG0 = 20;// 熄灭数码管
}
else
{
Tme_countDown--;
SEG0 = Tme_countDown/100+1; // 500/100 499
}
}
}
}
void P3Exit)_Isr(void) interrupt 40
{
u8 intf ;
intf = P3INIF ;//读取中断标志位
if( intf)
{
P3INIF =0;
if(intf &0x20) //P35按键按下 0010 0000
{
LED =0X00; //打开所有门锁
SEG0 = 5 ; //数码管持续显示5
Tme_countDown = 500;
}
}
}
|