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

在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),结果用按键控制各种不灵。

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

你可能感兴趣的:(STM32)