鸿蒙开发板外设控制 之 实现按键“按下事件”和“释放事件”的通用框架(V0.0.1)
在帖子 《鸿蒙开发板外设控制》直播图文版(2020.10.28) 中我们提到过:“开发板上的按键也可以看作一种 GPIO 外设。” 因此,要捕捉按键的状态(按下或释放)必须操作对应的 GPIO 端口,具体步骤如下:
1、确定目标按键对应的 GPIO 引脚(可通过设备文档找到对应关系)
2、重新定义 GPIO 引脚的功能,数据传输方向设置为输入(WIFI_IOT_GPIO_DIR_IN)
3、设置按键事件触发方式(电平触发或边沿触发),并注册回调函数
示例代码如下:

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

综上可知,每个下降沿对应着按键按下,那么上升沿显然对应这按键释放;因此,可设置上升沿触发按键事件,即:按键释放时调用注册的回调函数。
代码如下:
GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8,
WIFI_IOT_INT_TYPE_EDGE,
WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH,
OnButtonReleased, NULL);
0K! 接下来我们思考一个问题:如果同时需要捕获按键按下和释放两个事件,如何写代码实现?即:按键按下时 OnButtonPressed() 被调用,按键释放时 OnButtonReleased() 被调用。
也许有同学的第一想法会是:注册两次不就完事了吗!!!
用代码描述就是:

这看起来似乎合情合理,但,这么做是不行滴!!!因为,就目前来说,每个 GPIO 口只能注册一个回调函数;所以,第二次注册的信息将覆盖第一次的注册信息;说得更直白些:这么写,只会在上升沿触发回调 OnButtonReleased() !
那么是不是就没法同时捕获按键按下和释放两个事件呢?
那到不是,我们可以采用下面的方法实现。

对应代码如下:
初始回调注册:

回调函数中切换注册:

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

是不是很简单?!一行代码即可同时捕获按下事件和释放事件。
示例代码和封装好的文件在附件中开箱即用。
PS:
dt_btn_util.c 的代码实现中加入了一个小技巧,你能看明白吗?可以评论区回复哦!
Enjoy it!
作者:唐佐林
想了解更多内容,请访问:
51CTO和华为官方战略合作共建的鸿蒙技术社区
https://harmonyos.51cto.com#bky
鸿蒙开发板外设控制 之 实现按键“按下事件”和“释放事件”的通用框架(V0.0.1)的更多相关文章
- 鸿蒙开发板外设控制 之 实现物理按键的“长按事件”(按键通用框架 V0.0.2)
我在之前的帖子<实现按键"按下事件"和"释放事件"的通用框架(V0.0.1)>中阐述了DTButton-V0.0.1的设计思路,并且也在帖子中开源了 ...
- STC-51开发板-单片机控制数码管&按键&点阵综合操作
操作: 实现按下一个按键,对应的数码管和点阵显示相应的数字 代码: /* *******************数码管按键综合项目********************* */ #include ...
- 【鸿蒙开发板试用报告】用OLED板实现FlappyBird小游戏(中)
小伙伴们久等了,在上一篇<[开发板试用报告]用OLED板实现FlappyBird小游戏(上)>中,我们本着拿来主义的原则,成功的让小鸟在OLED屏幕上自由飞翔起来,下面我们将加入按钮交互功 ...
- iTOP-4412嵌入式开发板ioremap控制GPIO寄存器
转自迅为电子技术论坛:http://bbs.topeetboard.com GPIO 的寄存器通过 ioremap函数转换之后,可以通过直接控制虚拟地址来控制物理地址(寄存器的实际地址),这样就实现 ...
- zynq开发板外设配置演示
有幸得到米尔电子zynq系列开发板Z-turn Board试用体验,下面说说我这款zynq系列的Z-TURN板子外设配置.从Z-turn Board原理图上看,目前可以配置的FPGA管脚大概有100多 ...
- 【开发实录】在鸿蒙开发板上使用websocket(移植自librws库)
librws: Tiny, cross platform websocket client C library 相关代码可在下面下载,也可进入librws: 将librws移植到鸿蒙Hi_3861开发 ...
- 【单片机入门】(四)应用层软件开发的单片机学习之路-----ESP32开发板PWM控制电机以及中断的使用
引言 各位大佬,晚上好啊,在上一篇博客中,我们讲了什么是UART串口通讯,以及使用USB转TTL使得单片机可以和c#上位机做一个串口通讯,接下来,为大家带来PWM的概念原理,以及实际案例,使用PWM对 ...
- 【鸿蒙开发板试用报告】用OLED板实现FlappyBird小游戏(上)
总是做各种Demo,是时候做个什么小应用来练练手了.踌躇了很久,果然还是搞个小游戏才有意思.想到几年前风靡全球的FlappyBird,一个屏幕一个按钮就足够了,正好适合.OLED屏幕.按键的驱动已经有 ...
- (转载)跟Classic ARM 处理器说拜拜——Atmel SAMA5D3 Xplained开发板评测
2014 年 4 月 10 日 时间: 下午 3:15 作者: 幸得安然 电子产业的蓬勃发展带来了史无前例的生活.生产大跃进,但是,人们在享受发展喜悦的同时又不得不面临现实现状的囧境--在以移动电子设 ...
随机推荐
- 初探电波钟(A Brief Introduction Of Radio Controlled Clock AND Its Appliciations)
文档标识符:Radio_Controlled_Clock_T-D-P11 作者:DLHC 最后修改日期:2020.10.12 本文链接:https://www.cnblogs.com/DLHC-TEC ...
- dict, hash
dict: dictKey -- > dictVal example: dictEntry *dictFind(dict *d, const void *key) Key is like ...
- 浅谈Python常用英文单词
一.交互式环境与print输出 1.print:打印/输出2.coding:编码3.syntax:语法4.error:错误5.invalid:无效6.identifier:名称/标识符7.charac ...
- spring-boot-route(十六)使用logback生产日志文件
日志是一个系统非常重要的一部分,我们经常需要通过查看日志来定位问题,今天我们一起来学习一下Spring Boot的日志系统.有很多同学习惯性的在生产代码中使用System.out来输出日志,这是不推荐 ...
- 解决React前端在开发环境的跨域问题
在前后端分离的分布式架构中,跨域是一道无法绕过去的门槛,众所周知,生产环境上解决跨域最便捷的方式是使用Nginx来处理,那么,在本地开发环境又该如何处理呢? React框架里处理跨域问题,可以使用ht ...
- lumen 添加配置
app同级目录新建config目录 添加配置文件 bootstrap/app.php里面加载 $app->configure('options');使用 $router->get('/', ...
- arcgis activeX 安全提示消除办法
点击任何的一个ArcToolBox 工具,光标落在参数输入框时,会提示 "在此页面上的ActiveX控件和本页上的其他部分的交互可能不安全.你想允许这种交互操作吗? " 消除办法 ...
- 2018HUAS_ACM暑假比赛5题解
目录 Problem A Problem B Problem C Problem D Problem E Problem F Problem A 思路 这是一道带权并查集问题 因为只有三种种类,我们分 ...
- APP反编译Xposed-Fdex2脱壳
1.首先手机安装Xposed(app) 2.安装Fdex2(app) 3.打开Fdex2 4.点击要脱壳的app 5.adb pull (点击脱壳app时候弹出的来的路径) 保存本地路径 6.完结-. ...
- Scala编程 笔记
date: 2019-08-07 11:15:00 updated: 2019-11-25 20:00:00 Scala编程 笔记 1. makeRDD 和 parallelize 生成 RDD de ...