再发键盘状态机

[复制链接]
2630|4
 楼主| phz0008 发表于 2011-4-11 14:03 | 显示全部楼层 |阅读模式
u8 KeyStateMachine(void)
{
if(KeyDone)     //按键对应处理执行了没有
  {
      KeyValue=(GetKeyValue()&NoKeyPressMask);/*检测按键端口获得按键值*/
     switch(CurKeyState)
     {
      case NoKeyPress:
       if(KeyValue!=NoKeyPressMask)
        {
          CurKeyState=KeyDrop;
         }
       else
         {
         #ifdef NoKeyTimeCntEn                 //支持无击使能标志
              NoKeyTimeCnt++;                //支持无击计数器增长
            #endif
            KeyValid= 0xff;
         }
      break;
      case KeyDrop:
          if(KeyTempBuf[0]!=KeyTempBuf[1]&&KeyValue==KeyTempBuf[1]&&KeyValue!=NoKeyPressMask)
           {           
              CurKeyState=KeyPress;   
              KeyAge=0;   //年龄计数器清零
             }
           else
            {
              CurKeyState=NoKeyPress;  
            }            
      break;
      case KeyPress:   //此阶段处理长击和连击
          if(KeyTempBuf[0]==KeyTempBuf[1]&&KeyValue==KeyTempBuf[1]&&KeyValue!=NoKeyPressMask)
           {
            KeyAge++;  //年龄计数器累加  
            KeyValid= KeyValue;//或者压KEYPADBUF
             }
           else
            {
              CurKeyState=NoKeyPress;  
            }  
      case KeyRelease:  //此阶段处理键盘弹起  
       if(KeyTempBuf[0]==NoKeyPressMask&&KeyTempBuf[1]==NoKeyPressMask&&KeyValue==NoKeyPressMask) //确认弹起
        {      
          CurKeyState=NoKeyPress;
          if(KeyAge>=KeyLongPreesLimit)
           SingleKeyLongShortFlag=1;
          else
           SingleKeyLongShortFlag=0;           
          KeyAge=0;   //年龄计数器清零
          KeyDone=0;  //按键置未处理标志
          KeyTempBuf[0]=KeyTempBuf[1]=KeyValue=0xff;
         }
      break;
      default:  
           CurKeyState=NoKeyPress;  
      break;      
     }
     KeyTempBuf[0]=KeyTempBuf[1];
     KeyTempBuf[1]=KeyValue;
     return KeyValid;
  }
  else{
   //键盘扫描无效
   return 0xff;
  }
}
老鱼探戈 发表于 2011-5-28 14:15 | 显示全部楼层
沙发!友情帮顶也可以嘛
l50211 发表于 2011-5-28 15:52 | 显示全部楼层
hotpower 发表于 2011-5-28 17:05 | 显示全部楼层
lixupengarm 发表于 2011-5-28 22:02 | 显示全部楼层
mark!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

124

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部