#include 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; }