当前位置: 首页 > 科技观察

Harmonyos实现S1、S2、User-up三个物理按键的独立事件(方案思路分析)

时间:2023-03-13 03:59:02 科技观察

更多信息请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto。com/#zz上篇文章《实现物理按键的“长按事件”(按键通用框架 V0.0.2)》已经开源了DTButton–V0.0.2的完整代码。该版本的实现完全封装了Hi3861原生SDK,实现开箱即用,所见??即所得。不过,相信大家也发现了一个有趣的现象: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按下后,开关处的电压红框内肯定会发生变化,按下S1后的电压和按下S2后的电压是不一样的。所以可以考虑通过检测电压来判断按下的是哪个键!!!是不是看起来有点疯狂!不过,确实可以通过这种方式解决问题。通过实验发现,三个物理按键按下后的电压范围大致如下:并且,参考文档《Hi3861V100/Hi3861LV100 设备驱动 开发指南》的第5章,可以找到读取ADC值的API接口,转换从ADC值到电压值的公式:问题:什么是ADC?ADC是指Analog-to-DigitalConverter,即:模拟/数字转换器。在这道题中,三个物理按键的电压模拟值会被ADC转换成数字值(ADC值),电压值与ADC值的关系是纯线性转换关系,所以可以通过检测ADC值的变化来判断。按下物理键。通过公式将表1中的电压范围转换为ADC范围:有了这张表,你离解决问题又近了一步。接下来看相关API接口的例子:调用hi_adc_read()读取通道7的ADC值。函数hi_adc_read()第一个参数用于指定要读取的ADC通道,第二个参数用于保存读取的ADC值。对于我们的问题,最重要的是要知道GPIO_5对应的是哪个ADC通道。这时候可以参考文档《Hi3861V100/Hi3861LV100/Hi3881V100 WiFi芯片 用户指南》,在第6章可以找到下表:表6-2中红框的对应关系表示由于Hi3861数字管脚有限,所以GPIO_5和ADC_2多路复用相同的引脚。所以!在代码层面,可以通过hi_adc_read()读取HI_ADC_CHANNEL_2处的ADC值,进而判断S1、S2、User中按下的按键。好的!一切障碍都扫清了,现在可以用代码来描述了:很明显,每次调用GetSSU()时,都可以知道是否按下了某个键,以及按下了哪个键。看到这里,问题就彻底解决了!!PS:参考的文档和最终的示例代码可以在附件中下载。好好享受!要了解更多信息,请访问:Harmonyos.com/#zz