历史上的今天
今天是:2024年11月16日(星期六)
2019年11月16日 | 单个按键,实现单击+双击+长按
2019-11-16 来源:eefocus
按键函数:实现单击、双击、长按
按键按下时长超过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;
}
}
史海拾趣
|
HYM8025 时钟IC 有谁用过啊? 大家现在都用的什么型号的时钟IC?谢谢 QQ:76530879 mail:lvrenchaomail@163.com… 查看全部问答> |
|
[====================]wince 5.0 C# numericUpDown 控件不能显示小数 点上 点下 都没用??? 这是为何啊 谁在 wince 下用过这 倒霉的控件啊 … 查看全部问答> |
|
1、NRZI 即0翻转非归灵编码方式,遇0则跳变,遇1则维持前一状态的电平,这样做有什么好处,还有为什么当遇到一大串连续的1时候,即没有跳变的时候就会失去同步呢?同步序列不是在数据包的开始吗,后面的位为什么和同步有关了? 2、同步是怎么完成 ...… 查看全部问答> |
|
简介:MSP430 是一款超低功耗单片机,非常适合便携式产品以及便携式医疗产品的应用。设计便携式医疗产品通常要求较低的系统成本、最低的系统功耗以及实现较高的测量精度。TI 为医疗成像提供完整的模拟信号链和嵌入式处理解决方案,旨在以更快速度为 ...… 查看全部问答> |
|
本人新手,刚最近要做一个定位系统,现在看好Xbee与TI 的CC系列芯片。但是有几个问题没有弄明白。一、两者之间有没有区别?还是说Xbee实际就是使用的TI芯片。二、一般说用RSSI定位,但是听说TI最新的芯片里内嵌了定位引擎,做起定位来会比较方便, ...… 查看全部问答> |




