1、按键检测组件简介
在嵌入式系统或单片机程序开发中,经常会使用到外部按键的触发,可能很多人一看到按键,感觉很简单,不就是电平触发,然后单片机去检测按键触发电平嘛,然后再用一个延时对按键进行消抖,然后编写按键触发需要处理的事物逻辑。对,实际的确如此,可是当出现一下现象和要求时,你该作何处理:
1) 要求系统不堵塞,实时性要好,那按键的消抖就不能直接使用死循环延时来解决,尽管 5-10 毫秒的延时可能不多,如果出现矩阵键盘,你作何处理,这会严重影响系统的实时性。
2) 尽量降低按键和整个工程的耦合性。大家在写程序的工程时应该会出现写着写着,发现程序变成了一团乱糊,每一个功能模块之间都有关联,每一个功能模块都不能独立存在,导致一旦出现 Bug,就很难针对性模块化的去查找和核对问题所在的地方。也许可以迅速定位问题出现的点,由于各个功能模块耦合性差,所以修改起来让你无从下手。
3) 当工程要求添加新的按键功能时,由于每一个功能模块耦合性差,彼此都有干涉,导致你无从下手。
4) 当要求同一个按键同时实现单击、双击、长安的功能时,你是不是要疯掉了。。。
5) 当客户要求将高电平触发变成低电平触发时,你是不是开始郁闷的大片大片的修改按键的初始化、按键的触发电平,不难,但改的挺多。针对以上情况,再使用那种比较“笨拙”、“死板”的按键检测方法,还能完美应对吗?我想是否定的。因此我们针对实际开发中遇见的种种的情况和要求,设计开发了一套能够兼容各种平台的按键检测组件
2、按键检测组件函数接口介绍
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),枚举变量定义如下:
4) Key_Mode_TypeDef Key_Mode_E 是按键模式,它是一个枚举变量(Key_Mode_TypeDef),枚举变量定义如下:
5) void (*Key_Click_CallBack)(void)是按键触发回调函数,它是一个函数指针,主要功能是用来存放按键要处理的事件代码。
2.3、 按键检测
Key_Detect 主要是用来检测按键的, 使用该函数接口时,需要周期性的调用,比如使用定时器器,以 5 毫秒的频率调用,或者放在大循环里以一个固定的周期调用。 该函数接口有一个返回值,如果返回 0,表示该函数接口一直在正常运行,如果返回 1,表示更新按键电平状态的回调函数 Update_Key_CallBack 为 NULL。
3、移植测试DEMO详解
先添加按键组件文件和测试DEMO文件
添加按键组件文件相关的头文件
添加初始化函数
通过延时实现周期按键检测(例程使用的是阻塞式,可通过定时器实现非阻塞式周期按键检测)
事件回调函数
按键检测函数
读取管脚状态函数让我有点疑惑,GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)应该直接返回KEY1_Pin的1或0即可,但实际返回是个8bit的数据,这块让我很难理解(使用时还要移位才行)。
特别说明,要注册的按键事件大于10个,要修改这个宏。
至此,按键组件就移植完了,是不是很简单呢?希望对用按键的用户有所帮助
测试源码:
NBK-RD8x3x Demo Code(KEY).zip
(8.59 MB)
|