typedef struct {
unsigned char Value;
unsigned char State;
} KEY_EVENT;
// 按键扫描得到的键值存放在KeyBuffer中,包含键值及键状态
static volatile KEY_EVENT KeyBuffer;
按键消抖以及长按均是需要以时间为判断标准,我们在模块中定义消抖时间以及长按时间判决以及相应的状态宏
// 按键的扫描周期为20ms
#define WOBBLE_COUNT 1 // 按键消抖计数,1个按键扫描周期(20ms)
#define LONG_COUNT 100 // 长按100个扫描周期判断为长按(2S)
#define STATE_INIT 0x0 // 按键初始化状态
#define STATE_WOBBLE 0x1 // 按键消抖状态
#define STATE_LONG 0x2 // 按键长按检测状态
#define STATE_RELEASE 0x3 // 按键释放状态
#define STATE_DISABLE 0x4 // 按键禁用状态
完整的KeyStore()函数实现如下
static voidKeyStore(unsigned char Value)
{
static unsigned char LastValue;
switch (KeyState.State) {
case STATE_INIT: // 初始状等待按键
if (Value < KEY_NULL) {
// 记录下按下的键并进入消抖状态
LastValue = Value;
KeyState.TimeCount = WOBBLE_COUNT -1;
KeyState.State = STATE_WOBBLE;
}
break;
case STATE_WOBBLE:
if (KeyState.TimeCount) {
KeyState.TimeCount--; // 消抖计时未到
break;
}
// 消抖后再次判断为同一键值则认为键按下保存键值
// 并进入到长按检测
来源;21ic
关于控制,MCU就介绍完了,您有什么想法可以联系小编。