#ifndef INCLUDED_DEBOUNCE_H #define INCLUDED_DEBOUNCE_H #ifndef INCLUDED_STDINT_H #define INCLUDED_STDINT_H #include #endif /*INCLUDED_STDINT_H*/ /* ------------------------------------------------------------------------------------------------------------------ */ /* */ typedef enum { kButtonEvent_NONE = 0, kButtonEvent_PRESS, kButtonEvent_CLICK, kButtonEvent_DOUBLE_CLICK, kButtonEvent_LONG_PRESS, kButtonEvent_RELEASE, }ButtonEvent_t; typedef enum{ kButtonState_IDLE = 0, kButtonState_DEBOUNCE, /* 按下消抖 */ kButtonState_PRESS, /* 确认按下,等待释放或长按 */ kButtonState_LONG_PRESS, /* 处于长按状态 */ kButtonState_WAIT_DOUBLE, /* 等待第二次按下 */ kButtonState_DOUBLE_DEBOUNCE, /* 第二次消抖 */ kButtonState_RELEASE_DEBOUNCE, /* 释放消抖 */ }ButtonState_t; typedef struct { ButtonState_t state; uint8_t debounce_cnt; /* 消抖计数器 */ uint16_t long_press_cnt; /* 长按计数器 */ uint16_t double_click_cnt; /* 双击等待计数器 */ uint8_t is_pressed; /* 经过消抖后当前的电平: (1:按下, 0:松开) */ uint8_t last_pressed; /* 上一次物理电平 */ }Debounce_t; #define DEBOUNCE_INIT {kButtonState_IDLE, 0, 0, 0, 0, 0} /* ------------------------------------------------------------------------------------------------------------------ */ /* */ // 核心参数配置(基于 10ms 状态机轮询周期) #define DEBOUNCE_TICKS 3 // 消抖时间: 3 * 10ms = 30ms #define DEBOUNCE_LONG_TICKS 150 // 长按判定: 150 * 10ms = 1.5s #define DEBOUNCE_DOUBLE_TICKS 35 // 双击间隔: 35 * 10ms = 350ms /* ------------------------------------------------------------------------------------------------------------------ */ /* */ void Debounce_Init(Debounce_t* self); /** * @brief 状态机核心处理函数(需在 10ms 定时器中断或主循环定时中调用) * @param self: 消抖结构体指针 * @param cur_state: 当前按键状态,1:按下, 0:松开 * @return 检测到的事件类型 */ ButtonEvent_t Debounce_Handle(Debounce_t* self, uint8_t cur_state); #endif /*INCLUDED_DEBOUNCE_H*/