按键检测

一、检测长按短按
//检测开关按键

if(key_delay20ms>=10) //200ms检测一次	
  { 			
         switch(key_station) 			
        {
				case 0:
				{
					if(key_on==0)
					{	key_station = 1;}  //检测到此时按键处于按键状态,转到case1
					else 
					{	key_station = 0;}
				}break;
				case 1:
				{
					if(key_on==0)
					{
						key_station = 2;//检测到此时仍在按下状态,转到case2
						key_delay = 0;
					}
					else 
					{	key_station = 0;}
				}break;
				case 2:
				{
					if(key_on==0)   //如果按键仍在按下,循环检测60次*200ms后,定义为按键长按
					{ 
						key_delay++;
						if(key_delay>=60)
						{
							key_delay = 0;
							key_station = 3;
							keyon_l = 1;
						}
					}
					else
					{
						keyon_s = 1;    //按键短按标志位
						key_station = 0;
					}
				}
				case 3:
				{
					if(key_on) key_station = 0;
				`}break;
				default: key_station = 0; break;
				}
			 }

每次调用按键标志位后,需将标志位手动清零

二、多个按键不同功能

//**************************************/
void Key_scan(void) // 2毫秒执行一次
{
 
	static uint8 key_value0=0;//按键前一次的状态寄存器
	static uint8 key_delay=0;//延时抖动时间存器
	 
	static uint8 key_longtime;//长按按键基准时间1
	static uint8 key_longtime1;//长按按键时间 总时间=key_longtime*key_longtime1*2ms+10ms(10ms为清抖时间)
	 
	key_value=0; 
	if(!P_K1)//按键扫描SW1
	{
		key_value=1; 
	} 
	 
	if(!P_K2)//按键扫描SW2
	{
		key_value=2; 
	}
	 
	 
	if(!P_K3)//按键扫描SW3
	{
		key_value=4; 
	} 
	if(!P_K4)//按键扫描SW4
	{
		key_value=8; 
	} 
	if(!P_K5)//按键扫描SW5
	{
		key_value=16; 
	} 
 
  
	if(key_value==key_value0)//如不相等,保存当前按键值,清抖,两毫秒后程序再次走到这里即判定为按下
	{
		if(key_delay>5)//抖动处理
		{
			if(key_value>0)//无按键按下确认,等于0时表示无按键,清释放标识位
			{
				if(!f_onkey)//判断按键是否释放
				{
					f_onkey=1;
					switch(key_value)
					{
						case 1://SW1有效执行内容
					break;
						case 2://SW2有效执行内容
					break;
						case 4://SW3有效执行内容
					break;
						 case 8://SW4有效执行内容
					break;
						case 16://SW5有效执行内容
					break;
					default: 
					break;
					}
				
				}
				else
				{
					 if(++key_longtime>90)
					 {
							key_longtime=0;
							if(++key_longtime1>6)
							{
								key_longtime1=0;
								f_longkey=1;//长按按键有效
							}
					 }
				}
			}
			else//按键释放
			{
				f_onkey=0;
				f_longkey=0;
			}
		}
		else  //有按键 
		{
		key_delay++;
		}
  	}
	
	else//第一次检测到按键保存当前按键值
  	{
		key_value0=key_value;
		key_delay=0;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值