下面两个函数需要用到定时器,定时执行
KeyPress是按键按下的标志,需要根据实际情况修改
bit singleClick_flag = 0; //单击标志
bit doubleClick_flag = 0; //双击标志
bit longClick_flag = 0; //长按标志
bit isPress_flag = 0; //是否按下的标志
bit pressDelay_flag = 1; //消抖标志
bit startCountTime_flag = 0; //开始统计时间标志
uint8_t pressTime_cnt = 0; //统计本次长按了多久时间
uint8_t time_cnt = 0; //统计从按下的那一刻,时间过了多久
uint8_t click_cnt = 0; //统计按了几下
void Key_Scan(){ //按键扫描 10ms执行一次
if(KeyPress){ //按下
if(!pressDelay_flag){ //消抖完成
if(KeyPress){ //目前还是按下的状态
pressTime_cnt++; //统计本次长按了多久
startCountTime_flag = 1; //开始统计时间
isPress_flag = 1; //按下了
}
}else{ //第二次进来,已经过了10ms,置0,表示消抖完成
pressDelay_flag = 0;
}
}else if(isPress_flag){ //松手了,上一个状态是按下,才会进来,按一次,才能进来一次
isPress_flag = 0; //按下标志置0
pressDelay_flag = 1; //松过手,后面按下需要消抖处理
click_cnt++; //统计按了几次
if(pressTime_cnt >= 150){ //本次长按了1.5s
longClick_flag = 1; /* 长按 */
pressTime_cnt = 0;
click_cnt = 0;
time_cnt = 0;
startCountTime_flag = 0;
}else{ //不足1.5s
if(click_cnt >= 2 && (time_cnt < 100)){ //在1s内,连续按了两次及以上
doubleClick_flag = 1; /* 双击 */
pressTime_cnt = 0;
click_cnt = 0;
time_cnt = 0;
startCountTime_flag = 0;
}else if((click_cnt == 1) && (time_cnt >= 100)){ //按了一下,时间过了1s
singleClick_flag = 1; /* 单击 */
pressTime_cnt = 0;
click_cnt = 0;
time_cnt = 0;
startCountTime_flag = 0;
}
}
}
if(startCountTime_flag){ //从第一次按下的那一刻起,统计时间过了多久
++time_cnt;
}
}
void Key_Handle(){ //20ms执行一次
if(singleClick_flag){ /* 单击 */
singleClick_flag = 0;
}else if(doubleClick_flag){ /* 双击 */
doubleClick_flag = 0;
}else if(longClick_flag){ /* 长按 */
longClick_flag = 0;
}
}