Files

106 lines
3.6 KiB
C
Raw Permalink Normal View History

2026-05-19 11:49:22 +08:00
#include <debounce.h>
void Debounce_Init(Debounce_t* self){
self->state = kButtonState_IDLE;
self->debounce_cnt = 0;
self->long_press_cnt = 0;
self->double_click_cnt = 0;
self->is_pressed = 0;
self->last_pressed = 0;
}
ButtonEvent_t Debounce_Handle(Debounce_t* self, uint8_t cur_state){
ButtonEvent_t event = kButtonEvent_NONE;
self->is_pressed = cur_state;
switch (self->state) {
case kButtonState_IDLE:{
if(cur_state == 1){
self->state = kButtonState_DEBOUNCE;
self->debounce_cnt = 0;
}
break;
}
case kButtonState_DEBOUNCE:{
if(cur_state==1){
self->debounce_cnt++;
if(self->debounce_cnt >= DEBOUNCE_TICKS){
self->state = kButtonState_PRESS;
self->debounce_cnt = 0;
event = kButtonEvent_PRESS; /* 触发下按事件 */
}
}else{
self->state = kButtonState_IDLE;
}
break;
}
case kButtonState_PRESS:{
if(cur_state==1){
self->long_press_cnt++;
if(self->long_press_cnt >= DEBOUNCE_LONG_TICKS){
self->state = kButtonState_LONG_PRESS;
event = kButtonEvent_LONG_PRESS;
}
}else{
// 第一击释放,进入释放消抖,防止触摸屏抖动误判
self->state = kButtonState_RELEASE_DEBOUNCE;
self->debounce_cnt = 0;
self->long_press_cnt = 0;
}
break;
}
case kButtonState_LONG_PRESS:{
if(cur_state==0){
self->state = kButtonState_IDLE;
self->long_press_cnt = 0;
event = kButtonEvent_RELEASE;
}
break;
}
case kButtonState_WAIT_DOUBLE:{
if(cur_state==1){ /* 在规定时间内再次按下,判定为双击 */
self->state = kButtonState_DOUBLE_DEBOUNCE; /* 去除第二次抖动 */
self->debounce_cnt = 0;
}else{
self->double_click_cnt++;
if(self->double_click_cnt>=DEBOUNCE_DOUBLE_TICKS){ // 超时未按下,判定为普通的独立单击
self->state = kButtonState_LONG_PRESS;
event = kButtonEvent_CLICK;
self->double_click_cnt = 0;
}
}
break;
}
case kButtonState_DOUBLE_DEBOUNCE:{
if(cur_state==1){
self->debounce_cnt++;
if(self->debounce_cnt >= DEBOUNCE_TICKS){
self->state = kButtonState_LONG_PRESS; /* 等待释放 */
self->debounce_cnt = 0;
event = kButtonEvent_DOUBLE_CLICK; /* 确认双击 */
}
}else{
self->state = kButtonState_IDLE;
}
break;
}
case kButtonState_RELEASE_DEBOUNCE:{
if(cur_state==0){
self->debounce_cnt++;
if(self->debounce_cnt >= DEBOUNCE_TICKS){
// 确认释放,开始计时等待第二击
self->state = kButtonState_WAIT_DOUBLE;
self->double_click_cnt = 0;
}
}else{
self->state = kButtonState_PRESS; // 抖动,返回按下状态
}
break;
}
default: break;
}
self->last_pressed = cur_state;
return event;
}