按键函数:实现单击、双击、长按
- 按键按下时长超过1.5S,认为是长按事件。
- 连续两次按下时间间隔不超过350ms,认为是双击事件。
- 除以上两条,按键按键都属于单击事件。
废话不多说,直接上代码。如有问题,欢迎评论区讨论。
/* 此函数是1ms运行一次 所以时间单位为1ms */
#define KEY_LP_TIME 1500 /* 长按时间 单位 ms */
#define KEY_DOUBLE_TIME 350 /* 两次按下间隔不超过此值为双击事件 */
uint8_t KEY1_LP_FLG; /* 按键长按标志 */
uint8_t KEY1_PR_FLG; /* 按键按下标志 */
uint8_t Key1LtDelay; /* 按键抬起消抖时间 */
uint8_t Key1PrDelay; /* 按键按下消抖时间 */
uint8_t Key1PrCnt; /* 按键按下次数计数 检测双击 */
uint16_t Key1PrTimeCnt; /* 连续两次按下时长计数 检测双击 */
uint16_t Key1PrTime; /* 按键按下时长计数 检测长按 */
void Key1Scan(void){ //1ms扫描一次
if(KEY1 == 0){
Key1LtDelay = 0;
if(!KEY1_PR_FLG){
Key1PrDelay++;
if(Key1PrDelay>20){
Key1PrDelay = 0;
KEY1_PR_FLG = 1;
/********** User Code **********/
Key1PrCnt++; /* 计数按下次数 */
if(Key1PrCnt>2){ Key1PrCnt = 0; }
KEY1_LP_FLG = 0;
Key1PrTime = 0;
/************* End *************/
}
}
}
else{
Key1PrDelay = 0;
if(KEY1_PR_FLG){
Key1LtDelay++;
if(Key1LtDelay>20){
Key1LtDelay = 0;
KEY1_PR_FLG = 0;
/********** User Code **********/
KEY1_LP_FLG = 0; /* 抬起按键轻触长按标志 */
/* 当按键按下但是超过双击检测时间 未达到长按时间 此时认为是一个单击事件 */
if(Key1PrTime >= KEY_DOUBLE_TIME){
//单击事件
}
/************* End *************/
}
}
}
//长按检测
if(KEY1_PR_FLG){
if(!KEY1_LP_FLG){
Key1PrTime++;
if(Key1PrTime >= KEY_LP_TIME){
Key1PrTime = 0;
KEY1_LP_FLG = 1; /* 长按1.5S 置位长按标志 */
/********** User Code **********/
//长按事件
/************ End *************/
}
}
}
//双击检测
if(Key1PrCnt==1){
if(Key1PrTimeCnt < KEY_DOUBLE_TIME){ Key1PrTimeCnt++; }
else{
if(!KEY1_PR_FLG){
//单击事件
}
Key1PrTimeCnt = 0;
Key1PrCnt = 0;
}
}
else if(Key1PrCnt==2){
if(Key1PrTimeCnt < KEY_DOUBLE_TIME){
//双击事件
}
Key1PrCnt = 0;
Key1PrTimeCnt = 0;
}
}
版权声明:本文为WangJiZhiQian原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。