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就介绍完了,您有什么想法可以联系小编。

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查