電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 530|回復(fù): 0
收起左側(cè)

基于鴻蒙OS的按鍵驅(qū)動(dòng)

[復(fù)制鏈接]

2607

主題

2607

帖子

7472

積分

高級(jí)會(huì)員

Rank: 5Rank: 5

積分
7472
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-11-11 11:56:18 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
基于鴻蒙OS的按鍵驅(qū)動(dòng), 按鍵作為常用的輸入系統(tǒng),如何準(zhǔn)確并高效的獲取按鍵值,是一個(gè)經(jīng)常要面對(duì)的問(wèn)題,今天我們看看在
鴻蒙系統(tǒng)中,如何得到獨(dú)立按鍵的按鍵值。




實(shí)現(xiàn)目標(biāo) 我們這次以Hi3861核心板左下角的USER按鍵S2為例,當(dāng)按鍵按下時(shí),通過(guò)
USB
Type-c對(duì)應(yīng)的串口輸出信息。



按鍵S2在實(shí)物中的對(duì)應(yīng)關(guān)系如下圖黃線所示:



1.png (759.67 KB, 下載次數(shù): 0)

下載附件  保存到相冊(cè)  

1 小時(shí)前 上傳




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

2.png (17.52 KB, 下載次數(shù): 0)

下載附件  保存到相冊(cè)  

1 小時(shí)前 上傳



當(dāng)S2被按下之后,GPIO05與GND相連,此時(shí)GPIO05輸入為低電平。
代碼實(shí)現(xiàn)
實(shí)現(xiàn)方式一:讀取輸入IO的狀態(tài)

  • #include#include

復(fù)制代碼 編譯代碼:



  • pythonbuild.pywifiiot

復(fù)制代碼

3.png (64.22 KB, 下載次數(shù): 0)

下載附件  保存到相冊(cè)  

1 小時(shí)前 上傳

更新固件之后重啟最小系統(tǒng)板,打開(kāi)串口助手,點(diǎn)擊核心板上的USER按鍵S2,串口助手輸出信息如下:



4.png (154.33 KB, 下載次數(shù): 0)

下載附件  保存到相冊(cè)  

1 小時(shí)前 上傳

注意:此實(shí)例新建了一個(gè)任務(wù)用于循環(huán)讀取按鍵的狀態(tài),KeyExampleEntry作為應(yīng)用程序的入口函數(shù),不能隨意使用while(1)這種耗時(shí)的操作,必須快速返回,否則會(huì)妨礙鴻蒙OS中其他應(yīng)用程序的運(yùn)行,因此,在這個(gè)入口函數(shù)中創(chuàng)建一個(gè)按鍵狀態(tài)監(jiān)測(cè)的專屬任務(wù)(線程)用于判斷按鍵的狀態(tài)。
GPIO中斷 通過(guò)上面的原理圖我們可知,當(dāng)按鍵S2沒(méi)有被按下的時(shí)候,GPIO05為默認(rèn)狀態(tài)高電平,當(dāng)按鍵S2被按下時(shí),GPIO05與GND相連,GPIO05被拉低,當(dāng)松開(kāi)按鍵S2的時(shí)候,GPIO05又恢復(fù)高電平。 在此過(guò)程中,當(dāng)按鍵S2被按下時(shí),GPIO05會(huì)收到一個(gè)由高到低的電平變化,我們稱這個(gè)過(guò)程為下降沿;當(dāng)按鍵S2被松開(kāi)時(shí),GPIO05會(huì)收到一個(gè)由低到高的電平變化,我們稱這個(gè)過(guò)程為上升沿。 綜上所述,在不考慮抖動(dòng)影響的前提下,每次按鍵被按下,GPIO05將會(huì)收到一個(gè)下降沿;按鍵被釋放,GPIO05會(huì)收到一個(gè)上升沿。 我們?cè)贕PIO05這個(gè)引腳上注冊(cè)一個(gè)邊沿觸發(fā)函數(shù)(上升沿或者下降沿觸發(fā)都可以),那么這個(gè)注冊(cè)的邊沿觸發(fā)回調(diào)函數(shù)被調(diào)用一次,理論上就是有一次按鍵的動(dòng)作發(fā)生。

  • #include#include

復(fù)制代碼
代碼說(shuō)明:

  • WIFI_IOT_IO_NAME_GPIO_5是與按鍵S2相連的GPIO,要實(shí)現(xiàn)按鍵中斷捕獲,需要先使用IoSetFunc()函數(shù)進(jìn)行端口功能重定義;
  • 調(diào)用GpioSetDir()函數(shù),設(shè)置GPIO05為輸入,并通過(guò)IoSetPull()函數(shù)將端口設(shè)置為上拉輸入(PullUp);
  • 調(diào)用GpioRegisterIsRFunc()函數(shù),完成GPIO05和回調(diào)函數(shù)gpio5_isr_func()的注冊(cè)綁定,設(shè)置觸發(fā)模式為上升沿觸發(fā):WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH,當(dāng)按鍵S2被抬起的時(shí)候,產(chǎn)生上升沿,觸發(fā)回調(diào)函數(shù)gpio5_isr_func()工作。
      


5.png (31.31 KB, 下載次數(shù): 0)

下載附件  保存到相冊(cè)  

1 小時(shí)前 上傳

通過(guò)上面兩種方式,我們學(xué)會(huì)了獨(dú)立按鍵狀態(tài)的獲取、鴻蒙系統(tǒng)中如何創(chuàng)建任務(wù)和外部中斷的使用,利用此代碼,我們還可以用于識(shí)別熱釋
紅外
傳感器的響應(yīng)信號(hào)。

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表