js 解决f按键事件冲突_实现S1,S2,User三个物理按键的独立事件上(解决思路分析)...

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

b27a795ea6261ebbce78e274e8c3e3fc.png

?扫码关注 HarmonyOS技术社区?

0e46126a0767b3f0dcca1d1b087acf1f.png

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

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

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

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

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

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

48cb5694e763d39ab68cfda256c84b3e.png

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

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

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

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

问题:ADC 是什么?ADC 指的是 Analog-to-Digital Convertor,即:模/数转换器。

在这个问题中,3 个物理按键的电压模拟值会被 ADC 转换为数字值(ADC值),并且电压值和 ADC 值是单纯的线性转换关系,所以,通过检测 ADC 值的变化就可以判断被按下的物理按键。

将表一中的电压范围通过公式转换为 ADC 范围: de6889145a91de449e485755576f9312.png 有了这张表之后,离解决问题就更近了一步,接下来看看相关 API 接口的示例:调用 hi_adc_read() 读取通道 7 的 ADC 值。

e07ad1c79e41746d56cb8e9ebf9fa455.png

函数 hi_adc_read() 第一个参数用于指定需要读取的 ADC 通道,第二个参数用于保存读取的 ADC 值。

对于我们这个问题来说,最关键的就是要知道 GPIO_5 对应的 ADC 通道是哪一个。

这时可以查阅文档《Hi3861V100/Hi3861LV100/Hi3881V100 WiFi芯片 用户指南》,在第 6 章中可以找到下面的表格:

df29fbe2b72f5809f9b45ea94b4f6b87.png

表6-2 中红框部分的对应关系指出:由于 Hi3861 数字管脚有限,故 GPIO_5 与 ADC_2 复用同一管脚。

So!在代码层面,可以通过 hi_adc_read() 读取 HI_ADC_CHANNEL_2 处的 ADC 值,进而判断 S1,S2,User 中被按下的按键。

OK!所有障碍已被扫清,这时可以用代码描述了:

f91ffc2285636d19a82cb27628773fb3.png

很显然,每次调用 GetSSU() 即可知道是否有键被按下,以及具体哪个键被按下。

6979729fa2133a7ab0171ff78d074ad1.png

看到此处,问题已彻底解决!!

PS:所查阅的文档以及最终示例代码均可在附件中下载。

Enjoy it!

b27a795ea6261ebbce78e274e8c3e3fc.png

?扫码关注 HarmonyOS技术社区?

0e46126a0767b3f0dcca1d1b087acf1f.png

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

e3c6545e3970dcee347fdd174e10b033.gif

“阅读原文”下载示例代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值