請看附件,純屬個人理解,有不足之處請指出
1、 先找到 InitBoard()的定義 2、 修改 OnboardKeyIntEnable 的值: OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;//失能按鍵中斷; OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE; //使能按鍵中斷,此處使能按鍵 中斷。 3、 按鍵配置函數(shù) HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); 這個函數(shù)中失能、使能中斷執(zhí)行不同的代碼。下面分別講解 a)、中斷失能 清除中斷使能寄存器。 
在 HAL_KEY_POLLING_VALUE 時間后產(chǎn)生一個 HAL_KEY_EVENT 事件。找到這個事件的 處理函數(shù),如下圖所示:
圖 1 禁用中斷的處理函數(shù) 在 HalKeyPoll();中進行按鍵的掃描,如果有按鍵按下,記錄鍵值,并執(zhí)行按鍵處理函數(shù) OnBoard_KeyCallback();100ms 后再次產(chǎn)生HAL_KEY_EVENT 事件,相當于 100ms 輪詢一 次。 b)、中斷使能 注意中斷使能時,如果用戶是普通案件代替五向按鍵,不能用五向按鍵的宏定義,需要 自己重定義,否則會出現(xiàn)錯誤。 重定義如下:
如果中斷使能,則進入按鍵中斷的配置: a)、配置 SW1 邊沿觸發(fā)、設(shè)置中斷初始條件 b)、配置 SW2 邊沿觸發(fā)、設(shè)置中斷初始條件 c)、停止按鍵輪詢。 4、找到按鍵的中斷處理函數(shù),并進行更改 按鍵 P0 口的中斷處理函數(shù)為 HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) 當有中斷產(chǎn)生是,執(zhí)行 halProcessKeyInterrupt 函數(shù)。 代碼如下:
a)、對按鍵 SW6 檢測到按鍵邊沿后,產(chǎn)生 HAL_KEY_EVENT 事件,HalKeyPoll ()函數(shù)中記錄 keys= HAL_KEY_SW_6 的值,并將其發(fā)送給 MyApp_TaskID 任務。MyApp_TaskID 中檢測到按鍵 改變,產(chǎn)生 KEY_CHANGE 事件,調(diào)用按鍵處理函數(shù) MyApp_HandleKeys()。 b)、對按鍵 SW7(有按鍵長按短按的功能) 按鍵按下檢測到上升邊沿,記錄時間 t1; 將觸發(fā)邊沿改變成下降沿觸發(fā),按鍵松開時記
錄系統(tǒng)時間 T2。全局變量 MyApp_Key_differnt_Time=t2-t1; 之后又進入到 HalKeyPoll (void)處理函數(shù)中;
Keybuf1 和 keybuf2 用來檢測按鍵是否產(chǎn)生了一個按下&抬起的動作,如果不這么做, 按鍵平時為高電平,抬起按鍵后也為高電平,用 Keybuf1 和keybuf2 作為按鍵按下抬起 完成的標志位。然后的過程和 SW6 類似。 4、 MyApp_TaskID 任務中對按鍵的實際處理代碼 MyApp_HandleKeys(); 按鍵 SW6 不做講解,對 SW7 的代碼如下: 長按超過 3000ms,執(zhí)行清除 NV 的動作 小于 3000ms,執(zhí)行功率改變的動作。
pdf格式文檔51黑下載地址:
|