一个按键检测单击、双击、长按

下面两个函数需要用到定时器,定时执行
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;
			
		}
}



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值