简单地用状态机写的按键检测

在CSDN上写的第一篇文章,,,,

 

之前就听说过状态机,但并没有感觉到其比普通按键的优越之处。

 

接触了实时操作系统之后,才领悟到这种按键检测方法可以很好地利用CPU的资源(或者说不用实时操作系统时更体现优越性)

 

 

这里直接粘贴按键检测的代码了(按键、LED初始化、UCOS系统就不赘述了)

 

程序是STM32F103的,不过和芯片类型关系不大

 

void key0_task(void *pdata)
{
 while(1)
 {
  key0_scan();
  key1_scan();
  key2_scan();
  delay_ms(5);   //前提是UCOS时钟节拍为5ms,以10ms为一个状态检测消抖;
 };
}

enum key0_states_e
{
 KEY_S1,                // button 0 is not pressed
 KEY_S2,                //Button 0 has been pressed
 KEY_S3,                 //Button 0 are pressing
 KEY_S4,                 //Button 0 has been lossen
};

void key0_scan(void)
{
 static enum key0_states_e key0_state=KEY_S1;
 static int press0=0;
 switch(key0_state)
 {
 case KEY_S1:
   
   if(KEY0==0)
    {
     key0_state = KEY_S2;
    }
   break;
 case KEY_S2:
   
    {
     if(KEY0==0)
     {
      press0++;
      key0_state = KEY_S3;
     }
     else
      key0_state = KEY_S1;
    }
     break;
 case KEY_S3:
   {
    if(KEY0==0)
    {
     press0++;
     key0_state = KEY_S3;
    }
    else
    {
     key0_state = KEY_S4;
    }
   }
   break;
 case KEY_S4:
   {
    if(press0>200)
    {
     LED0=!LED0;
     LED1=!LED1;
    }
    else
     LED0=!LED0;
    press0=0;
    key0_state=KEY_S1;
   }
   break;
 }
} 

 

程序实现的功能:按键按下2s以内,LED0反转;2s以上,LED1和LED0都反转

 

 

多说一句,10ms的消抖检测真的是最合适的,lz之前没写那句delay_ms(5),结果用按键控制各种不灵。

初写文章,希望大佬们多多批评指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值