各种按键类型检测的解决方法,在宝马开发板上实现
本帖最后由 zhu_huijia0001 于 2014-3-15 21:38 编辑一般按键类型按照用户的行为可分为:单击、长击、连击、松开。本程序实现了一种通用的检测方法。
先定义按键状态
typedef enum
{
KEY_STATUS_IDLE = 0, //按键空闲状态
KEY_STATUS_BOUND = 1,//毛刺检测状态
KEY_STATUS_PRESS = 2, //单击状态
KEY_STATUS_LONG= 3, //长击状态
KEY_STATUS_CONTINUE = 4 //连击状态
} KEY_STATUS;
#define MASK_KEY_PRESS 0x0100
#define MASK_KEY_LONG 0x0200
#define MASK_KEY_CONTINUE 0x0400
#define MASK_KEY_RELEASE0x0800
#define KEY_NONE 0x00
#define KEY_1 0x01
#define KEY_2 0x02
//按键计数值
#define KEY_PRESS_CHECK_COUNT 2
#define KEY_LONG_CHECK_COUNT 100
#define KEY_CONTINUE_CHECK_COUNT 50
#define KEY_CONTINUE_DELTA_COUNT 10
#define KEY_CONTINUE_BASE_COUNT10
static bool CheckKey1(void)
{
return !GET_GPIO_BIT(PIN_KEY_1);
}
static bool CheckKey2(void)
{
return !GET_GPIO_BIT(PIN_KEY_2);
}
typedef struct
{
KEY_STATUS keyStatus;
UINT8count;
UINT8continueCount;
UINT8targetKey;
bool (*CheckFun)(void);
} KEY_CHECK;
//检测按键,按照一定的时间间隔调用
static UINT16 GetKey(KEY_CHECK *pKeyCheck)
{
UINT16 key = (UINT16)KEY_NONE;
if (pKeyCheck->CheckFun())
{
switch (pKeyCheck->keyStatus)
{
case KEY_STATUS_IDLE:
pKeyCheck->keyStatus = KEY_STATUS_BOUND;
pKeyCheck->count = KEY_PRESS_CHECK_COUNT;
break;
case KEY_STATUS_BOUND:
pKeyCheck->count--;
if (pKeyCheck->count == 0)
{
key = pKeyCheck->targetKey | MASK_KEY_PRESS;
pKeyCheck->keyStatus = KEY_STATUS_PRESS;
pKeyCheck->count = KEY_LONG_CHECK_COUNT;
}
break;
case KEY_STATUS_PRESS:
pKeyCheck->count--;
if (pKeyCheck->count == 0)
{
key = pKeyCheck->targetKey | MASK_KEY_LONG;
pKeyCheck->keyStatus = KEY_STATUS_LONG;
pKeyCheck->count = pKeyCheck->continueCount;
}
break;
case KEY_STATUS_LONG:
pKeyCheck->count--;
if (pKeyCheck->count == 0)
{
key = pKeyCheck->targetKey | MASK_KEY_CONTINUE;
pKeyCheck->keyStatus = KEY_STATUS_CONTINUE;
pKeyCheck->continueCount -= KEY_CONTINUE_DELTA_COUNT;
pKeyCheck->count = pKeyCheck->continueCount;
}
break;
case KEY_STATUS_CONTINUE:
pKeyCheck->count--;
if (pKeyCheck->count == 0)
{
key = pKeyCheck->targetKey | MASK_KEY_CONTINUE;
if (pKeyCheck->continueCount > KEY_CONTINUE_BASE_COUNT)
{
pKeyCheck->continueCount -= KEY_CONTINUE_DELTA_COUNT;
}
pKeyCheck->count = pKeyCheck->continueCount;
}
break;
default:
break;
}
}
else
{
if (pKeyCheck->keyStatus != KEY_STATUS_IDLE && pKeyCheck->keyStatus != KEY_STATUS_BOUND)
{
key = pKeyCheck->targetKey | MASK_KEY_RELEASE;
}
pKeyCheck->count = 0;
pKeyCheck->continueCount = KEY_CONTINUE_CHECK_COUNT;
pKeyCheck->keyStatus = KEY_STATUS_IDLE;
}
return key;
}
页:
[1]