多功能检测按键 单按 长按 多个按键 响应方式

本文介绍了一种优化的按键检测方法,支持单按键、多按键、长按及组合按键等多种情况,并提供了详细的实现代码。该方法能有效区分短按与长按操作,支持按键释放后的响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//这是我对以前发表过的按键检测方式的优化,之前的是:http://blog.youkuaiyun.com/chuangwu2009/article/details/9466715

//现在的程序按键有效检测方式:1:单按键响应  2:多按键响应 3:长按单个按键响应 4:长按多个按键响应 5:以上响应的方式都可以选择释放后响应和按下马上响应


void Key_scan(void)	 // uint8
{


static	uint8	key_value=0;//当前按键值寄存器
static	uint8	key_delay=0;//按键去抖动寄存器
static	uint8	key_value0=0;//前一次按键值寄存器
static	uint8	key_value1=0;	 //按键释放后的按键值寄存器
static	uint8	key_mult=0;//多按键寄存器
static	uint8	key_longtime=0;//长按时间累积寄存器1
static	uint8	key_longtime1=0;//长按时间累积寄存器2


	key_value=0;
	key_mult=0;
	
	    if(!P_K1)//按键扫描	P_K1
		{
			key_value|=SETB0;
			key_mult++;	
		} 
	
		if(!P_K2)//按键扫描 P_K2
		{
			key_value|=SETB2;
			key_mult++;	
		}
		if(!P_K3)//按键扫描P_K3
		{
			key_value|=SETB3;
			key_mult++;		
		} 
	
		if(!P_K4)//按键扫描	P_K4
		{
			key_value|=SETB4;
			key_mult++;		
		}
	
		if(!P_K5)//按键扫描	S5	 减键
		{
			key_value|=SETB5;
			key_mult++;		
		} 

	if(key_value==key_value0)//如不相等,保存当前按键值,清抖动寄存器,以此次识别
	{
		if(key_delay>5)//抖动处理
		{
			if(key_value>0)//无按键按下确认,等于0时表示无按键,清释放标识位
			{
				if(!f_onkey)
				{
					f_onkey=1;				
					if(1==key_mult)
					{//单按键按下处理程序
						 switch(key_value)
						{
							 case SETB0://按下P_K1
							 {							 	
							 	key_value1|=SETB0;
							 	break;
								}
								
							 
							default: 
							break;		
				 			
						}
					}
					else
					{//多按键按下处理程序
								case SETB0|SETB1://同事按下P_K1 P_K2
							 {							 	
							 	key_value1|=SETB0|SETB1;
								
							 	break;
								}
									case SETB0|SETB1|SETB2://同事按下P_K1 P_K2 P_K3
							 {							 	
							 	key_value1|=SETB0|SETB1|SETB2;
								
							 	break;
								}
					}
			
				}
				else
				{//按键长按
					if(!F_longkey)
					{
						if(++key_longtime>=40)//5毫秒1次  40*15*5=3秒
						{
							 key_longtime=0;
							 if(++key_longtime1>=15)
							 {
								 key_longtime1=0;//3秒时间到	
								 
								 F_longkey=1;
								//长按按键处理程序
									if(1==key_mult)
									{
										 switch(key_value)
										{
											 case SETB0://长按下P_K1
											 {							 	
												
												break;
												}
												
											 
											default: 
											break;		
											
										}
									}
									else
									{//多按键长按按键处理程序
												case SETB0|SETB1://同事按下P_K1 P_K2
											 {							 	
												key_value1|=SETB0|SETB1;
												
												break;
												}
													case SETB0|SETB1|SETB2://同事按下P_K1 P_K2 P_K3
											 {							 	
												key_value1|=SETB0|SETB1|SETB2;
												
												break;
												}
									}
										
							 }
						}	
					}	
				}
			 }
			  else//按键释放
		 	 {
				f_onkey=0;
				F_first=0;
				key_longtime=0;
				key_longtime1=0;
				if(F_longkey)
				{//长按按键释放
					F_longkey=0;							
				}
				else
				{//短按按键释放
					if(SETB0==key_value1)
					{//P_K1释放
												
					}	
					else if(SETB0|SETB0==key_value1)
					{//P_K1 P_K2释放
												
					}	
				}
				key_value1=0;
					
			 }
		}
		else  //有按键 
		{
			key_delay++;
		}
	}
	else
	{
		key_value0=key_value;
		key_delay=0;
	}
		
}














 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值