硬汉嵌入式论坛

 找回密码
 立即注册
查看: 275|回复: 2
收起左侧

[STM32H7] 按键功能 优化

[复制链接]

2

主题

8

回帖

14

积分

新手上路

积分
14
发表于 2024-4-9 23:48:40 | 显示全部楼层 |阅读模式
按键代码优化,主要有以下几点:
1. 统一按键编码,单个按键以及组合按键
[C] 纯文本查看 复制代码
typedef enum
{
	KeyID_None = 0,
	KeyID_SingKey_Begin = KeyID_None,
	KeyID_K1,
	KeyID_K2,
	KeyID_K3,
	KeyID_JOY_U,
	KeyID_JOY_D,
	KeyID_JOY_L,
	KeyID_JOY_R,
	KeyID_JOY_OK,
	KeyID_SingKey_End,
	KeyID_CombKey_Begin,
	KeyID_Comb_K13,
	KeyID_Comb_K23,
	KeyID_CombKey_End
} key_id_e;


使用 额外的枚举值生成宏变量, 为 bsp_key.c 文件提供按键数目信息
[C] 纯文本查看 复制代码
#define KEY_SINGLE_NUM  (KeyID_SingKey_End - KeyID_SingKey_Begin - 1)
#define KEY_COMB_NUM    (KeyID_CombKey_End - KeyID_CombKey_Begin - 1)
#define KEY_TOTAL_NUM   (KEY_SINGLE_NUM + KEY_COMB_NUM)


2. 使用函数指针,屏蔽底层
1 和 2 确保了 bsp_key.c 和具体设备无关, 不同开发板代码移植时,只需要修改 bsp_key.h 的枚举类型 key_id_e 以及 bsp_key_ll.c 文件,后者提供了底层实现
3. 尽可能将结构体放在  bsp_key.c 文件,
4. 按键缓冲中每个buffer 存放 uint8_t 类型,该类型包含按键 ID 和 按键状态信息
[C] 纯文本查看 复制代码
#define GET_KEY_CODE(id, status)  (uint8_t)(((uint8_t)status << 5) + ((uint8_t)id & 0x1F))
#define GET_KEY_ID(code)          (key_id_e)(code & 0x1F)
#define GET_KEY_STATE(code)       (key_state_e)(code >> 5)


5. 待优化:
bsp_KeyScan10ms 不需要暴露出来,而是在 bsp_InitKey 将函数注册到 定时扫描函数数组,
按键状态也支持函数注册,当某个按键状态发生时,调用之前注册的函数。


细节都在代码中,就4个文件不同,bsp_key.c, bsp_key.h, bsp_key_ll.c 以及 bsp_key_ll.h

1_Key.zip

2.88 MB, 下载次数: 9

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2024-4-10 09:54:06 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

2

主题

269

回帖

275

积分

高级会员

积分
275
发表于 2024-4-10 20:52:15 | 显示全部楼层
不考虑0x1abin/MultiButton的么,防抖更强哦
#define DEBOUNCE_TICKS    3        //MAX 7 (0 ~ 7)

[C] 纯文本查看 复制代码

/*------------button debounce handle---------------*/
	if(read_gpio_level != handle->button_level) { //not equal to prev one
		//continue read 3 times same new level change
		if(++(handle->debounce_cnt) >= DEBOUNCE_TICKS) {
			handle->button_level = read_gpio_level;
			handle->debounce_cnt = 0;
		}
	} else { //level not change ,counter reset.
		handle->debounce_cnt = 0;
	}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 17:59 , Processed in 0.174177 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表