×
嵌入式 > 技术百科 > 详情

单个按键,实现单击+双击+长按

发布时间:2020-06-06 发布时间:
|

按键函数:实现单击、双击、长按


按键按下时长超过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;

}

}


 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
分布式光纤温度传感器(DTS)系统的应用