论坛元老
 
- 积分
- 3772
- 金钱
- 3772
- 注册时间
- 2015-4-26
- 在线时间
- 765 小时
|
胡思乱想时写出来了,没有实际测试,估计没什么bug
单个按键:
[mw_shl_code=applescript,true]#define TIM_INT_TIME 1 /* 定时器中断时间,ms */
#define KEY_SCAN_TIME (20 / TIM_INT_TIME) /* 20ms,按键扫描时间 */
#define KEY_PRESSED_MODE_TIME (1500 / KEY_SCAN_TIME) /* 1.5s,进入长按模式的时间 */
#define KEY_LONG_MODE_INTERVAL (400 / KEY_SCAN_TIME) /* 400ms,长按模式下,每400ms变量+1 */
typedef enum {
KEY_NULL, /* 没有按键按下 */
KEY_PRESSED, /* 按键按下了 */
KEY_LONG, /* 按键长按 */
}E_KEYSTATE;
unsigned int g_uiKeyScanTime; /* 按键扫描时间计数 */
unsigned int g_uiKeyCnt = 0; /* 按键控制的变量 */
void main(void)
{
E_KEYSTATE eKeyState = KEY_NULL;
unsigned int uiKeyPressedModeTick = 0; /* 按键处于 KEY_PRESSED 状态的时间 */
unsigned int uiKeyCntIncInterval = 0; /* 长按状态下,变量自加时间间隔 */
while (1)
{
if (g_uiKeyScanTime >= KEY_SCAN_TIME) /* 每20ms扫描一次按键 */
{
g_uiKeyScanTime = 0;
if (KEY == 1) /* 按键按下 */
{
switch (eKeyState)
{
case KEY_NULL:
{
eKeyState = KEY_PRESSED;
g_uiKeyCnt++; /* 按键按下,则变量+1 */
break;
}
case KEY_PRESSED:
{
uiKeyPressedModeTick++;
if (uiKeyPressedModeTick >= KEY_PRESSED_MODE_TIME) /* 按键按下KEY_PRESSED_MODE_TIME时间后,进入长按模式 */
{
uiKeyPressedModeTick = 0;
eKeyState = KEY_LONG;
}
break;
}
case KEY_LONG:
{
uiKeyCntIncInterval++;
if (uiKeyCntIncInterval >= KEY_LONG_MODE_INTERVAL)
{
uiKeyCntIncInterval = 0;
g_uiKeyCnt++; /* 按键长按,每 KEY_LONG_MODE_INTERVAL 变量+1 */
}
break;
}
}
}
else
{
eKeyState = KEY_NULL;
}
}
}
}
/* 1MS中断 */
TIM_ISR()
{
g_uiKeyScanTime++;
}
[/mw_shl_code]
|
|