STM8L两个IO口共用一个中断处理函数时出现混乱

2019-07-14 15:23发布

这个是按键初始化的函数:
#include "KEY.h"
/*按键初始化*/
void KEY_Init(void)
{
    GPIO_Init(KEY1_PORT, KEY1|KEY2|KEY3|KEY4|KEY5, GPIO_Mode_In_PU_IT);  //中断方式
   GPIO_Init(KEY5_PORT, KEY5, GPIO_Mode_In_PU_IT);  //中断方式
   EXti_SetPinSensitivity(EXTI_Pin_2|EXTI_Pin_3|EXTI_Pin_4|EXTI_Pin_5, EXTI_Trigger_Falling_Low );   //配置外部中断触发方式
}
bool KEY_Down(GPIO_TypeDef* GPIOx,GPIO_Pin_TypeDef  GPIO_Pin)
{                        
     /*检测是否有按键按下 */
     if( GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 0 )
     {           
         delay_ms(5);   // 延时消抖        
         if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==0)  
         {         
             while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==0);   //等待按键释放
            return true; //如果有键盘按下,就返回真值,否则返回假值
        }
     }
     return false;
}
下面是中断2线的处理函数:
INTERRUPT_HANDLER(EXTI2_IRQHandler,10)
{
     /* In order to detect unexpected events during development,
        it is recommended to set a breakpoint on the following instruction.
     */
   if(KEY_Down(GPIOA,KEY1) == 0 )
     {
       GPIO_ToggleBits(GPIOC, GPIO_Pin_5);//LED1
       printf ("01. ");

       EXTI_ClearITPendingBit(EXTI_IT_Pin2); //清除中断。
    }

   if(KEY_Down(GPIOD,KEY5) == 0 )
     {
       GPIO_ToggleBits(GPIOD, GPIO_Pin_4);//LED5
       printf ("05. ");

       EXTI_ClearITPendingBit(EXTI_IT_Pin2); //清除中断。
    }
}
现在发现的现象是:当KEY1键按下时,LED1状态有时翻转,有时不翻转。当KEY5按键按下时,LED1状态翻转。还是没有找到问题所在,求好心人解答下,感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
hucc
1楼-- · 2019-07-15 22:10
 精彩回答 2  元偷偷看……
fgfFsG
2楼-- · 2019-07-16 00:37
楼主解决问题了吗
WU_0ba
3楼-- · 2019-07-16 02:09
最近也在学习这一类知识,好多不懂,来这里学习

一周热门 更多>