參考修改先前鍵盤驅動函式,將鍵盤掃瞄驅動函式中,各個按鍵的 HI/LOW狀態變數,以及上緣事件變數,包裝進 KeyBoardRead 功能方塊結構體的欄位。
typedef struct {
uint8_t HighLowState[16];
uint8_t DownEventState[16];
} KeyBoardReadStr_t;
修改先前鍵盤驅動函式,以功能方塊結構體做為傳址傳參,並提供掃瞄鍵號輸出。
uint8_t KeyBoardRead_step(KeyBoardReadStr_t* Str_p,uint8_t* KeyNum_p)
• 簡介:本函式會對 4X4 鍵盤緯經輸出掃瞄值同時偵測經線以讀回 16 個銨鍵狀態,並與上次掃瞄的狀態比對,找出下降緣事件輸出。並回傳是否有下降緣事件發生。
• 傳址變數:
KeyBoardReadStr_t* Str_p:鍵盤下降緣讀取功能方塊結構體住址。
uint8_t* KeyNum_p:鍵盤中有下降緣事件發生之鍵編號輸出可存入的變數住址。
• 回傳:回傳是否有下降緣事件發生,0 無下降緣事件,1 有下降緣事件。
鍵號解譯器
圖 8-3 鍵號解譯功能方塊細分解
參考圖 8-3 鍵號解譯細分解方塊,在掃描鍵盤得到鍵入編號之後
• 鍵號輸入對應查表:由鍵盤對應表查出其所代表之字元 ASCII 碼
• 字元解析:將字元 ASCII 碼分類為數字或是符號,而符號則再分為等號或則是四則運算符號。
◦ 運算子輸出:若是字元是四則運算符號,則將它輸出為做為運算子。
◦ 控制旗標輸出:符號/數值,等號/四則,各有一個旗標輸出,可以
做為後續功能方塊之輸入控制旗標。
• 字元轉整數:若是字元是數字,為了能夠運算,必需經字元轉整數格式轉成整數,並輸出。
參考實際鍵盤,若我們把'F'鍵,即編號 15 鍵當成『 + 』其 ASCII 碼為 43。把'E'鍵,即編號 14 鍵當成『 − 』其 ASCII 碼為 45。把'D'鍵,即編號 13 鍵當成『 × 』其 ASCII 碼為42。把'C'鍵,即編號 12 鍵,當成『 ÷ 』其 ASCII 碼為 47。把'B'鍵,即編號 11鍵當成『 = 』其 ASCII 碼為 61。
其它數字鍵即為本身標示之阿拉伯數字,由 0 到 9,分別佔用 ASCII 碼為 48到 57。
例如:我們按『1』鍵時,鍵號輸入對應查表會查找取得『1』的 ASCII 碼,即49,傳給字元轉整數方塊及字元解析方塊。前者會把把 1 的 ASCII 碼轉為 1 的整數碼,後者則可由 ASCII 碼介於 48~57 之間來而判斷出『1』本身是一個數值而不是符號,因此其符號/數值 輸出旗標變數為 0,至於等號/四則,運算子等訊號就無關緊要。由於字元轉整數方塊偵測到符號/數值 輸出旗標變數為 0,因此會執行執行轉換,其轉換方式很簡單,只要把 ASCII 碼減掉 48 即為其整數值。
又例如,我們按'F'鍵時, 鍵號輸入對應查表會查找取得『 + 』的 ASCII 碼43,傳給字元解析分析出,因為不在 48 到 57 之間是一個符號, 因此其符號/數值 輸出旗標變數為 1。又因不等於 61,故不是等號,因此等號/四則 輸出旗標變數為 0。
運算子編號輸出可用『 + 』的 ASCII 碼輸出。由於字元轉整數方塊只有收到字元解析出是數值時才會執行轉換,因此鍵入『 + 』它不會做任何事,也不會有新的整數輸出。
鍵號解譯器功能方塊,可以寫成一個函式讓主程式在系統整合時呼叫,由於這個功能方塊有,結構體 KeyResolver_str 內含 ASCII 碼的查找表。
typedef struct {
uint8_t ASCIITable[16];
} KeyResolverStr_t
其初始值非 0 有需要宣告一個初始化巨集。
#define KEYRESOLVERSTR_INIT { \
.ASCIITable ={48,49,50,51,52,53,54,55,56,57,58,59,32,61,47,42,45,43} \
}
這個功能函式的原型為:
uint8_t KeyResolver_step(KeyResolverStr_t *Str_p, uint8_t KeyIn, *uint8_t
NewNum_p, *uint8_t Symbol_p, *uint8_t EqualSign_p, *uint8_t Operator_p )
• 簡介:本函式會接收一個鍵號,找出鍵號對應的 ASCII 碼,並依據ASCII 碼分辨新鍵入字元的特性,輸出做為後續工作的控制旗標變數。
• 傳值變數:
uint8_t KeyIn:新的下降級鍵編號。
• 傳址變數:
KeyResolverStr_t *Str_p:鍵盤解譯功能方塊結構體住址。
uint8_t *NewNum_p:如銨鍵為數值時其他可存入的變數住址。
uint8_t *Symbol_p:解譯出來的符號/數值 輸出旗標變數住址。
uint8_t *EqualSign_p:解譯出來的等號/四則 輸出旗標變數住址。
uint8_t *Operator_p:如銨鍵不為數值時輸出的運算元變數住址。
• 回傳:N/A。
在以 main()主程式執行系統整合時,需要在傳參變數定義區塊內宣告定義出它的輸出入變數:
//傳參變數定義區塊
uint8_t KeyIn, Symbol, EqualSign,Operator,NewNum,...;
在永久廻路區塊內呼叫鍵號解譯器功能函式時要使用變數傳址方式:
KeyResolver_step(&KeyResolver_str, KeyIn, &NewNum, &Symbol, &EqualSign,&Operator );