项目里经常处理按键消抖 , 本来这个消抖的过程是与具体按下的键无关的 , 可以前的代码总
是在消抖的同时处理具体的按键值 , 再加上长按 短按 组合键混在一起 , 成一锅粥 . 最近在
一个项目中痛下决心 , 想弄个通用版本的 , 这样下个项目只要将文件包含一下 , 处理具体按
键值就可以了 , 不必再关心消抖部分的代码了 . 另外还发现 , 这样做可以同时做出几套不同
的按键处理方式 .
思路是 : 按照面向过程的编程方式 , 将数据与过程分离 . 把和按键状态相关的东西统统塞
到结构里 , 把消抖的代码放在一个函数中 .
//key.h 头文件 -------------------------------------------------------------
#ifndef _KEY_H
#define _KEY_H
#define _KEY_NONE 0
#define _HAS_NO_KEY 0
#define _HAS_KEY_DOWN 1
#define _HAS_KEY_SURE 2
#define _HAS_KEY_WAITUP 3
#define _REENTER 1
#define _NO_REENTER 2
typedef struct
{
WORD PreDownKey; // 上次检测到的键
BYTE KeyState; // 状态
WORD SameKeyCntr; // 同一键检测到按下的次数
WORD CurKey; // 当前检测到的键 , 用于处理长按的情况
BYTE (*KeyDownCallBack)(WORD, WORD); // 键确认按下的回调函数指针
void (*KeyUpCallBack)(WORD); // 键抬起的回调函数指针
} struct_KeyInfo;
void DitherlessKey(struct_KeyInfo* pInfo); // 消抖的处理函数
#endif//_KEY_H
// 消抖动的代码 --------------------------------------------------------------
#include "Key.h"
// 定时消抖的按键处理函数 , 通常在定时中断中调用 ,
void DitherlessKey(struct_KeyInfo* pInfo)
{
switch(pInfo->KeyState)