xxrs 发表于 2022-11-11 23:58

两个IO口共用一个中断处理函数

这个是按键初始化的函数:
#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_TypeDefGPIO_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.\r\n");

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

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

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

}


现在发现的现象是:当KEY1键按下时,LED1状态有时翻转,有时不翻转。当KEY5按键按下时,LED1状态翻转

chuxh 发表于 2022-11-12 09:28

应该可以的 判断是哪个io口就可以啊

renyaq 发表于 2022-11-12 09:31

进入中断后可以判断io口的标志位就知道是哪个了

dengdc 发表于 2022-11-12 09:33

楼上的正解

xxrs 发表于 2022-11-12 09:35

请问根据什么可以判断是那个IO口?

stly 发表于 2022-11-12 09:38

通过中断标志判断是哪个GPIO产生中断

xxrs 发表于 2022-11-12 09:39

STM8没有中断标志位

dingy 发表于 2022-11-12 09:41

STM8没有中断标志位

dengdc 发表于 2022-11-12 09:43

怎么可能呢,我还没有发现没有的

xxrs 发表于 2022-11-12 09:46

据我了解到的,我是共用中断2线函数的,有Externalinterruptstatusregister1(EXTI_SR1)这个寄存器。但是这只能判断是哪个中断线发生中断,没有具体到哪个IO口。

dengdc 发表于 2022-11-12 09:49

去看相关的寄存器就明白了

zhanghqi 发表于 2022-11-12 09:52

那我就不知道了 我记得stm32是有的

xxrs 发表于 2022-11-12 09:53

判断一下io的按下电平

dengdc 发表于 2022-11-12 09:55

判断2个IO引脚电平来处理

heweibig 发表于 2022-11-12 09:58

没有去抖动就去搞LED了,其实LED已经被搞很多次了,而且次数随机,所以最终状态不确定。

jiaxw 发表于 2022-11-12 10:00


判断的有问题吧

zhanghqi 发表于 2022-11-12 10:02


应该是可以的

yszong 发表于 2022-11-12 10:04

可以精确到bit啊

wenfen 发表于 2022-11-12 10:06

看来对stm8不太了解啊

中国龙芯CDX 发表于 2022-11-12 11:44

STM8中断寄存器里面有相关数据位,可以再确认一下
页: [1] 2
查看完整版本: 两个IO口共用一个中断处理函数