全功能按键非阻塞式实现
按键非阻塞式实现方案
标志位的定义
置标志位的时刻
状态图转移
按键接法
移植流程
•Key.h中
确定KEY_COUNT按键个数
定义每个按键的名称和索引号
•Key.c中
实现Key_Init按键引脚初始化的代码
实现Key_GetState读取按键引脚状态的代码
•main.c中
自行实现一个1ms定时中断,并在中断里调用Key_Tick函数
调用Key_Check函数,若指定按键的指定事件发生,则返回1,否则返回0
注意事项:
•在一轮主循环中,只能检查一次指定按键的指定事件(KEY_HOLD除外),若确实需要检查多次,则可先调用一次Key_Check函数并用变量存储返回值,后续多次判断此变量即可
•双击事件的存在,使得单击事件响应有一些延迟,若程序中没有使用到双击,则可将双击时间阈值改为0,这样可以消除单击事件的延迟
•按键产生了事件,对应的标志位就会一直置1,直到检查了此事件,才会自动清0,这在模式切换时可能会导致误动作(例如:模式1中没有检查过某个标志位,但是按下过按键,此标志位已经置1,随后切换为模式2,开始检查此标志位,那么一旦进入模式2,此标志位的动作就会立刻响应),解决办法是在切换模式时,统一将所有的Key_Flag清0,避免上一个模式的按键标志位对这个模式产生影响