原创 按键连击扫描程序设计02

2010-3-30 22:05 3111 5 6 分类: MCU/ 嵌入式

按键状态机由五个状态组成,等待按下、延时确认1、延时确认2、等待释放、已经释放,每隔10ms读取一次按键的状态,驱动状态机转入新的状态。采用状态机可以很清晰地体现按键处理的思路,并且较好的抗干扰。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


这个程序主要是处理按键和连击的,在等待按下状态时,如果检测到低电平,转入延时确认1状态,再等10ms,如果又检测到低电平,则真的有键按下,把按键信息送到消息队列。如果在确认阶段检测到高电平,则判定为干扰,返回到等待按键状态。


在等待释放阶段,如果检测到低电平,且长按键标志没有置位,则进行时间累计,若按下时间超过连击等待时间,则置位长按键标识;若长按键标志下,每次累计一个小的时间,就发送一个有效按键信息,这就是所谓的连击。


 


void Task_FiveOK(void *pdata) 


{


  u8 FiveOKState;


  KeyStateMachine KeySM="WaitForPress";


  pdata=pdata;


 


for(;;)


 {


  OSTimeDly(1);  //延时10ms,利用ucos实现。每隔10ms进行一次检测


  FiveOKState=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15);//读取PB15的状态,OK


  switch(KeySM)   //根据此时状态机的状态做出不同反应


  {


    case WaitForPress:  //等待按键状态


         if(FiveOKState==0)  //如果检测到低电平,转入延时确认1状态


           {KeySM=KeyVerify1;


              }


         break;


    case KeyVerify1: //在确认1状态,如果是低电平,转入确认2状态


         if(FiveOKState==0)


           {KeySM=KeyVerify2;


              }


         else


           {KeySM=WaitForPress; //如果是高电平,则为干扰,回到按键等待状态。


              }


         break;


 


    case KeyVerify2: //在确认2状态如果是低电平,则真的被按下了。


         if(FiveOKState==0)


           {KeySM=WaitForRelease; //转入释放等待阶段。


 


               Key[KeyNum]=KeyOK;//将按键信息送入消息队列


         OSQPost(KeyOSQ,&Key[KeyNum]);


               KeyNum++;


              }


         else


           {KeySM=WaitForPress;


              }


         break;


        


    case WaitForRelease:


         if(FiveOKState==0)  //在等待释放阶段,如果检测到0。就进行按下时间计时。


           {KeySM=WaitForRelease;


               PressTimeCount++;


               if(!LongPress)   //如果长按键标识没有置位,则累加。


                 {


                   if(PressTimeCount==150)  //累加到1.5s后,长按键标识置位


                       {LongPress=1;


                         PressTimeCount=0;


                        }


                 }


               Else  //长按键标识置位后


               {


                   if(PressTimeCount==10)  每隔0.1s就发送一次按键信息。


                       {Key[KeyNum]=KeyOK;


                OSQPost(KeyOSQ,&Key[KeyNum]);


                      KeyNum++;


                            PressTimeCount=0;


                        }


                }            


              }


         else


           {


               LongPress=0;


               PressTimeCount=0;


               KeySM=WaitForPress;


              }


         break;   


       default:


         break;


  }


 }   


}

文章评论1条评论)

登录后参与讨论

用户607758 2012-7-7 19:15

thank you
相关推荐阅读
nthq2004 2010-05-08 20:04
USB自定义设备驱动02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  本来还想编写应用程序测试一下自定...
nthq2004 2010-05-07 21:35
USB自定义设备驱动01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、USB设备驱动入门1、学习目...
nthq2004 2010-05-04 21:01
智林开发板上实现自定义的USB HID设备
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、自定义HID设备的相关概念1...
nthq2004 2010-05-01 21:58
U盘例程在智林开发板上的移植
 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 一、移植前的准备工作1、有哪些操...
nthq2004 2010-04-30 19:19
U盘实现流程跟踪分析02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   二、追踪USB大容量设备的实现...
nthq2004 2010-04-27 21:51
U盘实现流程跟踪分析01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   一、追踪USB大容量设备的实现...
我要评论
1
5
关闭 站长推荐上一条 /2 下一条