初级会员

- 积分
- 119
- 金钱
- 119
- 注册时间
- 2015-8-18
- 在线时间
- 17 小时
|
1金钱
本帖最后由 kingpage 于 2016-2-19 15:22 编辑
想请教一下外部中断实验,在EXTI_Init方法中,对Key0设置了下降沿触发,代码为:[mw_shl_code=c,true]Ex_Nvic_Config(GPIO_C,5,FTIR)[/mw_shl_code]
而在其中断处理函数中,代码为:
[mw_shl_code=c,true]void EXTI9_5_IRQHandler(void){
delay_ms(10);//消抖
if(KEY0==0){//按下KEY0键
LED0=!LED0;//改变LED0状态
}
EXTI->PR=1<<5;//清除LINE5上的中断标志位
}[/mw_shl_code]
这样按键操作正常地实现了按一下KEY0,LED0变暗,再按一下LED0就变亮。
但如果把判断if(KEY0==0)语句取消掉,代码为:
[mw_shl_code=c,true]void EXTI9_5_IRQHandler(void){
delay_ms(10);//消抖
LED0=!LED0;//改变LED0状态
EXTI->PR=1<<5;//清除LINE5上的中断标志位
}[/mw_shl_code]
此时的按键操作就偶尔能实现按一下KEY0,LED0变暗,再按一下LED0就变亮。但偶尔也会变成按一下KEY0,LED0变暗,再按一下LED0变亮,但此时在松开KEY0时,LED0又变成了暗的状态。经用串口向PC输出一些调试信息发现,此种情况是因为KEY0在按下和松开时,void EXTI9_5_IRQHandler中断处理函数被触发了两次引起的。
但在EXTI_Init函数中就已经对KEY0的中断处理函数设置了下降沿触发,那么能产生下降沿触发的,按道理也只有在按下KEY0操作时才会产生下降沿,应该不需要再多做一次判断if(KEY0==0)才对LED0状态进行改变也能正常实现按键操作的,为什么在KEY0松开时也会产生一次下降沿触发,麻烦请大家解释一下,为什么要加这个判断?
|
最佳答案
查看完整内容[请看2#楼]
按键按下时会有机械抖动,会有电平的数次波动。0时刻下降沿触发,很可能因为机械抖动在0+10.01ms引脚电平恢复高电平,在10.02ms又成低电平。KEY==0这句只是要确定按键还是按下的
|