|
本帖最后由 夜乄歌 于 2019-9-19 09:31 编辑
工作中一直借鉴使用的安富莱的代码,感觉相当好用,思路也明确移植也方便,正好最近新搞了个STC8A的设备控制板,就将部分代码移植上去,跑的也比较顺畅,看了论坛几个关于按键的帖子,想着能不能再去添加点按键的功能,就在原F1按键的基础上修改,过滤掉了长按之后的短按事件(延时发送键值或者说松手发送键值),添加了双击使能功能(依旧要延时判断短按),所以在此献丑了,代码如下
头文件如下
- #ifndef __KEY_H__
- #define __KEY_H__
- #define KEY_COUNT 2 /* 按键个数, 按键增加需要修改 */
- /* 按键ID, 主要用于bsp_KeyState()函数的入口参数 */
- typedef enum
- {
- KID_K1 = 0,
-
- }KEY_ID_E;
- #define SMALL_CLICK 1
- #define LONG_CLICK 2
- #define DOUBLE_CLICK 3
- /*
- 按键滤波时间50ms, 单位10ms。
- 只有连续检测到50ms状态不变才认为有效,包括弹起和按下两种事件
- 即使按键电路不做硬件滤波,该滤波机制也可以保证可靠地检测到按键事件
- */
- #define KEY_FILTER_TIME 5
- #define KEY_LONG_TIME 200 /* 单位10ms, 持续2秒,认为长按事件 */
- #define KEY_DOUBLE_CLICK_TIME 20
- typedef struct
- {
- /* 下面是一个函数指针,指向判断按键手否按下的函数 */
- uint8_t (*IsKeyDownFunc)(void); /* 按键按下的判断函数,1表示按下 */
- uint8_t Count; /* 滤波器计数器 */
- uint16_t LongCount; /* 长按计数器 */
- uint16_t LongTime; /* 按键按下持续时间, 0表示不检测长按 */
- uint8_t State; /* 按键当前状态(按下还是弹起) */
- uint8_t RepeatSpeed; /* 连续按键周期 */
- uint8_t RepeatCount; /* 连续按键计数器 */
-
- uint8_t DoubleClickLongTime; /* 双击使能 */
- uint8_t DoubleClickCount;/* 双击计数 */
- }KEY_T;
- /*
- 定义键值代码, 必须按如下次序定时每个键的按下、弹起和长按事件
- 推荐使用enum, 不用#define,原因:
- (1) 便于新增键值,方便调整顺序,使代码看起来舒服点
- (2) 编译器可帮我们避免键值重复。
- */
- typedef enum //按键状态列表,添加按键需要对应进行添加
- {
- KEY_NONE = 0, /* 0 表示按键事件 */
- KEY_1_DOWN, /* 1键按下 */
- KEY_1_UP, /* 1键弹起 */
- KEY_1_LONG, /* 1键长按 */
- KEY_1_DOUBLE, /* 1键长按 */
-
- KEY_2_DOWN, /* 2键按下 */
- KEY_2_UP, /* 2键弹起 */
- KEY_2_LONG, /* 2键长按 */
- KEY_2_DOUBLE,
- KEY_3_DOWN, /* 3键按下 */
- KEY_3_UP, /* 3键弹起 */
- KEY_3_LONG, /* 3键长按 */
- KEY_3_DOUBLE,
-
- KEY_4_DOWN, /* 4键按下 */
- KEY_4_UP, /* 4键弹起 */
- KEY_4_LONG, /* 4键长按 */
- KEY_4_DOUBLE,
- KEY_5_DOWN, /* 4键按下 */
- KEY_5_UP, /* 4键弹起 */
- KEY_5_LONG, /* 4键长按 */
- KEY_5_DOUBLE,
- KEY_6_DOWN, /* 4键按下 */
- KEY_6_UP, /* 4键弹起 */
- KEY_6_LONG, /* 4键长按 */
- KEY_6_DOUBLE,
- KEY_7_DOWN, /* 4键按下 */
- KEY_7_UP, /* 4键弹起 */
- KEY_7_LONG, /* 4键长按 */
- KEY_7_DOUBLE,
- KEY_8_DOWN, /* 4键按下 */
- KEY_8_UP, /* 4键弹起 */
- KEY_8_LONG, /* 4键长按 */
- KEY_8_DOUBLE,
- KEY_9_DOWN, /* 4键按下 */
- KEY_9_UP, /* 4键弹起 */
- KEY_9_LONG, /* 4键长按 */
- KEY_9_DOUBLE,
- KEY_K1K2_DOWN, /* k1k2组合键键按下 */
- KEY_K1K2_UP, /* k1k2键弹起 */
- KEY_K1K2_LONG, /* k1k2键长按 */
- KEY_K1K2_DOUBLE,
- KEY_K2K3_DOWN, /* K2K3组合键键按下 */
- KEY_K2K3_UP, /* K2K3键弹起 */
- KEY_K2K3_LONG, /* K2K3键长按 */
- KEY_K2K3_DOUBLE,
- }KEY_ENUM;
- /* FIFO缓存事件大小 */
- #define KEY_FIFO_SIZE 10
- typedef struct
- {
- uint8_t Buf[KEY_FIFO_SIZE]; /* 键值缓冲区 */
- uint8_t Read; /* 缓冲区读指针1 */
- uint8_t Write; /* 缓冲区写指针 */
- uint8_t Read2; /* 缓冲区读指针2 */
- }KEY_FIFO_T;
- /* 供外部调用的函数声明 */
- void bsp_InitKey(void);
- void bsp_KeyScan(void);
- void bsp_PutKey(uint8_t _KeyCode);
- uint8_t bsp_GetKey(void);
- uint8_t bsp_GetKey2(void);
- uint8_t bsp_GetKeyState(KEY_ID_E _ucKeyID);
- void bsp_SetKeyParam(uint8_t _ucKeyID, uint16_t _LongTime, uint8_t _RepeatSpeed);
- void bsp_ClearKey(void);
- #endif
复制代码 脑仁比较小,暂时想到只有这么多,有更好的方法也希望大家多多分享讨论
|
|