专栏名称: 51CTO技术栈
有趣 | 有料 | 有内涵,为您提供最优质的内容,愿我们一起悦享技术,成就人生。
目录
相关文章推荐
51好读  ›  专栏  ›  51CTO技术栈

实现S1,S2,User三个物理按键的独立事件-上(解决思路分析)

51CTO技术栈  · 公众号  · 程序员  · 2020-11-11 18:05

正文

上一篇帖子 《实现物理按键的“长按事件”(按键通用框架 V0.0.2)》 中开源了 DTButton – V0.0.2 的完整代码,这个版本的实现完全封装了 Hi3861 的原生 SDK,实现了开箱即用,所见即所得。


👇 扫码关注 HarmonyOS技术社区 👇

专注开源技术,共建鸿蒙生态

然而,相信大家也发现了一个有趣的现象:S1,S2 和 User 三个物理按键同时对应了 GPIO_5 端口。

程序中将 GPIO_5 作为按键端口连接使用后,无论按下 S1,S2,User 中的哪一个都会触发事件,就好像“同一个 GPIO 按键有了3个不同分身”。


为什么会这样呢?因为在硬件连接上,这三个物理按键确实共用了 GPIO_5 ,所以才有了这个问题。


那么,怎么解决这个问题呢?


就目前来看,想要区分 S1,S2 和 User 只能从电气特性来入手了,根据上图中黄色下划线处的提示翻看原理图 《HiSpark_WiFi_IoT_OLED_VER.A》 ,可以发现 S1 和 S2 的连接如下:

明显可知: S1 和 S2 按下之后红框位置 Switch 处的电压肯定会发生变化,并且 S1 按下后的电压与 S2 按下后的电压不同。


所以,可以考虑通过检测电压的方式来判断究竟哪个键被按下了!!!


看起来是不是有点疯狂!然而,确实可以这么解决问题。


通过实验发现这 3 个物理按键按下后的电压范围大致如下:
并且,通过查阅文档 《Hi3861V100/Hi3861LV100 设备驱动 开发指南》 中的第 5 章可以找到读取 ADC 值的 API 接口,以及 ADC 值到电压值的转换公式:






请到「今天看啥」查看全文