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

HarmonyOS鸿蒙Next中实现S1,S2,User三个物理按键的独立事件-上(解决思路分析) 上一篇帖子《实现物理按键的“长按事件”(按键通用框架 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 按下之后红框位置 switch 处的电压肯定会发生变化,并且 S1 按下后的电压与 S2 按下后的电压不同。

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

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

通过实验发现这 3 个物理按键按下后的电压范围大致如下:

并且,通过查阅文档《Hi3861V100/Hi3861LV100 设备驱动 开发指南》中的第 5 章可以找到读取 ADC 值的 API 接口,以及 ADC 值到电压值的转换公式:

问题:ADC 是什么?

  • ADC 指的是 Analog-to-Digital Convertor,即:模/数转换器。

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

将表一中的电压范围通过公式转换为 ADC 范围:

有了这张表之后,离解决问题就更近了一步,接下来看看相关 API 接口的示例:调用 hi_adc_read() 读取通道7的 ADC 值。

对于我们这个问题来说,最关键的就是要知道 GPIO_5 对应的 ADC 通道是哪一个。这时可以查阅文档《Hi3861V100/Hi3861LV100/Hi3881V100 WiFi芯片 用户指南》,在第 6 章中可以找到下面的表格:

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

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

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

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

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

PS:所查阅的文档以及最终示例代码均可在文末点击下载。

Enjoy it!


作者:唐佐林

2 回复

在HarmonyOS鸿蒙Next中实现S1、S2、User三个物理按键的独立事件,可以通过以下步骤进行:

  1. 按键事件注册:首先,需要在系统中注册按键事件监听器。使用InputManager类来监听物理按键的按下和释放事件。通过InputManager.on('keyEvent', callback)方法,可以捕获按键事件。

  2. 按键识别:在事件回调函数中,通过KeyEvent对象获取按键的键码(keyCode)。根据键码判断是哪个物理按键被触发。例如,S1、S2、User三个按键分别对应不同的键码。

  3. 事件分发:根据识别到的按键键码,将事件分发到对应的处理函数。可以为每个按键定义独立的事件处理逻辑,确保每个按键的事件能够独立处理。

  4. 事件处理:在事件处理函数中,执行与按键相关的操作。例如,S1按键触发某个功能,S2按键触发另一个功能,User按键触发用户自定义功能。

  5. 事件去重:为了避免按键长按或多次触发导致的事件重复处理,可以在事件处理函数中加入去重逻辑。例如,通过时间戳或状态标志来判断是否已经处理过该事件。

  6. 测试与调试:完成代码编写后,进行测试,确保每个按键的事件能够正确触发并执行相应的操作。通过日志输出或调试工具,验证事件处理的正确性。

通过以上步骤,可以在HarmonyOS鸿蒙Next中实现S1、S2、User三个物理按键的独立事件处理。

更多关于HarmonyOS鸿蒙Next中实现S1,S2,User三个物理按键的独立事件-上(解决思路分析)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中实现S1、S2、User三个物理按键的独立事件,首先需要为每个按键注册独立的事件监听器。通过InputManager获取按键事件,使用KeyEvent类区分不同按键的按下和释放动作。为每个按键分配唯一的keyCode,并在事件回调中根据keyCode执行相应的逻辑。确保事件处理逻辑简洁高效,避免阻塞主线程。通过这种方式,可以独立处理每个按键的上、下事件,实现精准的按键响应。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!