106 lines
3.6 KiB
C
106 lines
3.6 KiB
C
#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;
|
|
} |