EC - 鍵盤掃描
Keyboard Matrix Scan
現今筆記型電腦的鍵盤多採用 104 鍵配置,這意味著至少需要 (104) 個掃描點位,也就是 Y0 至 Y12(共 13 條 MY 線),才能涵蓋所有按鍵。
本章將著重於 Firmware 層面的技術實作,並說明基本硬體如何配置 MXn 與 MYn。若您希望深入了解 Keyboard Scan Module 的運作原理,建議參閱相關技術資料。新一代的 EC 晶片已將原有的 16x8 鍵盤矩陣擴充為 18x8 結構,以支援更多按鍵配置。
所謂 Ghost Key,是指在用戶同時按下如 X0/Y0、X0/Y1 與 X1/Y0 等位置時,掃描邏輯會誤判 X1/Y1(即 MX1/MY1)也被同時按下(電流由 X0/Y1 流到 X0/Y0 再到 X1/Y0 而誤判 X1/Y1 也被按下)。這類未實際觸發卻被錯誤判定的按鍵即稱為 Ghost Key。為避免此類現象,設計鍵盤矩陣時,應對常用作組合鍵的按鍵適當預留空間,避免造成掃描誤判。
Firmware 的鍵盤掃描流程如下:
當 EC 處於待機狀態時,MXn 設為輸入端,而 MYn 則輸出低電位(Low)。當使用者按下某個按鍵時,對應的 MXn 與 MYn 將被導通,使得低電位從 MYn 傳送至 MXn,進而觸發 EC 偵測到中斷。中斷服務程式僅負責記錄該事件(set service flag),並將 EC 設定為禁止掃描狀態(MYn 輸出改為高電位),同時立即釋放中斷資源。
隨後,由 Firmware 的主服務程序負責執行按鍵掃描。掃描過程會依序將 MY0 至 MY17 的每條線由高電位轉為低電位,並讀取 MXn 的輸入狀態,以判定是哪一顆按鍵被觸發。此階段同時會檢查是否產生 Ghost Key,進行消彈跳(Debounce)處理,並判斷該按鍵為按下(Press)或釋放(Release),是否需要重複輸出(Repeat)等動作。
最後,根據 Code Set 1 或 Code Set 2 的對應表,Firmware 會將對應的 Scancode 傳送至主系統,以完成鍵盤輸入的傳遞流程。
鍵盤掃描演算法說明
鍵盤掃描的基本流程如下:
-
初始化掃描迴圈計數器
LoopIndex = 0
。 -
產生掃描訊號:
將0x01
根據LoopIndex
進行位元左移(即0x01 << LoopIndex
),並將結果輸出至 MY0~MY15,作為當前掃描的 Y 軸行線。 -
讀取輸入狀態:
讀取 MX0~MX7 的值,檢查是否有按鍵被觸發:-
若讀到值為
0xFF
,表示該行無按鍵被按下。 -
若讀到值 不為
0xFF
,表示該行存在被觸發的按鍵,則記錄此一事件:-
MX 的值存入 高位元組(High Byte)
-
對應的 MY 掃描碼存入 低位元組(Low Byte)
-
-
-
遞增掃描行:
將LoopIndex
加 1,繼續掃描下一條 MY 線是否有按鍵被觸發。 -
掃描結束條件:
當LoopIndex
遞增至超過 MY15(即完成 MY0~MY15 共 16 行的掃描)後,結束此次掃描迴圈。
-
MATRIX 18x8 鍵盤掃描演算法說明
在使用 18x8 鍵盤矩陣架構時,鍵盤掃描與轉碼流程如下:
-
掃描 MY16 / MY17:
擴充行 MY16 與 MY17 分別加入掃描流程,當偵測到按鍵觸發時,會取得該按鍵所在的位置信息(即 MY 與 MX 的交叉點)。 -
計算偏移並查詢 EMSpace:
根據該按鍵位置對應的偏移值,查詢預設的記憶體區塊EMSpace
。注意:
EMSpace
建議使用 0x00 至 0x7F 範圍內,並避免選用在 MATRIX 中未使用的按鍵對應位置。 -
從 MATRIX 取得對應值:
透過 EMSpace 所定位的記憶體位址,查詢 MATRIX 陣列,取得該位置對應的值(通常為邏輯鍵碼或中介碼)。 -
查詢 KEYTBL 取得最終 Scancode:
利用剛才從 MATRIX 得到的值作為索引,查詢 KEYTBL(鍵值對照表),取得對應的 Scancode。 -
傳送 Scancode 至系統:
最後,將取得的 Scancode 傳送至主系統,完成一次有效的鍵盤輸入事件處理。
-
按鍵狀態檢查相關函式說明
CheckMake
使用
Checked
旗標來判斷按鍵目前是「被按下」還是「被放開」。若判斷為按鍵放開,且尚未開始進行 Debounce 處理,則:
設定對應的「按鍵放開」旗標。
初始化該鍵的 Debounce 計數器。
若
Checked
旗標尚未被設定,表示該按鍵目前尚未被確認按下,或仍處於 Debounce 階段。此時會將對應的 Debounce 計數器加一,持續等待穩定狀態。
CheckBreak
用於檢測按鍵是否「已被放開」。
條件邏輯與
CheckMake
相反,用於確認按鍵由按下轉為釋放的狀態。
CheckGhost
(此處未提供細節)
建議補充說明:此函式應用於偵測 Ghost Key(虛假按鍵)情形,防止誤判未按下的鍵。
CheckRepeat
用於判斷按鍵是否需要執行 Repeat(連續輸入)功能。
判斷邏輯依賴變數
DELAY0
的值進行計數與判斷。DELAY0
的初始值則由函式ChkTypematic
設定。如需設定特定按鍵是否具備 Repeat 功能,可透過修改
ChkTypematic
函式來達成。
留言
張貼留言