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

单片机按键检测函数

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

 /*******************************************************************
 函数功能:判断某一按键的状态;
 返回值:0x00-未按键,0x01-短按键,0x02-长按键;(本程序不设连发功能)
 注意:本长短按键是在同一按键上实现;
 长按键是持续按下2秒后认为是长按键,此时可以执行按键功能程序,必须释放
 按键后才可以再次执行按键判断;
 短按键是按下时间在2秒以内并释放的为短按键,含20ms的防抖,按键执行是在
 按键释放后执行的;
 为了定时方便,本函数是每10ms执行一次的,如果执行周期有变,注意更改相
 关变量。
 (可以将此函数以结构体形式扩展为多个通道检测,本处测试函数未做。)
********************************************************************/
uchar get_sw_state(void)
{
  static uchar count=0; //按键状态计时;
 static uchar long_key=0; //长按键标志;
 static uchar t50ms_for_err=0; //50ms防释放干扰或人认抖动,即有按键时,须检测到释放时间达到50ms才认为真的是释放;
 uchar value_tmp=0x00; //键值;
 
  if(NO_SWITCH)
    {
  if(t50ms_for_err!=0) t50ms_for_err--;
  if(0==t50ms_for_err) //确实释放;
  {
   if(0==long_key) //不可省,防止按键一直不放,count从TOP值又到了BOTTOM重新计数;
   {
    if(count<2) value_tmp=0x00; //防抖;
    else if(count<200) value_tmp=0x01; //2秒以内释放为短按键;
   }
   count=0; //计数清零;
   long_key=0;
  }
 }
 else
 {
  count++;
  if(count>2) t50ms_for_err=5;
  if((200==count)&&(0==long_key))
  {
   long_key=1;
   value_tmp=0x02;
  }
 }
 return value_tmp;
}

关闭窗口

相关文章