STM32按键长按、短按实现不同功能函数
这里的函数接口只需要输入GIPOX、GPIO_Pin_X(这里X是根据你的按键的硬件电路来的),我这里长按是亮红灯,短按亮绿灯,在使用过程中,可以替换为其他功能,比如长按翻下一页,短按翻上一页等功能。
这段代码适用于只有一个按键,但是却可以实现两个功能的需求。
/*
* 函数名:Key_Scan
* 描述 :检测是长按or短按函数,长按执行LED_RED函数,短按执行LED_GREEN
* 输入 :GPIOx:x 可以是 A,B,C,D或者 E
* GPIO_Pin:待读取的端口位
* 输出 :KEY_OFF(没按下按键)、KEY_ON(按下按键)
*/
void Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
/*检测是否有按键按下 */
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )
{
Delay_ms(1000);
if (GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)
{
while (GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON) LED_RED; }
else { LED_GREEN;}
}
}
原理:查询方式进入按键检测函数,只有按下按键了,才能进入本函数,1秒后判断按键是否还是按下的状态,如果是判定为长按,如果不是判定为短按。这里的1秒时间,是我随意设定的,可以根据实际需求调整。
注意:查询方式扫描按键值是有弊端的,只有按下去按键时,CPU刚好处理到这里时,才能进入到这个函数。在实际使用中,可以将这个函数放到按键的中断处理函数。这样就完美了,可以按下去立刻执行按键函数,立刻判断是否为长按。(tips:如果用了滴答定时器进行毫秒延时,需要把滴答定时器的延时优先级调至最高即可,加入这句话到mian即可:NVIC_SetPriority (SysTick_IRQn, 1;)