STM32F103基于HAL库使用SysTick_Handler实现稳定读取按键按下动作(包含消抖算法)
- SysTick_Handler介绍
- 程序介绍
今天我给大家分享一个基于
SysTick_Handler
中断实现的按键扫描
SysTick_Handler介绍
SysTick_Handler
是HAL库配置的stmf103芯片里运行时会每隔1ms被调用的一个回调函数,所以我在这个回调函数里面写了按键读取的程序Key_Scan();
,这个函数每隔1ms会在回调函数里面被调用一次
按键接法是这样的,自然状态下引脚读取时高电平,按键按下时引脚读取时低电平
程序介绍
程序流程图如图所示:
这个程序判断按键按下需要2个条件:
- 按键持续按下时间超过32ms
- 按键在非按下状态
那这个程序是怎么实现消抖的呢?很简单,按键弹起的时候一直都是高电平,程序需要读到连续的32个毫秒的高电平才会判断为按键按下,中间哪怕有一个低电平的抖动,sw1Count
计数器都会清零,重新开始32毫秒的计数,因此实现了消抖,而且程序在判断到了按键按下之后pushFlag1
置1,这样在按键持续按下的时候就不会识别为多个按键按下的操作。
uint8_t sw1Count;
uint8_t pushFlag1;
void Key_Scan(void)
{
if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET )
{
sw1Count++; //SW1键按下,计数sw1Count加1
if(sw1Count>=32) //1MS中断一次,sw1Count大于等于32,即按键已按下32ms
{
if(pushFlag1==0) //判断有没有重按键,1为有,0为没有
{
swState1=1; //设置按键标志 HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,1);
sw1Count=0;
pushFlag1=1; //设置重按键标志
}
else
sw1Count=0;
}
else
swState1=0;
}
else //无按键按下
{
sw1Count=0; //清零sw1Count
swState1=0; //清除按键标志
pushFlag1=0; //清除重按键标志
}
}
一键三连,谢谢铁汁们=