因为通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。

消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响。按键的消抖,可用硬件或软件两种方法,在实际的设计中,为了节省硬件成本,大多数情况会选择使用软件消抖。
延时消抖
软件消抖,即检测出按键闭合后执行一个延时程序,5ms~10ms 的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给 5ms~10ms 的延时,待后沿抖动消失后才能转入该键的处理程序。
以前常用的消抖算法往往就是:判断按下->延时->再次判断是否按下->是,执行/否,退出。
最简单的消抖原理,就是当检测到按键状态变化后,先等待一个 10ms 左右的延时时间,让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同,就可以确认按键已经稳定的动作了。
//按键处理函数
void ButtonScan(void)
{
static int ButtonFlag = 0;//按键标志,1代表松开,0代表按下
if(Button == 0)//第一次判断按键按下
{
delay_ms(10);//延时10ms,去抖动
if(Button == 0)//第二次判断按键按下
{
ButtonFlag = 1; //确认按键为按下,按键标志置1
}
}
利用定时器消抖
利用定时器消抖算法:通过 SysTick 中断每1ms对按键进行扫描,当检测到连续的稳定无抖动电平信号(长度可设置)之后,才进行相应的逻辑操作。
启用一个定时中断,每 1ms 进一次中断,扫描一次按键状态并且存储起来,连续扫描 25 次后,看看这连续 25 次的按键状态是否是一致的。25 次按键的时间是 25ms,这 25ms 内如果按键状态一直保持一致,那就可以确定现在按键处于稳定的阶段,而非处于抖动的阶段。
对 SYS 进行了配置

在 STM32CubeMX 中,默认 SysTick 中断为 1ms。 我们可以打开 MDK-ARM 工程,在左侧 Drivers/STM32F1xx_HAL_Driver 文件夹的 stm32f1xx_hal.c 文件中找到 SysTick 的初始化。

/**
* @brief This function configures the source of the time base.
* The time source is configured to have 1ms time base with a dedicated

文章详细介绍了STM32中实现按键消抖的两种方法:延时消抖和利用SysTick定时器消抖。通过设置延时程序或在SysTick中断服务函数中进行按键状态监测,确保在稳定的按键状态下执行相应操作,避免抖动带来的误触发问题。
最低0.47元/天 解锁文章
1907





