请问各位大佬一个外中断异常多次触发的问题 void EXTI4_IRQHandler() { static int x = 0; delay_ms(10); if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)//判断按键是否按下 { EXTI_ClearITPendingBit(EXTI_Line4); x++; GPIO_SetBits(GPIOF,GPIO_Pin_8);//设置蜂鸣器发声 delay_ms(200); GPIO_ResetBits(GPIOF,GPIO_Pin_8); if(x > 1) { x = 0; GPIO_ResetBits(GPIOF,GPIO_Pin_9);//控制灯闪烁 delay_ms(200); } GPIO_SetBits(GPIOF,GPIO_Pin_9); } } 可是把if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)//判断按键是否按下 换成 if(EXTI_GetITStatus(EXTI_Line4)!=RESET)//判断某个线上的中断是否发生 就会判断出不定时触发了两次,当按键设置成下降沿触发时 EXTI_InitStruct.EXTI_Line = EXTI_Line4; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitStruct); |
评分
查看全部评分
改了,不是延时的问题
2、楼主在进入中断函数后并未立即清中断标志位,而是先来给10ms延时,你可知道在这延时期间按键的抖动已经又触发了多少次外部中断了?
评分
查看全部评分
那按键检测的最佳写法应是怎样?还请大佬们明示
1、清中断标志位
2、禁止EXTI中断
3、点亮LED
4、使能EXTI中断
熄灭LED放在定时中断里执行。
评分
查看全部评分
谢谢大佬,也就是说中断里只放标志位了
检测按键,可以用定时扫描的方法。
给你个鼠标按键按下、弹起,上下双沿检测程序,单次响应,逻辑稍微复杂一点。一般用的都比这简单。
MsKey.LDOWN7,MsKey.LUP7,MsKey.RDOWN7, MsKey.RUP7,4个标志位在主程序中处理完才清除。
评分
查看全部评分
评分
查看全部评分