本文最后更新于 2025-01-10T22:20:33+08:00
消抖是为了避免按键在物理接触时可能引起的抖动信号,从而导致多次触发中断回调函数。以下是一种常见的按键消抖方法:
- 在HAL_GPIO_EXTI_Callback函数中,使用延时函数(例如HAL_Delay)等待一个适当的时间,以确保消除按键的抖动。例如,可以延时10毫秒。
1
| if(GPIO_Pin == KEY1_Pin) { HAL_Delay(10);
|
- 在按键的回调函数中,添加一个变量来记录上一次按键触发的时间戳。每次回调函数被调用时,检查当前时间与上一次触发的时间差。如果时间差小于一定阈值,忽略当前触发,否则执行相应的操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #define DEBOUNCE_DELAY 200
void Key_1_Callback(void) { static uint32_t lastTriggerTime = 0; uint32_t currentTime = HAL_GetTick();
if (currentTime - lastTriggerTime >= DEBOUNCE_DELAY) {
lastTriggerTime = currentTime; } }
|
这种方法通过设置一个适当的延时和使用时间戳比较的方式,在一定程度上可以消除按键的抖动效应。
进阶:使用回调函数给每一个按键独立软件防抖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
#include "key.h" #include "led.h" #include "gui.h" #include "yuntai.h" #include "Buzzer.h" #include "app.h"
#define KEY1_Pin KEY_1_Pin #define KEY2_Pin KEY_2_Pin #define KEY3_Pin KEY_3_Pin #define KEY4_Pin KEY_4_Pin #define KEY5_Pin KEY_5_Pin #define KEY6_Pin KEY_6_Pin #define KEY7_Pin KEY_7_Pin #define KEY8_Pin KEY_8_Pin #define KEY9_Pin KEY_9_Pin #define KEY10_Pin KEY_10_Pin #define KEY11_Pin KEY_11_Pin
#define DEBOUNCE_DELAY 250
void Key_1_Callback(void) { }
void Key_2_Callback(void) { }
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { UNUSED(GPIO_Pin);
if(GPIO_Pin == KEY1_Pin) { Debounce(GPIO_Pin, Key_1_Callback); } else if(GPIO_Pin == KEY2_Pin) { Debounce(GPIO_Pin, Key_2_Callback); } }
void Debounce(uint16_t GPIO_Pin, void (*callback)(void)) { static uint32_t lastTriggerTime = 0; uint32_t currentTime = HAL_GetTick(); if (currentTime - lastTriggerTime >= DEBOUNCE_DELAY) { Buzzer_ShortBeep(); callback(); lastTriggerTime = currentTime; } }
|
通过在每个按键回调函数中独立地记录和比较时间戳,可以确保每个按键都独立地进行消抖处理。这样可以避免一个按键的抖动影响到其他按键的触发。请根据实际情况适当调整消抖延时以满足你的需求。