import
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user