NCF29A1 通過定時器實現按鍵雙擊、長按功能

關鍵字 :NCF29A1Timer0Timer2按鍵雙擊按鍵長按

一、概述

       NCF29A1 鑰匙程序 WPI Demo 已實現按鍵短按發送 RKE 數據幀,即 RCB 滾碼,其中數據幀定義如下圖所示,數據幀定義中 BID(1 byte) 標識按鍵鍵值, WPI NCF29A1 鑰匙板上共三個按鍵,當前按鍵狀態可通過 hw_get_button_code() 接口函數獲取,返回一個 uint8_t 類型的變量,u8_ButtonCode = hw_get_button_code(),u8_ButtonCode 的 bit 0,bit 1,bit2 置位分別對應 Button 1,Button 2,Button 3 按鍵被按下,再將 u8_ButtonCode 賦給 BID,發送 RCB 滾碼。
 
 
      在此基礎上需實現按鍵雙擊、長按功能。其中長按則一直發送 RKE 數據幀,直到按鍵鬆開;識別按鍵雙擊則通過 BID 區分,三個按鍵雙擊分別由 BID 的 bit 4,bit 5,bit 6 置位表示,bit 7 一般用於標識電池電量是否過低,不用於表示按鍵鍵值。

二、實現思路

1. RKE 功能主要由 RKE() 函數處理,該函數由 main() 函數中 process_PortWUP() 函數調用,在主程序中循環判斷,處理埠喚醒事件。

2. RKE 中實現按鍵功能思路如下:

    以下實現邏輯以及超時時間設置僅供參考,具體程序流程如下圖所示:
        進入 RKE() 函數後,當獲取到當前有按鍵按下則進入第一個循環,按鍵鍵值不為 0 的循環判斷,接著設置 Timer2 20ms 超時判斷,通過 u8_timer2_irq_t++ 計數超時次數,最多記數 20 次,即第二個循環 400ms 超時循環判斷,超時或識別為雙擊則退出循環,接著發送 RKE 數據幀,再次獲取按鍵鍵值,判斷是否繼續進循環。
   
       按鍵事件識別思路如下:
       ① 雙擊:在 400ms 內識別到兩次短按則識別為按鍵雙擊,提前退出 400ms 超時循環,發送 RKE 數據幀後結束。
       ② 短按:在 400ms 內若僅識別到一次按鍵按下,等待 400ms 超時,識別為短按,即單擊,發送 RKE 數據幀後結束。
       ③ 長按:在 400ms 內若按鍵一直為按下狀態,則超時後退出 400ms 超時循環,發送 RKE 數據幀後,再次進入按鍵鍵不為 0 的循環。

三、定時器配置

1. Timer2 定時器 ms 配置代碼如下:
 

       需注意的是,Timer 0 與 Timer2 都為 16 位定時器,按鍵超時循環中建議使用 Timer2,獲取按鍵鍵值的 hw_get_button_code() 函數中配置了 Timer0 進行按鍵消抖延時,若使用 Timer0 進行超時循環判斷,再次獲取按鍵鍵值時Timer0 已被重新配置,兩者有衝突,且鑰匙程序中多處使用的延時函數是通過 Timer0 實現,故不建議再次配置使用 Timer0。

2. 判斷超時可參考如下內容:

① 初始化時配置 20 ms 超時。
 
 
② 在循環中判斷超時次數 u8_timer2_irq_t,判斷 u8_timer2_irq_t 次數是否跳出循序,參考如下:
 

3. 失能定時器配置如下:
 

四、高頻板接收 RKE 數據幀驗證

      按下鑰匙按鍵,通過高頻板接收 RKE 數據幀如下:
 
 
      以按鍵 2 為例說明,02 表示 Button 2 短按一次,0x22 表示 Button 2 雙擊,若為長按則一直發送數據幀,識別為多次的短按。

五、結語

      以上就是本篇分享的全部內容,定時器配置可參考第三點,RKE 中按鍵處理函數的功能代碼不在此篇博文中詳細展示,可參考第二點實現思路實現,有需要可以聯繫我們,感謝閱讀。

六、參考資料

1. WPI 鑰匙通信協議簡易說明_V2.4.pdf

2. ds380634 - Product data sheet NCF29A1 _ NCF29A2 - TOKEN 3D _ TOKEN 1D (3.4).pdf

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論