按键扫描状态
- 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; // 返回 按键值
- }
|