|
本帖最后由 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_RELEASE 0x0800
#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_COUNT 10
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;
UINT8 count;
UINT8 continueCount;
UINT8 targetKey;
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;
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|