按键扫描状态
unsigned char key_driver(void)
{
static unsigned char key_state = 0; // 按键状态变量
static unsigned int key_time = 0; // 按键计时变量
unsigned char key_return;
key_return = N_KEY; // 清除 返回按键值
switch (key_state)
{
case 0: // 按键状态0按键按下
if (!KEY) key_state = 1; // 有按键按下
break;
case 1: // 按键状态1:软件消抖。按键有效的定义:按键持续按下超过设定的消抖时间。
if (!KEY)
{
key_time = 0; // 一次10ms
key_state = 2; // 进入 按键状态2, 继续判定到底是那种有效按键
}
else key_state = 0; // 如果按键时间没有超过,判定为误触,按键无效,返回 按键状态0,继续等待按键
break;
case 2: // 按键状态2:判定按键有效的种类:是单击,还是长按
if(KEY)
{
key_return = S_KEY; // 返回 有效按键值:单击
key_state = 0; // 返回 按键状态0,继续等待按键
}
else
{
key_time++;
if(key_time >= 200) // 如果按键时间超过2s, 则判定为 长按
{
key_return = L_KEY; // 返回 有效键值值:长按
key_state = 3; // 去状态3,等待按键释放
}
}
break;
case 3: // 等待按键释放
if (KEY) key_state = 0;
break;
default:
key_state = 0;
break;
}
return key_return; // 返回 按键值
}
|