在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),结果用按键控制各种不灵。
初写文章,希望大佬们多多批评指正。