本实现方法为边沿触发方式:定义一个标志位,中断处理程序只负责处理该标志位,主函数负责处理主要中断任务与标志位。具体实现过程如下所示:
①:将标志位清零。
//定义全局变量用于实现消抖
unsigned int flag_isr_eint2 = 0;
② 在主函数内使用switch case实现对不同按键状态的判断与功能。标志位flag_isr_eint2 为外部中断2标志位,为0表示按键还没按下,为1表示按键已经按下,为2表示正在等待按键弹起,为3表示按键已经弹起。各部分功能如下所示:
switch(flag_isr_eint2)
{
case 0: break;
case 1:
{
//实际中断处理的部分
printf("isr_eint2! \r\n");
//消抖部分
delay20ms();
rEXT_INT_0_CON &= ~(0xF<<8); // bit8~bit11全部清零
rEXT_INT_0_CON |= (3<<8); //设置EXT2为上升沿触发,等待按键弹起
flag_isr_eint2 = 2;
break;
}
case 2: break; //等待按键弹起
case 3: //表示按键已经弹起
{
delay20ms();
rEXT_INT_0_CON &= ~(0xF<<8); // bit8~bit11全部清零
rEXT_INT_0_CON |= (2<<8); //设置EXT2为下降沿触发,等待再次按键按下
flag_isr_eint2 = 0;
}
default : break;
}
③ 在中断处理程序中依次处理该标志位。
// 中断标志位置操作,用于消抖
switch(flag_isr_eint2)
{
case 0:
{
flag_isr_eint2 = 1; break; //执行中断标志
}
case 1: break; //等待弹起
case 2:
{
flag_isr_eint2 = 3; break; //标志已经弹起
}
default : break;
}
中间使用延时20ms不是很符合实时性的要求,读者可尝试改用定时器方式实现。