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;
}
}
}