状态机按键写法

1、将按键的各个过程存在某个变量中,通过判断变量的状态即可知道当前按键处于哪个过程;首先枚举写出按键过程的各个状态;

typedef enum
{
	KEY_STEP_WAIT,			    //等待按键
	KEY_STEP_CLICK,			    //按键按下
	KEY_STEP_LONG_PRESS,	    //长按
	KEY_STEP_CONTINUOUS_PRESS,  //持续按下
}KEY_STEP_TYPEDEF;





typedef enum
{	
	KEY_IDLE,                       //按键空闲
	KEY_CLICK,          	    	//单击确认
	KEY_CLICK_RELEASE,      	    //单击释放
	KEY_LONG_PRESS,			   		//长按确认
	KEY_LONG_PRESS_CONTINUOUS,   	//长按持续
	KEY_LONG_PRESS_RELEASE	    	//长按释放
	 
}KEY_STA_JUDGE;

typedef enum//记录当前状态用作输出
{
	KEY_IDLE_VAL,
	KEY1_CLICK,
	KEY1_CLICK_RELEASE,
	KEY1_LONG_PRESS,
	KEY1_LONG_PRESS_CONTINUOUS,
	KEY1_LONG_PRESS_RELEASE,
}KEY_STA_CONFIRM;

2、以一个按键为例,

#define Debounce  2   //消抖
#define LongPress_JudgTime  200 //2s长按判定
#define LongPress_Time  15 //2s长按判定

unsigned char key_step = KEY_STEP_WAIT;
unsigned char key_sta = KEY_STEP_WAIT;


unsigned char GetKeySta(void)
{
	return (GPIO_ReadInputDataBit(Key_PORT, Key_PIN));		
}

void Key_Ctrl()
{
  if(GetKeySta() == 1)
 {
   switch(key_step)
   {
    case KEY_STEP_WAIT:
     if(GetKeySta() == 1)
     {
        key_step = KEY_STEP_CLICK;
     }
     break;
 
    case KEY_STEP_CLICK:
     if(GetKeySta() == 1)
     {
        if((--Debounce) == 0)
        {  
         Debounce = 2;
         key_sta = KEY_CLICK;
         key_step = KEY_STEP_LONG_PRESS;
        }else
        {
         Debounce = 2;
         key_step = KEY_STEP_WAIT;
        }  
     }
     break;

    case KEY_STEP_LONG_PRESS:
     if(GetKeySta() == 1)
     {
        if((--LongPress_JudgTime)
        {  
         LongPress_JudgTime = 200;
         key_sta = KEY_LONG_PRESS;
         key_step = KEY_STEP_CONTINUOUS_PRESS;
        }else
        {
         LongPress_JudgTime = 200;
         key_sta = KEY_CLICK_RELEASE;
         key_step = KEY_STEP_WAIT;
        }  
     }
     break;

    case KEY_STEP_CONTINUOUS_PRESS:
     if(GetKeySta() == 1)
     {
       if(--LongPress_Time)
        {
          LongPress_Time = 15;
          key_sta = KEY_STEP_CONTINUOUS_PRESS;
    
        }else
        {
          LongPress_Time = 15;
          key_sta = KEY_LONG_PRESS;
          key_step = KEY_STEP_WAIT;
        }
       break;
  }
 }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值