Key_Scan按鍵掃描函數
按鍵程序設計思路可以非常簡單:想要知道某個按鍵是否被按下,只需檢測連接到改按鍵的IO引腳是高電平還是低電平,若是低電平,說明按鍵正處于被按下的狀態。
通過使用R_IOPORT_PinRead函數,我們可以獲取某個IO引腳的電平狀態。R_IOPORT_PinRead函數原型如下:
fsp_err_tR_IOPORT_PinRead(ioport_ctrl_t * const p_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, ///< LowBSP_IO_LEVEL_HIGH ///< High} bsp_io_level_t;
Key_Scan按鍵掃描函數如下:
列表3:
代碼清單11-1:Key_Scan按鍵掃描函數
/* 定義宏 KEY_ON 表示按鍵按下定義宏 KEY_OFF 表示按鍵沒有按下*//* 按鍵掃描函數(阻塞式)* key: KEY1_SW2_PIN 用戶按鍵 1(絲印 SW2)的引腳* KEY2_SW3_PIN 用戶按鍵 2(絲印 SW3)的引腳*/uint32_tKey_Scan(bsp_io_port_pin_t key){bsp_io_level_t state;// 讀取按鍵引腳電平R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);if (BSP_IO_LEVEL_HIGH == state){return KEY_OFF; //按鍵沒有被按下}else{do//等待按鍵釋放{R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);} while (BSP_IO_LEVEL_LOW == state);}return KEY_ON; //按鍵被按下了}
這是一個簡單的按鍵掃描函數,當調用該函數并且檢測到按鍵被按下的時候,就會在do-while語句里重復檢測按鍵是否被松開,一直到當手松開按鍵的時候才能跳出循環,并返回KEY_ON數值表明按鍵被按下;而當按鍵沒有被按下的時候Key_Scan函數則返回KEY_OFF的數值。
值得注意的是,若程序在do-while循環里一直檢測到手沒有松開按鍵,則程序會被一直阻塞在這里,因此這是一個阻塞式的掃描函數。
hal_entry入口函數
在hal_entry函數里,首先初始化了LED和按鍵,接著進入了while主循環,在該循環下反復地調用Key_Scan函數對兩個用戶按鍵進行實時掃描。若按鍵1按下,則翻轉LED1的狀態;若按鍵2按下,則翻轉LED2的狀態。
需要注意的是,KEY1_SW2_PIN和KEY2_SW3_PIN宏定義了兩個用戶按鍵的引腳,不同的板子按鍵引腳是不一樣的。
/* 啟明 6M5 開發板,兩個按鍵引腳定義 *//* 啟明 4M2 開發板,兩個按鍵引腳定義 *//* 啟明 2L1 開發板,兩個按鍵引腳定義 */
hal_entry入口函數如下:
列表4:代碼清單11-2:hal_entry入口函數
/* 用戶頭文件包含 */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 狀態}}/* Enter non-secure code */R_BSP_NonSecureEnter();}
下載驗證
將程序編譯并下載到開發板之后,按下復位按鍵來復位開發板。
然后按下用戶按鍵1可以控制LED1燈的亮滅;按下用戶按鍵2則可以控制LED2燈的亮滅。

如您在使用瑞薩MCU/MPU產品中有任何問題,可識別下方二維碼或復制網址到瀏覽器中打開,進入瑞薩技術論壇尋找答案或獲取在線技術支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
未完待續
推薦閱讀
GPIO輸入——瑞薩RA系列FSP庫開發實戰指南(25)
hal_entry入口函數——瑞薩RA系列FSP庫開發實戰指南(24)
GPIO輸出——瑞薩RA系列FSP庫開發實戰指南(23)

