专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

单片机与4x4键盘 去抖 松手检测程序

作者:huqin   来源:本站原创   点击数:  更新时间:2014年04月09日   【字体:

刚写的一个4*4 键盘, 去抖   松手检测程序。 项目中要用4*4 键盘,扫描的程序有。但是去抖,和松手检测的程序没有,那么为了提高效率,可靠性,以及更加合理化。到网上找了一些关于”状态机“的资料,按照它的思路写了一个,写了半天,写好一个,经过特发帖纪录一下。


//对按键扫描的值  进行处理  去抖  松手检测
uint8_t key_scan(void)
{
 static uint8_t key_state = 0;
 static uint8_t key_num_flag1=0;


 uint8_t temp_key_num=0;
  uint8_t return_key_num=0;


 temp_key_num=KeyMap(); //读取4*4 键盘返回的按键值  不要去抖


 switch(key_state) //检测状态
 {
  case key_state_0:
   if(temp_key_num!=0)  //如果按键返回不是0  说明有按键按下
   {
    key_num_flag1=temp_key_num;  //记录下 第一次按键按下的值
      key_state=key_state_1;  //进入下一个状态  去抖
   } 
  break;


  case key_state_1:
   if(temp_key_num!=0)  //如果按键返回不是0  说明按键是按下的
   {
    if(key_num_flag1==temp_key_num) //判断是否和上次记录按键值一样。
    {
     return_key_num=temp_key_num;  // 按键仍按下,赋值给 返回按键值


             key_state = key_state_2;        // 状态转换到键释放态
    }
    else
    {
     key_state=key_state_0;  //回到初始状态 
    }
   }
   else    ///没有按键按下
   {
    key_state=key_state_0;  //回到初始状态 
   } 
  break;


  case key_state_2:
            if(temp_key_num==0)  //如果没有按键按下。 说明按键松手了
   {
    key_state = key_state_0;    //按键已释放,转换到按键初始态
   }
   else
   {
    return_key_num=key_num_flag1; //如果没有松手那就返回之前记录的值


    //如果没有这句的话,那么返回就是0。 这个适合4*4 键盘扫描,假如没有这句
    //那么只有状态1时候返回一次return_key_num,下面就一直不返回了。
    
   }


  break;
 }


 return return_key_num;  //返回按键值
  
}

关闭窗口

相关文章