简单易懂 经典按键检测程序(包含长按功能)

    1. //此程序已经经过多年经验验证,如有疑问,请留言,我会尽快回复.
      /**************************************** 
      // 函数名称:Key_scan
      // 函数功能:检测按键功能
      // 入口参数:无  
      // 出口参数:无  
      // 返 回 值: 无
      //**************************************/
      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;
        	}
      }

      
      
        	
      
      
      
      


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值