99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

程序員小哈
認證:優質創作者
作者動態
自動洗碗機綜合實例第二講 - 最小系統核心板PCB繪制
2024-07-18 09:21
自動洗碗機綜合實例第一講 - 最小系統核心板原理圖繪制
2024-07-16 09:40
線路板焊接的干貨都在這里呢
2024-07-14 12:08
基于單片機的智能風扇DIY總結
2024-07-13 14:42
基于HAL庫實現按鍵(外部中斷)翻轉一個LED
2024-06-30 14:02

基于鴻蒙OS的按鍵驅動

按鍵作為常用的輸入系統,如何準確并高效的獲取按鍵值,是一個經常要面對的問題,今天我們看看在鴻蒙系統中,如何得到獨立按鍵的按鍵值。

實現目標

我們這次以Hi3861核心板左下角的USER按鍵S2為例,當按鍵按下時,通過USB Type-c對應的串口輸出信息。

按鍵S2在實物中的對應關系如下圖黃線所示:

按鍵原理圖

核心板左下角的按鍵S2的原理圖如下:

當S2被按下之后,GPIO05與GND相連,此時GPIO05輸入為低電平。

代碼實現

實現方式一:讀取輸入IO的狀態
#include <stdio.h>

#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_errno.h"

static void Key_Task(const char* arg)
{	
    (void)arg;
	
    printf("Enter the Key_Task ... \n");
	
    while (1) 
    {
        WifiIotGpioValue wigv;

        GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5,&wigv);

        if (wigv == WIFI_IOT_GPIO_VALUE0)
        {
            usleep(10*1000);        //10ms

            while(1)
            {
                GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5,&wigv);
                if (wigv == WIFI_IOT_GPIO_VALUE1){
                    printf("[DEMO] GPIO05 Low level.\n");
                    break;
                }        
            }                           
        }
    }

    return;
}

static void KeyExampleEntry(void)
{
    unsigned int ret = 0;
    GpioInit();
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
    GpioSetDir(WIFI_IOT_GPIO_IDX_5, WIFI_IOT_GPIO_DIR_IN);

    if (ret != WIFI_IOT_SUCCESS)
    {
        printf("===== ERROR ======gpio -> GpioSetDir ret:%d\r\n", ret);
        return;
    }
	
    osThreadAttr_t attr = {0};
	
    attr.name = "Key_Task";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024;
    attr.priority = osPriorityNormal;
	
    if(osThreadNew((osThreadFunc_t)Key_Task,NULL,&attr) == NULL)
    {
        printf("Failed to create Key_Task !\n");
    }	
}

SYS_RUN(KeyExampleEntry);

編譯代碼:

python build.py wifiiot

更新固件之后重啟最小系統板,打開串口助手,點擊核心板上的USER按鍵S2,串口助手輸出信息如下:

注意:此實例新建了一個任務用于循環讀取按鍵的狀態,KeyExampleEntry作為應用程序的入口函數,不能隨意使用while(1)這種耗時的操作,必須快速返回,否則會妨礙鴻蒙OS中其他應用程序的運行,因此,在這個入口函數中創建一個按鍵狀態監測的專屬任務(線程)用于判斷按鍵的狀態。

GPIO中斷

通過上面的原理圖我們可知,當按鍵S2沒有被按下的時候,GPIO05為默認狀態高電平,當按鍵S2被按下時,GPIO05與GND相連,GPIO05被拉低,當松開按鍵S2的時候,GPIO05又恢復高電平。

在此過程中,當按鍵S2被按下時,GPIO05會收到一個由高到低的電平變化,我們稱這個過程為下降沿;當按鍵S2被松開時,GPIO05會收到一個由低到高的電平變化,我們稱這個過程為上升沿。

綜上所述,在不考慮抖動影響的前提下,每次按鍵被按下,GPIO05將會收到一個下降沿;按鍵被釋放,GPIO05會收到一個上升沿。

我們在GPIO05這個引腳上注冊一個邊沿觸發函數(上升沿或者下降沿觸發都可以),那么這個注冊的邊沿觸發回調函數被調用一次,理論上就是有一次按鍵的動作發生。

