1. 程式人生 > 其它 >在TMOS系統中新增按鍵檢測功能

在TMOS系統中新增按鍵檢測功能

目錄

TMOS系統中自帶有按鍵檢測輪詢功能,預設100ms檢測一次,在debug時很有幫助。不過在需要低功耗休眠的前提下,檢測按鍵需要頻繁喚醒,影響功耗,故多數BLE的工程都沒有用到這個功能。程式碼貼在了最後。

啟用按鍵查詢,先要在工程配置中新增HAL_KEY,以及確保KEY.c新增進編譯。

然後新增按鍵處理函式,函式名自擬,但是形參須為(uint8_t keys),呼叫HalKeyConfig函式註冊一下。

這樣預設程式碼中配置好了PB22和PB4兩個按鍵,如上圖新增,評估板上用PB4作為按鍵,就已經可以跑起來。如果需要更多按鍵,可以如下圖新增處理,下圖中新增到了總計5個按鍵,可以新增B組引腳,也可以新增A組引腳。

在KEY.c中需要做如下修改。

 在KEY.h中需要做如下修改。

列印如下,支援同時檢測多個按鍵按下。

/*KEY.c中的修改後程式碼*/

/**************************************************************************************************
 * @fn      HAL_KeyInit
 *
 * @brief   Initilize Key Service
 *
 * @param   none
 *
 * @return  None
 *************************************************************************************************
*/ void HAL_KeyInit(void) { /* Initialize previous key to 0 */ halKeySavedKeys = 0; /* Initialize callback function */ pHalKeyProcessFunction = NULL; KEY1_DIR; KEY1_PU; KEY2_DIR; KEY2_PU; KEY3_DIR; //JW KEY3_PU; KEY4_DIR; //JW KEY4_PU; KEY5_DIR;
//JW KEY5_PU; } /************************************************************************************************** * @fn HalKeyConfig * * @brief Configure the Key serivce * * @param cback - pointer to the CallBack function * * @return None **************************************************************************************************/ void HalKeyConfig(halKeyCBack_t cback) { /* Register the callback fucntion */ pHalKeyProcessFunction = cback; tmos_start_task(halTaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE); /* Kick off polling */ } /************************************************************************************************** * @fn HalKeyRead * * @brief Read the current value of a key * * @param None * * @return keys - current keys status **************************************************************************************************/ uint8_t HalKeyRead(void) { uint8_t keys = 0; if(HAL_PUSH_BUTTON1()) { //讀按鍵1 keys |= HAL_KEY_SW_1; } if(HAL_PUSH_BUTTON2()) { //讀按鍵2 keys |= HAL_KEY_SW_2; } if(HAL_PUSH_BUTTON3()) { //讀按鍵3 keys |= HAL_KEY_SW_3; } if(HAL_PUSH_BUTTON4()) { //讀按鍵4 keys |= HAL_KEY_SW_4; } if(HAL_PUSH_BUTTON5()) //JW { //讀按鍵5 keys |= HAL_KEY_SW_5; } return keys; } /************************************************************************************************** * @fn HAL_KeyPoll * * @brief Called by hal_driver to poll the keys * * @param None * * @return None **************************************************************************************************/ void HAL_KeyPoll(void) { uint8_t keys = 0; if(HAL_PUSH_BUTTON1()) { keys |= HAL_KEY_SW_1; } if(HAL_PUSH_BUTTON2()) { keys |= HAL_KEY_SW_2; } if(HAL_PUSH_BUTTON3()) { keys |= HAL_KEY_SW_3; } if(HAL_PUSH_BUTTON4()) { keys |= HAL_KEY_SW_4; } if(HAL_PUSH_BUTTON5()) //JW { keys |= HAL_KEY_SW_5; } if(keys == halKeySavedKeys) { /* Exit - since no keys have changed */ return; } halKeySavedKeys = keys; /* Store the current keys for comparation next time */ /* Invoke Callback if new keys were depressed */ if(keys && (pHalKeyProcessFunction)) { (pHalKeyProcessFunction)(keys); } }
/*KEY.h中的修改後程式碼*/

/**************************************************************************************************
 *                                              MACROS
 **************************************************************************************************/
#define HAL_KEY_POLLING_VALUE    100

/* Switches (keys) */
#define HAL_KEY_SW_1             0x01  // key1
#define HAL_KEY_SW_2             0x02  // key2
#define HAL_KEY_SW_3             0x04  // key3
#define HAL_KEY_SW_4             0x08  // key4
#define HAL_KEY_SW_5             0x10  // key5      //JW

/* 按鍵定義 */

/* 1 - KEY */
#define KEY1_BV                  BV(22)
#define KEY2_BV                  BV(4)
#define KEY3_BV                  BV(8)      //JW
#define KEY4_AV                  (1 << 10)      //JW
#define KEY5_AV                  (1 << 15)      //JW

#define KEY1_PU                  (R32_PB_PU |= KEY1_BV)
#define KEY2_PU                  (R32_PB_PU |= KEY2_BV)
#define KEY3_PU                  (R32_PB_PU |= KEY3_BV)     //JW
#define KEY4_PU                  (R32_PA_PU |= KEY4_AV)     //JW
#define KEY5_PU                  (R32_PA_PU |= KEY5_AV)     //JW

#define KEY1_DIR                 (R32_PB_DIR &= ~KEY1_BV)
#define KEY2_DIR                 (R32_PB_DIR &= ~KEY2_BV)
#define KEY3_DIR                 (R32_PB_DIR &= ~KEY3_BV)       //JW
#define KEY4_DIR                 (R32_PA_DIR &= ~KEY4_AV)       //JW
#define KEY5_DIR                 (R32_PA_DIR &= ~KEY5_AV)       //JW

#define KEY1_IN                  (ACTIVE_LOW(R32_PB_PIN & KEY1_BV))
#define KEY2_IN                  (ACTIVE_LOW(R32_PB_PIN & KEY2_BV))
#define KEY3_IN                  (ACTIVE_LOW(R32_PB_PIN & KEY3_BV))     //JW
#define KEY4_IN                  (ACTIVE_LOW(R32_PA_PIN & KEY4_AV))     //JW
#define KEY5_IN                  (ACTIVE_LOW(R32_PA_PIN & KEY5_AV))     //JW

#define HAL_PUSH_BUTTON1()       (KEY1_IN) //新增自定義按鍵
#define HAL_PUSH_BUTTON2()       (KEY2_IN)
#define HAL_PUSH_BUTTON3()       (KEY3_IN)      //JW
#define HAL_PUSH_BUTTON4()       (KEY4_IN)      //JW
#define HAL_PUSH_BUTTON5()       (KEY5_IN)      //JW