我們每敲擊一次電腦鍵盤,按鍵對應的字元就會出現在顯示器上。這中間發生了什麼?請聽我慢慢細說。
相關概念
人對按鍵的操作,從兩個維度去描述,乙個是「動作」,另乙個是「內容」。
按下乙個按鍵,鬆開乙個按鍵,按下乙個按鍵並且保持按住狀態一段時間(長按),這些都是動作。
每個按鍵和動作組合起來,會傳送給計算機乙個編碼,這就是內容,術語是「掃瞄碼」,對應的英語詞彙是scan code。
按下按鍵、長按鍵對應的掃瞄碼叫「make code」,鬆開按鍵對應的掃瞄碼叫「break code」。
break code和make code的關係是:break code = make code & 0x80。
為什麼兩種編碼之間有上面的關係?設計人員特意這樣設計的。
三個硬體
8048
在鍵盤上執行某種操作(按鍵、長按、鬆開鍵)時,8048會檢測到這個操作,把這個操作對應的掃瞄碼傳送給8042。
到現在為止,出現了三套編碼方案,我們現在的鍵盤一般使用第2套方案。
8042
8042從8048接收到第2套方案的掃瞄碼後,把它轉換成第1套掃瞄碼,並且放入緩衝區,最後,通知8259a發生了鍵盤中斷。
中斷例程取走緩衝區的資料後,8042才會接收新的資料。緩衝區的資料不被取走,8042就不會接收新資料。
8259a
8259a接收來自8042的鍵盤中斷,讓作業系統分派中斷例程處理緩衝區的資料。
流程人類敲擊鍵盤,8048監測到」敲擊了哪個鍵「,把對應的掃瞄碼傳送給8042。
8042接收到8048的資料後,將資料轉換成第1套掃瞄碼,放入緩衝區;然後通知8259a。
8259a接收到通知後,告訴作業系統發生了鍵盤中斷。
作業系統執行鍵盤中斷例程把緩衝區的資料取走;8042又可以重新接收新資料了。
解析掃瞄碼
對映陣列
在第1套掃瞄碼中,乙個make code對應乙個按鍵。我們可以通過make code識別出當前被按下的鍵是哪個鍵。例如,a鍵的make code是0x1e;當作業系統接收到的make code是0x1e時,就可以認為接收到的資料是a。
然而,問題出現了。我們在實際輸入中有輸入a和a的需求。可掃瞄碼方案中只有a的掃瞄碼,沒有a的掃瞄碼。類似的按鍵還有數字鍵1、2、3等。怎麼解決這個問題呢?
先看看下面這個**。
make code 0 1 2
0x1e a a 0
0x02 1 ! 0
在上面的**中,make code是行號,每行有三個不同的值。0x1e行的第0列表表示a,0x1e行的第1列表示a。
這能夠實現乙個鍵表示兩種不同的值。
我們平時怎麼獲得乙個鍵的不同值呢?以數字鍵1為例。敲擊數字鍵1時,獲取的值是1;同時按下shift鍵和數字鍵1時,獲取的值是感嘆號!。
在具體實現中,根據是否同時按下了shift鍵來決定是獲取第x行的第0列還是第1列。顯然,按下shift鍵,獲取第1列;沒有按下shift鍵,獲取第0列。
第1套掃瞄碼一共有0x80個,其實就是ascii碼表中元素的個數。
我們仿照上面的**建立乙個元素更多的**tb(表頭相同,行數擴充到0x80行)。
第一列是行號,值是make code,假設是a。
第二列是a對應的鍵的預設值(沒有按下shift鍵)。
第二列是a對應的鍵的另乙個值(按下了shift鍵)。
然而,在鍵盤上存在不可列印的字元,例如esc、f1、f2等。在tb中,這些不可列印的鍵對應的值是我們設定的某個數值(這一行的第0列和第1列的數值相同)。
怎麼使用tb?根據make code找到對應的行,根據是否按下了shift鍵決定是獲取第0列還是第1列的值。
要在c語言中使用這個**,只能將它用陣列表示出來。把這個**的每一行的第0列、第1列、第2列按順序組成乙個陣列keymap。
如果接收到的make code是mc,沒有按下shift鍵,對應的值是keymap[mc * 3];按下shift鍵,對應的值是keymap[mc * 3 + 1]。
反正就是這麼回事,硬是要解釋一下怎麼弄出這個陣列的,我解釋不清楚。
pause
pause鍵只有make code,沒有break code。這是僅有的特例,其他鍵同時具有make code和break code。
pause鍵的make code是e1、1d、45、e1、9d、c5。識別乙個鍵是不是pause的演算法是:
檢查make code的開頭是不是`e1。
不是,不是pause鍵。
是,繼續檢查剩餘的掃瞄碼是不是1d、45、e1、9d、c5。不是,不是pause鍵;是,是pause鍵。
敲擊鍵盤後字元怎麼出現在顯示器
我們每敲擊一次電腦鍵盤,按鍵對應的字元就會出現在顯示器上。這中間發生了什麼?請聽我慢慢細說。人對按鍵的操作,從兩個維度去描述,乙個是 動作 另乙個是 內容 按下乙個按鍵,鬆開乙個按鍵,按下乙個按鍵並且保持按住狀態一段時間 長按 這些都是動作。每個按鍵和動作組合起來,會傳送給計算機乙個編碼,這就是內容...
敲擊鍵盤時發生的哪些事(其一)
一 i o裝置 鍵盤 cpu和記憶體最核心,其他都統稱為 輸入輸出 i o 裝置,大部分都是通過usb臨時接入到計算機,硬碟也是 輸入輸出 i o 裝置,但是它 儲存著所有的程式和資料 包括作業系統老大。鍵盤,和滑鼠一樣,是個典型的輸入裝置,像我這樣的i o裝置多如牛毛,比如顯示卡,音效卡,網絡卡,...
銳捷工程師 深夜敲擊鍵盤的樣子,很燃
週末凌晨三點,我從客戶單位離開。回想起剛剛經歷的一切,焦急 忙亂,甚至有些驚心動魄 但我沒有想過放棄。我是一名銳捷技術服務工程師,我的使命就是為客戶解決問題。一 週末深夜的 叮鈴鈴 叮鈴鈴 手機響了。我帶著朦朧的睡意接起了 心裡還在想,大週末晚上的到底是誰在擾人清夢。你好,請問是銳捷工程師嗎?我是,...