![HarmonyOS IoT设备开发实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/36/40795036/b_40795036.jpg)
2.3 使用GPIO模块实现按键输入
本节将介绍如何使用HarmonyOS IoT硬件子系统的GPIO模块的相关API,通过按键控制LED灯的状态。
2.3.1 HarmonyOS IoT硬件子系统的GPIO模块与输入相关的API
HarmonyOS IoT硬件子系统的GPIO模块与输入相关的API和功能描述见表2-3。
表2-3
![](https://epubservercos.yuewen.com/E6CF3C/21190706008522906/epubprivate/OEBPS/Images/41175_62_1.jpg?sign=1738958542-lEV4hvEi3s65SFxSGnIKbA7DRcNJoIFY-0-7bc82a5806f59b5de8e8a4d719c16b44)
通过HarmonyOS IoT硬件子系统的GPIO模块的相关API实现输入功能,主要有两种方式:
(1)查询方式,应用代码通过GpioGetInputVal主动获取引脚状态。
(2)中断方式,应用代码通过GpioRegisterIsrFunc向系统注册一个中断处理函数。当状态发生改变时,该中断处理函数会被系统调用,相应的代码会被执行。
2.3.3节和2.3.4节将通过代码实例演示如何使用以上两种方式,实现通过USER按键控制LED1灯亮和灭。
2.3.2 核心板USER按键部分的原理图说明
核心板USER按键部分的原理如图2-10所示。
![](https://epubservercos.yuewen.com/E6CF3C/21190706008522906/epubprivate/OEBPS/Images/41175_63_1.jpg?sign=1738958542-bSbGPzc7afoBalgK7gh2bdqM3J4SDn1u-0-e29c9654fa4ba9c6a9a00a101dd80fd6)
图2-10
在原理图中,S2 按键的一端和主控芯片的 GPIO05 引脚连接,S2 按键的另一端接地。因此,当按键被按下时,GPIO05 引脚将会接地,即处于低电平状态。
2.3.3 通过查询GPIO状态控制LED灯
1.创建gpio_input_set.c文件
在 OpenHarmony 源代码的 applications/sample/wifi-iot/app/目录下创建gpio_demo目录,在该目录下创建名为gpio_input_get.c的文件:
![](https://epubservercos.yuewen.com/E6CF3C/21190706008522906/epubprivate/OEBPS/Images/41175_63_2.jpg?sign=1738958542-8P2Y72rJVrK4VZiczTVgwVjkpUEDlEBz-0-9b21fbef07f43703ec4909d657b06c2b)
![](https://epubservercos.yuewen.com/E6CF3C/21190706008522906/epubprivate/OEBPS/Images/41175_64_1.jpg?sign=1738958542-v53sPShxuLyHAiGSVChxzrC2vhSYV5W5-0-bb89d15a491198828396ff987c23501a)
2.创建BUILD.gn文件
在applications/sample/wifi-iot/app/gpio_demo目录下,创建BUILD.gn文件,将内容填充为:
![](https://epubservercos.yuewen.com/E6CF3C/21190706008522906/epubprivate/OEBPS/Images/41175_64_2.jpg?sign=1738958542-zydPTi2jqkMlo8nwXwvH7QNZVksuX7Yx-0-b9220147f39050ef050f278bef10430b)
![](https://epubservercos.yuewen.com/E6CF3C/21190706008522906/epubprivate/OEBPS/Images/41175_65_1.jpg?sign=1738958542-WuyJVx6pWCvL4yoLqX4qUQOOmPzHUyq6-0-8fbd1174a98f03b5b8d916d18be2cbf8)
3.编译gpio_input_set.c文件
修改完BUILD.gn文件后,按以下步骤进行编译:
(1)修改applications/sample/wifi-iot/app目录下的BUILD.gn文件,将其中的features值修改为“gpio_demo”,修改后的主要内容如下:
![](https://epubservercos.yuewen.com/E6CF3C/21190706008522906/epubprivate/OEBPS/Images/41175_65_2.jpg?sign=1738958542-QGtPCTQj86WsXWYDELcIiVpPzOJSpVOG-0-2d2fa294657a93144529192c0b94e7c6)
(2)在OpenHarmony源代码的顶层目录下执行python build.py wifiiot命令,开始编译。
在编译成功后,在out/wifiiot子目录下可以找到编译生成的二进制文件。
4.烧录和运行
在编译成功后,即可将编译生成的二进制文件烧录到开发板,具体的操作步骤参考2.1节的相关描述。
在烧录完成后,按下复位按键,程序将会运行。在程序运行后,通过串口调试工具可以查看串口输出的日志,可编程 LED 灯应为熄灭状态。因为在代码中设置了上拉,因此在按键没有被按下时读取到的状态一定为高电平,而当GPIO09输出高电平时,LED灯应为熄灭状态。
此时,按下 USER按键,LED灯将会亮,松开 USER按键后,LED灯将会熄灭。
2.3.4 通过注册GPIO中断控制LED灯
1.创建gpio_input_int.c文件
在OpenHarmony源代码的applications/sample/wifi-iot/app/gpio_demo目录下创建gpio_input_int.c文件,将内容填充为:
![](https://epubservercos.yuewen.com/E6CF3C/21190706008522906/epubprivate/OEBPS/Images/41175_66_1.jpg?sign=1738958542-btFr6KDQF5T0iEi0GuPfnGqwAORoUusp-0-cbbc91bf7fdae43177a69de11a8c90fb)
![](https://epubservercos.yuewen.com/E6CF3C/21190706008522906/epubprivate/OEBPS/Images/41175_67_1.jpg?sign=1738958542-Glrl1KImUlzrzuhSBjU48YkfyWLqnGZy-0-7029eea266ed8ec84cf5751d61afc8f7)
2.编译gpio_input_int.c文件
在创建完gpio_input_int.c文件后,按以下步骤进行编译:
(1)修改 applications/sample/wifi-iot/app/gpio_demo 目录下的 BUILD.gn文件,将其中的sources值修改为“gpio_input_int.c”,修改后的主要内容如下:
![](https://epubservercos.yuewen.com/E6CF3C/21190706008522906/epubprivate/OEBPS/Images/41175_67_2.jpg?sign=1738958542-992mxraNoQGJ5SLKr3FLFyHrO13hskEq-0-0ad47bf3766a77b075d0d9b0af1553d3)
![](https://epubservercos.yuewen.com/E6CF3C/21190706008522906/epubprivate/OEBPS/Images/41175_68_1.jpg?sign=1738958542-dyH1gqTwhOvGDBH1TVON8TCi8YuWuDcM-0-7f7b74b8918ccac1f1e20d663d41adaf)
(2)在OpenHarmony源代码的顶层目录下执行python build.py wifiiot命令,开始编译。
在编译成功后,在out/wifiiot子目录下可以找到编译生成的二进制文件。
3.烧录和运行
在编译成功后,即可将编译生成的二进制文件烧录到开发板,具体的操作步骤参考2.1节的相关描述。
在烧录完成后,按下复位按键,程序将会运行。在程序运行后,通过串口调试工具可以查看串口输出的日志,可编程 LED 灯应为亮起状态。因为g_ledPinValue变量的默认值为 WIFI_IOT_GPIO_VALUE0,把 GPIO09 引脚的输出状态设置为该值后将会输出低电平。
按下 USER 按键,LED灯将会熄灭,在松开 USER按键后,LED灯仍然熄灭,再次按下USER按键后,LED灯亮,再次松开USER按键后LED灯仍然亮。重复多次可以发现,每当 USER 按键被按下时 LED 灯的亮和灭会发生一次改变。