INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5) { if(GPIO_ReadInputPin(GPIOC , GPIO_PIN_7) == RESET) //判断是否是PC->,被按下,即KEY2,也可以说这个判断是PD端口区分是哪个引脚被按下的主要标志 { } void ALLKeyInit() { //KEY1_Init //GPD->PIN2 设置为输入模式 带上拉电阻输入 全球通外部中断 GPIO_Init(GPIOD , GPIO_PIN_2 , GPIO_MODE_IN_PU_IT); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA , EXTI_SENSITIVITY_FALL_ONLY); //PA端口为下降沿触发中断 //KEY2_Init //GPC->PIN7 设置为输入模式 带上拉电阻输入 禁止外部中断 GPIO_Init(GPIOC , GPIO_PIN_7 , GPIO_MODE_IN_PU_IT); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD , EXTI_SENSITIVITY_FALL_ONLY); //PD端口为下降沿触发中断 //KEY3_Init //GPC->PIN6设置为输入模式 带上拉电阻输入 禁止外部中断 GPIO_Init(GPIOC , GPIO_PIN_6 , GPIO_MODE_IN_PU_IT); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC , EXTI_SENSITIVITY_FALL_ONLY); //PC端口为下降沿触发中断 } |
程序消抖的话,建议用在定时器多次连续检测IO状态的方式,不要写成软件循环死等。
用IO中断检测的话,在中断服务函数中多次循环检测IO状态,但循环延时不要太长。
怎么做到长按一个按键触发
那就得循环多次检测,比如一个检测周期是10ms,连续检测到相同的状态5次以上为消抖;相同状态大于50次,为长按键。