11.3.3Key_Scan按鍵掃描函數
按鍵程序設計思路可以非常簡單:想要知道某個按鍵是否被按下,只需檢測連接到改按鍵的IO引腳是高電平還是低電平,若是低電平,說明按鍵正處于被按下的狀態。
通過使用R_IOPORT_PinRead函數,我們可以獲取某個IO引腳的電平狀態。R_IOPORT_PinRead函數原型如下:
左右滑動查看完整內容
fsp_err_tR_IOPORT_PinRead(ioport_ctrl_t*constp_ctrl,bsp_io_port_pin_t? →pin,bsp_io_level_t* p_pin_value);
說明
通過bsp_io_port_pin_t枚舉類型的變量pin傳入要讀取的IO引腳的端口號和引腳號;
通過bsp_io_level_t枚舉類型的指針p_pin_value來獲取該IO引腳的電平狀態。
bsp_io_level_t枚舉類型的定義如下:
列表2:e_bsp_io_level枚舉類型定義
左右滑動查看完整內容
/* 可以為單個引腳設置電平和讀取電平 */
typedefenume_bsp_io_level
{
BSP_IO_LEVEL_LOW =0,///< Low
BSP_IO_LEVEL_HIGH?///< High
}?bsp_io_level_t;
Key_Scan按鍵掃描函數如下:
列表3:
代碼清單11-1:Key_Scan按鍵掃描函數
左右滑動查看完整內容
/* 定義宏 KEY_ON 表示按鍵按下
定義宏 KEY_OFF 表示按鍵沒有按下
*/
#defineKEY_ON 1
#defineKEY_OFF 0
/* 按鍵掃描函數(阻塞式)
* key: KEY1_SW2_PIN 用戶按鍵 1(絲印 SW2)的引腳
* KEY2_SW3_PIN 用戶按鍵 2(絲印 SW3)的引腳
*/
uint32_tKey_Scan(bsp_io_port_pin_tkey)
{
bsp_io_level_tstate;
// 讀取按鍵引腳電平
R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
if(BSP_IO_LEVEL_HIGH == state)
{
returnKEY_OFF;//按鍵沒有被按下
}
else
{
do//等待按鍵釋放
{
R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
}while(BSP_IO_LEVEL_LOW == state);
}
returnKEY_ON;//按鍵被按下了
}
這是一個簡單的按鍵掃描函數,當調用該函數并且檢測到按鍵被按下的時候,就會在do-while語句里重復檢測按鍵是否被松開,一直到當手松開按鍵的時候才能跳出循環,并返回KEY_ON數值表明按鍵被按下;而當按鍵沒有被按下的時候Key_Scan函數則返回KEY_OFF的數值。
值得注意的是,若程序在do-while循環里一直檢測到手沒有松開按鍵,則程序會被一直阻塞在這里,因此這是一個阻塞式的掃描函數。
11.3.4hal_entry入口函數
在hal_entry函數里,首先初始化了LED和按鍵,接著進入了while主循環,在該循環下反復地調用Key_Scan函數對兩個用戶按鍵進行實時掃描。若按鍵1按下,則翻轉LED1的狀態;若按鍵2按下,則翻轉LED2的狀態。
需要注意的是,KEY1_SW2_PIN和KEY2_SW3_PIN宏定義了兩個用戶按鍵的引腳,不同的板子按鍵引腳是不一樣的。
左右滑動查看完整內容
/* 啟明 6M5 開發板,兩個按鍵引腳定義 */ #defineKEY1_SW2_PIN BSP_IO_PORT_00_PIN_04 #defineKEY2_SW3_PIN BSP_IO_PORT_00_PIN_05 /* 啟明 4M2 開發板,兩個按鍵引腳定義 */ #defineKEY1_SW2_PIN BSP_IO_PORT_04_PIN_03 #defineKEY2_SW3_PIN BSP_IO_PORT_04_PIN_04 /* 啟明 2L1 開發板,兩個按鍵引腳定義 */ #defineKEY1_SW2_PIN BSP_IO_PORT_00_PIN_01 #defineKEY2_SW3_PIN BSP_IO_PORT_00_PIN_02
hal_entry入口函數如下:
列表4:代碼清單11-2:hal_entry入口函數
左右滑動查看完整內容
/* 用戶頭文件包含 */
#include"led/bsp_led.h"
#include"key/bsp_key.h"
voidhal_entry(void)
{
/*TODO:add your own code here */
LED_Init();// LED 初始化
Key_Init();// 按鍵初始化
while(1)
{
if(Key_Scan(KEY1_SW2_PIN) == KEY_ON )//掃描按鍵 1
{
LED1_TOGGLE;//翻轉 LED1 狀態
}
if(Key_Scan(KEY2_SW3_PIN) == KEY_ON )//掃描按鍵 2
{
LED2_TOGGLE;//翻轉 LED2 狀態
}
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
11.4下載驗證
將程序編譯并下載到開發板之后,按下復位按鍵來復位開發板。
然后按下用戶按鍵1可以控制LED1燈的亮滅;按下用戶按鍵2則可以控制LED2燈的亮滅。
-
引腳
+關注
關注
16文章
2111瀏覽量
55681 -
程序
+關注
關注
117文章
3846瀏覽量
85225 -
函數
+關注
關注
3文章
4417瀏覽量
67499
發布評論請先 登錄
按鍵掃描Key_Scan中為什么設2個變量
為什么自有key_scan()==1有用,而key_scan()==2沒有起作用?求解釋?
3*4按鍵掃描這樣行不行
請問if中的按鍵掃描占用時間嗎?
Stm32按鍵輸入的程序步驟有哪些
.單片機開發過程中按鍵處理函數的實現
單片機按鍵掃描的一般思路?
STM32按鍵輸入實驗的按鍵優先級和上下拉電阻的配置
Key_Scan按鍵掃描函數詳解
評論