[开发工具]

新定义MCU开发板测评 移植按键组件及对GPIO库函数的疑惑

[复制链接]
502|6
手机看帖
扫描二维码
随时随地手机跟帖
6552918|  楼主 | 2022-11-30 22:47 | 显示全部楼层 |阅读模式
1、按键检测组件简介
在嵌入式系统或单片机程序开发中,经常会使用到外部按键的触发,可能很多人一看到按键,感觉很简单,不就是电平触发,然后单片机去检测按键触发电平嘛,然后再用一个延时对按键进行消抖,然后编写按键触发需要处理的事物逻辑。对,实际的确如此,可是当出现一下现象和要求时,你该作何处理:
1) 要求系统不堵塞,实时性要好,那按键的消抖就不能直接使用死循环延时来解决,尽管 5-10 毫秒的延时可能不多,如果出现矩阵键盘,你作何处理,这会严重影响系统的实时性。
2) 尽量降低按键和整个工程的耦合性。大家在写程序的工程时应该会出现写着写着,发现程序变成了一团乱糊,每一个功能模块之间都有关联,每一个功能模块都不能独立存在,导致一旦出现 Bug,就很难针对性模块化的去查找和核对问题所在的地方。也许可以迅速定位问题出现的点,由于各个功能模块耦合性差,所以修改起来让你无从下手。
3) 当工程要求添加新的按键功能时,由于每一个功能模块耦合性差,彼此都有干涉,导致你无从下手。
4) 当要求同一个按键同时实现单击、双击、长安的功能时,你是不是要疯掉了。。。
5) 当客户要求将高电平触发变成低电平触发时,你是不是开始郁闷的大片大片的修改按键的初始化、按键的触发电平,不难,但改的挺多。针对以上情况,再使用那种比较“笨拙”、“死板”的按键检测方法,还能完美应对吗?我想是否定的。因此我们针对实际开发中遇见的种种的情况和要求,设计开发了一套能够兼容各种平台的按键检测组件

2、按键检测组件函数接口介绍
05e79a560863e8e1d2161b8f76d88547
2.1、 初始化按键
在使用这个组件时,必须调用 Init_Key_Struct 函数接口初始化一下这个按键检测组件,不初始化按键组件,是没法成功注册按键的。 该函数有一个返回值,返回 0 表示按键检测组件初始化成功;返回 1,表示按键检测组件初始化失败。
Init_Key_Struct 接口函数的入口参数配置如下:
1) void (*Update_Key_CallBack)(void)是一个函数指针,功能是用来更新注册了的按键的电平状态的,这个不能为 NULL,一定要添加。
2) void (*Debug_CallBack)(unsigned char *debug_mess)是一个函数指针,功能是用来打印按键组件的异常信息的,如果不需要打印按键组件异常信息,可以直接写 NULL。
2.2、 添加注册按键(注:如果按键已经注册过,那么再次注册会覆盖之前注册过的相同的按键)
初始完按键组件后,就可以注册按键了。调用 Reg_Key 函数接口来注册按键。 该函数有一个返回值,返回 0 表示注册按键成功;返回 1(表示注册的按键的触发回调函数为 NULL)或 2(表示按键注册数量已经达到上线,请修改宏定义 Key_Num_Max 的值),表示注册按键失败。
Reg_Key 接口函数的入口参数配置如下:
1) unsigned char *key_s 是要注册的按键的状态指针,将要注册的按键的地址写在这里便好。
2) const unsigned short count 是按键被按下后计数多少次进行按键触发,这个参数根据按键检测频率以及要求的手感进行编写。
3) Trig_Mode_TypeDef Trig_Mode_E 是按键电平触发模式,它是一个枚举变量(Trig_Mode_TypeDef),枚举变量定义如下: 8ae47884a5e452f35c9f7221907c28c0
4) Key_Mode_TypeDef Key_Mode_E 是按键模式,它是一个枚举变量(Key_Mode_TypeDef),枚举变量定义如下: 539b01f7c20776fd84e4743e57d3a64f
5) void (*Key_Click_CallBack)(void)是按键触发回调函数,它是一个函数指针,主要功能是用来存放按键要处理的事件代码。
2.3、 按键检测
Key_Detect 主要是用来检测按键的, 使用该函数接口时,需要周期性的调用,比如使用定时器器,以 5 毫秒的频率调用,或者放在大循环里以一个固定的周期调用。 该函数接口有一个返回值,如果返回 0,表示该函数接口一直在正常运行,如果返回 1,表示更新按键电平状态的回调函数 Update_Key_CallBack 为 NULL。

3、移植测试DEMO详解
先添加按键组件文件和测试DEMO文件
e0f717a3d755fef87dae8aa8a1eed53e
添加按键组件文件相关的头文件
03f6ada7fec42482c9fe9aabcbac679f
添加初始化函数
bd2bdb9b01e1d7daa728ee9161e8f0b3 024cccb6b6ab5c3f4566aa49c33914b8
通过延时实现周期按键检测(例程使用的是阻塞式,可通过定时器实现非阻塞式周期按键检测
261d41bdedd11620ebb89979ee17cab9
事件回调函数
389f92b15cfcd7b09d4405e9407bc6b5
按键检测函数
461a9761ed922af72f50ddc75ed7aaad
读取管脚状态函数让我有点疑惑,GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)应该直接返回KEY1_Pin的1或0即可,但实际返回是个8bit的数据,这块让我很难理解(使用时还要移位才行)。
c1d24f1a75e8eb8f3c633d6c747e463f
特别说明,要注册的按键事件大于10个,要修改这个宏。
de3e5e264586e43f443c52fb7746745b

至此,按键组件就移植完了,是不是很简单呢?希望对用按键的用户有所帮助
测试源码: NBK-RD8x3x Demo Code(KEY).zip (8.59 MB)

使用特权

评论回复
两只袜子| | 2022-12-1 09:31 | 显示全部楼层
很优秀的测评贴,大家可以共同学习学习

使用特权

评论回复
cranx| | 2022-12-1 19:10 | 显示全部楼层
不错

使用特权

评论回复
uytyu| | 2022-12-6 12:48 | 显示全部楼层
这个有具体的操作要求吗?              

使用特权

评论回复
6552918|  楼主 | 2022-12-6 14:00 | 显示全部楼层
uytyu 发表于 2022-12-6 12:48
这个有具体的操作要求吗?

你指哪些内容?

使用特权

评论回复
maqianqu| | 2022-12-6 14:50 | 显示全部楼层
感觉新定义好多的用法都跟以前不一样。

使用特权

评论回复
6552918|  楼主 | 2022-12-6 15:13 | 显示全部楼层
maqianqu 发表于 2022-12-6 14:50
感觉新定义好多的用法都跟以前不一样。

库不同版本改动比较大

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:北京汇冠触摸技术有限公司/电子工程师
简介:电子工程师,嵌入式应用爱好者。

100

主题

1175

帖子

4

粉丝