#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_errno.h"

/* gpio callback func */
void gpio5_isr_func(char *arg)
{
    (void)arg;
    printf("----- gpio05 isr success -----\r\n");
}

static void KeyExampleEntry(void)
{
    unsigned int ret = 0;
    GpioInit();
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
    GpioSetDir(WIFI_IOT_GPIO_IDX_5, WIFI_IOT_GPIO_DIR_IN);
    //IoSetPull(WIFI_IOT_GPIO_IDX_5,WIFI_IOT_IO_PULL_UP);
    
    if (ret != WIFI_IOT_SUCCESS) 
    {
        printf("===== ERROR ======gpio -> GpioSetDir ret:%d\r\n", ret);
        return;
    }
    ret = GpioRegisterIsrFunc(WIFI_IOT_GPIO_IDX_5,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH, gpio5_isr_func, NULL);
    if (ret != WIFI_IOT_SUCCESS) 
    {
        printf("===== ERROR ======gpio -> hi_gpio_register_isr_function ret:%d\r\n", ret);
    }
}

SYS_RUN(KeyExampleEntry);
代碼說明:
  1. WIFI_IOT_IO_NAME_GPIO_5是與按鍵S2相連的GPIO,要實現按鍵中斷捕獲,需要先使用IoSetFunc() 函數進行端口功能重定義;

  2. 調用GpioSetDir()函數,設置GPIO05為輸入,并通過IoSetPull() 函數將端口設置為上拉輸入(Pull Up);

  3. 調用GpioRegisterIsrFunc()函數,完成GPIO05和回調函數gpio5_isr_func()的注冊綁定,設置觸發模式為上升沿觸發:WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH,當按鍵S2被抬起的時候,產生上升沿,觸發回調函數gpio5_isr_func()工作。

通過上面兩種方式,我們學會了獨立按鍵狀態的獲取、鴻蒙系統中如何創建任務和外部中斷的使用,利用此代碼,我們還可以用于識別熱釋紅外傳感器的響應信號。

小哈有話說

最近在鴻蒙交流群中看到下面一大批開發板要移植鴻蒙操作系統了,等到這些廠商將板卡移植好了,那么鴻蒙就真的成氣候了,作為一個嵌入式開發者,學習一個實時操作系統是必不可少的,學什么都是學,為什么不學一個有前途的呢?

歡迎關注

程序員小哈帶你玩轉嵌入式,搜索:嵌入式從0到1,更多干貨等著你。

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 1
收藏 2
關注 69
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 麻豆成人免费视频 | 99精品毛片| 一区二区免费在线观看 | 久久久精品久久 | 久久22| 国产精品自在线拍亚洲另类 | 国产精品福利一区 | 91老司机福利在线视频 | 碰碰久久 | 国产精品福利久久久 | 国产一区二区精品在线观看 | 丝袜美腿精品国产一区 | 亚洲高清视频一区二区 | 看黄色免费片 | 超碰在线观看av | 精品国产子伦久久久久久小说 | 久久久精品一区二区毛片免费看 | 欧美精欧美乱码一二三四区 | 国产精品s房调教打屁股 | 国产成熟女人性满足视频 | 欧美在线视频免费看 | 国产一卡2卡3卡四卡精品国色 | 久国久产久精永久网页 | 人妻少妇精品无码专区 | 国产在线欧美日韩精品一区 | 3344www成人| 国产高清黄色片 | 国产女教师一爽a片 | 狠狠色综合欧美激情 | 国产午夜精品片一区二区三区 | 少妇bbbb水多毛片人 | 精品国产子伦久久久久久小说 | 蜜臀久久99精品久久久久久网站 | 阿娇艳z门照片无码av4i | 日本中文字幕在线免费观看视频 | 精品国产京东免费人成网站 | 国产九九九精品视频 | 中文字幕亚洲色妞精品天堂 | 日本高清无吗 | 精品久久久久久久久久久久包黑料 | 草草草视频|