鸿蒙Hi3861开发板实现按键“按下事件”和“释放事件”的通用框架在《鸿蒙开发板外设控制》直播图文版(2020.10.28)后,我们提到:“开发板上的按键也可以看作是一个GPIO外设。”因此,要捕获按键的状态(按下或松开)必须操作对应的GPIO口,具体步骤如下:确定目标按键对应的GPIO引脚(可以通过设备文档找到对应关系)重新定义GPIO引脚的功能,设置数据传输方向为输入(WIFI_IOT_GPIO_DIR_IN)设置按键事件触发方式(level-triggered或edge-triggered),注册回调函数示例代码如下:代码说明:WIFI_IOT_IO_NAME_GPIO_8端口连接一个按键,如果需要捕获按键事件,需要调用IoSetFunc()函数重新定义端口函数调用IoSetPull()函数初始化端口PullUp调用GpioRegisterIsrFunc()函数设置按钮事件为边沿触发方式,专门针对下降沿触发,将自定义的OnButtonPressed()函数注册为按钮回调函数,即按键按下时调用这个函数从上面可以看出,每个下降沿都对应按键按下,那么上升沿显然对应按键释放;因此可以设置上升沿触发按键事件,即在按键松开时调用注册的回调函数。代码如下:GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH,OnButtonReleased,NULL);好的!接下来我们来思考一个问题:如果需要同时捕获按钮按下和释放两个事件,应该怎么写代码来实现呢?即:按下按钮时调用OnButtonPressed(),释放按钮时调用OnButtonReleased()。可能有些同学的第一个念头会是:注册两次不就结束了吗!!!代码中描述:这似乎是合理的,但不允许这样做!!!因为,目前每个GPIO端口只能注册一个回调函数;因此,第二次注册的信息将覆盖第一次注册的信息;触发回调OnButtonReleased()!那么是不是就不可能同时捕捉到按钮按下和松开两个事件呢?还不是呢,我们可以用下面的方法来实现。对应代码如下:初始回调注册:回调函数中的开关注册:看到这里,相信你已经掌握了同时捕获按下事件和释放事件的方法了。然而,即便如此,当程序需要使用多个按键时,我们也不得不一遍又一遍地编写几乎完全相同的代码。..这不好玩,我们的时间应该花在更有创意的工作上!所以,我把上面的方法封装成两个独立的文件(dt_btn_util.h和dt_btn_util.c),方便大家需要的时候一键调用!示例代码如下:是不是很简单?!一行代码即可捕获按下和释放事件。开箱即用的示例代码和打包文件。相关代码附件可下载原文:https://harmonyos.51cto.com/posts/1512更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com
