鸿蒙Hi3861开发板实现按键“按下事件”和“释放事件”的通用框架

开发
文章由鸿蒙社区产出,想要了解更多内容请前往:51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz

[[350165]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

在帖子 《鸿蒙开发板外设控制》直播图文版(2020.10.28) 中我们提到过:“开发板上的按键也可以看作一种 GPIO 外设。” 因此,要捕捉按键的状态(按下或释放)必须操作对应的 GPIO 端口,具体步骤如下:

  1. 确定目标按键对应的 GPIO 引脚(可通过设备文档找到对应关系)
  2. 重新定义 GPIO 引脚的功能,数据传输方向设置为输入(WIFI_IOT_GPIO_DIR_IN)
  3. 设置按键事件触发方式(电平触发或边沿触发),并注册回调函数

示例代码如下:

1t

代码说明:

  1. WIFI_IOT_IO_NAME_GPIO_8 端口连接了按键,若需要捕获按键事件需要调用 IoSetFunc() 函数重定义端口功能
  2. 调用 IoSetPull() 函数将端口初始电平拉高(Pull Up)
  3. 调用 GpioRegisterIsrFunc() 函数设置按键事件为边沿触发方式,具体为下降沿触发
  4. 将自定义的 OnButtonPressed() 函数注册为按键回调函数,即:按键被按下时调用此函数

2

综上可知,每个下降沿对应着按键按下,那么上升沿显然对应这按键释放;因此,可设置上升沿触发按键事件,即:按键释放时调用注册的回调函数。

代码如下:

GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8,

                                    WIFI_IOT_INT_TYPE_EDGE, 

                                    WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH,

                                    OnButtonReleased, NULL);

 

0K! 接下来我们思考一个问题:如果同时需要捕获按键按下和释放两个事件,如何写代码实现?即:按键按下时 OnButtonPressed() 被调用,按键释放时 OnButtonReleased() 被调用。

也许有同学的第一想法会是:注册两次不就完事了吗!!!

用代码描述就是:

3

这看起来似乎合情合理,但,这么做是不行滴!!!因为,就目前来说,每个 GPIO 口只能注册一个回调函数;所以,第二次注册的信息将覆盖第一次的注册信息;说得更直白些:这么写,只会在上升沿触发回调 OnButtonReleased() !

那么是不是就没法同时捕获按键按下和释放两个事件呢?

那到不是,我们可以采用下面的方法实现。

4

对应代码如下:

 

初始回调注册:

5

回调函数中切换注册:

6

看到这里,相信大家已经掌握了同时捕获按下事件和释放事件的方法了。然而,即便如此,当程序中需要使用多个按键时,我们不得不反复的编写几乎一模一样的代码。。。这并不是一件有趣的事,我们的时间应该花在更有创造性的工作上!所以,我把上面的方法封装到两个独立的文件(dt_btn_util.hdt_btn_util.c)中,方便大家需要时一键调用!

示例代码如下:

7

是不是很简单?!一行代码即可同时捕获按下事件和释放事件。

示例代码和封装好的文件在附件中开箱即用。

相关代码附件可以前往原文进行下载:https://harmonyos.51cto.com/posts/1512

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2020-11-09 11:43:51

长按事件

2020-11-18 11:56:06

鸿蒙Hi3861

2020-12-08 12:36:41

Hi3861 ADC驱动开发

2020-10-27 10:08:19

Hi3861ADC驱动

2020-11-02 12:07:11

鸿蒙 GPIO

2020-10-14 09:41:02

Hi3861GPIO点灯

2020-11-06 10:15:16

HiBurn

2020-10-14 09:37:03

HiBurn鸿蒙.bin文件

2020-10-28 10:03:43

Hi3861 GPIO点灯按键

2020-12-15 11:57:49

Hi3861 HarmonyOS开发板

2021-12-20 21:01:52

鸿蒙HarmonyOS应用

2020-12-09 09:44:29

Hi3861硬件介绍鸿蒙开发板

2021-06-25 15:32:13

鸿蒙HarmonyOS应用

2020-12-17 10:02:16

鸿蒙Hi3861开发板

2020-10-30 17:12:05

Hi3861

2020-10-30 17:42:36

鸿蒙 OS Hi386

2020-11-06 11:32:11

NV操作

2020-12-02 11:55:40

OLED

2020-10-29 09:53:06

Hi3861硬件开发板

2021-09-16 10:03:39

鸿蒙HarmonyOS应用
点赞
收藏

51CTO技术栈公众号