鸿蒙开发板外设控制 之 实现按键“按下事件”和“释放事件”的通用框架(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
最新文章
- Net作业调度(二) -CrystalQuartz远程管理
- js日期字符串增加天数的函数
- <;s:textfield>;标签
- uva 11572 unique snowflakes——yhx
- python scp
- js中的if判断十分优美的简洁写法
- swift webView的高度自适应内容
- Linux下检测进程是否存在
- Compass 更智能的搜索引擎(3)--高亮,排序,过滤以及各种搜索
- java.lang.OutOfMemoryError: PermGen space 解决办法
- xshell 使用root 连接ubuntu server
- python 按照一个字典的值来对这个字典进行排序
- Average Sleep Time CodeForces - 808B (前缀和)
- 微信小程序wxml無法實現頁面跳轉的問題
- Mysql定时清空表
- Linux版的Mimikaz
- IDEA 在某个工程下一个module如何使用另一个module中的资源文件(.xml .prop等)
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
- 利用eChart绘制网页图表
- Power Profiles for Android
热门文章
- shiro入门学习--授权(Authorization)|筑基初期
- Multipath QUIC (MPQUIC): Design and Evaluation
- CDH5部署三部曲之三:问题总结
- java 画 哆啦A梦
- 在容器服务中获取客户端真实源 IP
- 程序员的“三十而已”,你都30岁了,不会还在XXX吧?
- 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (二)
- linux(centos8):安装prometheus服务端/node_exporter客户端(prometheus 2.18.1)
- 【服务总线 Azure Service Bus】ServiceBus 队列中死信(DLQ - Dead Letter Queue)问题
- Linux系统安装Redis(2020最新最详细)