隨著IBM PC機的發(fā)展,鍵盤也分為XT, AT, PS/2鍵盤以至于后來的USB鍵盤. PC系列機使用的鍵盤有83鍵、84鍵、101鍵、102鍵和104鍵等多種。XT和AT機的標準鍵盤分別為83鍵和84鍵,而286機以上微機的鍵盤則 普遍使用101鍵、102鍵或104鍵。83鍵鍵盤是最早使用的一種PC機鍵盤,其鍵號與掃描碼是一致的。這個掃描碼被直接發(fā)送到主機箱并轉(zhuǎn)換為 ASCII碼;隨著高檔PC機的出現(xiàn),鍵盤功能和按鍵數(shù)目得到了擴充,鍵盤排列也發(fā)生了變化,產(chǎn)生的掃描碼與83鍵鍵盤的掃描碼不同。為了保持PC系列微 機的向上兼容性,需將84/101/102/104鍵鍵盤的掃描碼轉(zhuǎn)換為83鍵鍵盤的掃描碼,一般將前者叫作行列位置掃描碼,而將后者稱為系統(tǒng)掃描碼。顯 然,對于83鍵鍵盤,這兩種掃描碼是相同的。
鍵盤是由一組排列成矩陣方式的按鍵開關(guān)組成,通常有編碼鍵盤和非編碼鍵盤兩種類型,IBM系列個人微型計算機的鍵盤屬于非編碼類型。微機鍵盤主要由單片 機、譯碼器和鍵開關(guān)矩陣三大部分組成。其中單片機采用了INTEL8048單片微處理器控制,這是一個40引腳的芯片,內(nèi)部集成了8位 CPU、1024×8位的ROM、64×8位的RAM、8位的定時器/計數(shù)器等器件。由于鍵盤排列成矩陣格式,被按鍵的識別和行列位置掃描碼的產(chǎn)生,是由 鍵盤內(nèi)部的單片機通過譯碼器來實現(xiàn)的。單片機在周期性掃描行、列的同時,讀回掃描信號線結(jié)果,判斷是否有鍵按下,并計算按鍵的位置以獲得掃描碼。當有鍵按 下時,鍵盤分兩次將位置掃描碼發(fā)送到鍵盤接口;按下一次,叫接通掃描碼;釋放時再發(fā)一次,叫斷開掃描碼。因此可以用硬件或軟件的方法對鍵盤的行、列分別進 行掃視,去查找按下的鍵,輸出掃描位置碼,通過查表轉(zhuǎn)換為ASCII碼返回。
鍵盤是與主機箱分開的一個獨立裝置,通過一根5芯電纜與主機箱連接,系統(tǒng)主板上的鍵盤接口按照鍵盤代碼串行傳送的應(yīng)答約定,接受鍵盤發(fā)送來的掃描碼;鍵盤 在掃描過程中,7位計數(shù)器循環(huán)計數(shù)。當高5位(D6一D2)狀態(tài)為全“0”時,經(jīng)譯碼器在O列線上輸出一個“0”,其余均為“1”;而計數(shù)器的低二位 (D1D0)通過4選1多路選擇器控制0—3行的掃描。計數(shù)器計一個數(shù)則掃描一行,計4個數(shù)全部行線掃描一遍,同時由計數(shù)器內(nèi)部向D2進位,使另一列線1 變低,行線再掃描一遍。只要沒有鍵按下,多路選擇器就一直輸出高電平,則時鐘一直使計數(shù)器循環(huán)計數(shù),對鍵盤輪番掃描。當有一個鍵被按下時,若掃描到該鍵所 在的行和列時,多路選擇器就會輸出一個低電平,去封鎖時鐘門,使計數(shù)器停止計數(shù)。這時計數(shù)器輸出的數(shù)據(jù)就是被按鍵的位置碼(即掃描碼)。8048利用程序 讀取這個鍵碼后,在最高位添上一個“O”,組成一個字節(jié)的數(shù)據(jù),然后從P22引腳以串行方式輸出。在8048檢測到鍵按下后,還要繼續(xù)對鍵盤掃描檢測,以 發(fā)現(xiàn)該鍵是否釋放。當檢測到釋放時,8048在剛才讀出的7位位置碼的前面(最高位)加上一個“1”,作為“釋放掃描碼”,也從 P22引腳串行送出去,以便和“按下掃描碼”相區(qū)別。送出“釋放掃描碼”的目的是為識別組合鍵和上、下檔鍵提供條件。
同時,主機還向鍵盤發(fā)送控制信號,主機CPU響應(yīng)鍵盤中斷請求時,通過外圍接口芯片8255A一5的PA口讀取鍵盤掃描碼并進行相應(yīng)轉(zhuǎn)換處理和暫存;通過PB口的PB6和PB7來控制鍵盤接口工作。
從用途上看,鍵盤可分為臺式機鍵盤、筆記本電腦鍵盤和工控機鍵盤三大類;其中臺式機鍵盤從按鍵結(jié)構(gòu)上又可分為兩類,即機械鍵盤和電容鍵盤(又稱有觸點鍵盤 和無觸點鍵盤)。機械鍵盤存在著開關(guān)容易損壞、易污染、易老化的缺點,現(xiàn)已基本淘汰。電容鍵盤在可靠性上比前者有質(zhì)的飛躍,使用壽命較長,目前大多為電容 鍵盤。
早期的鍵盤是由美國IBM公司推出的,當時采用的計算機鍵盤為83鍵鍵盤。不久IBM又推出了84鍵的鍵盤設(shè)計標準,將鍵盤分為三個區(qū),即功能區(qū)、打字鍵 區(qū)及負責光標控制和編輯的副鍵盤區(qū),這種鍵盤主要區(qū)域的劃分標準一直沿用至今。隨著微軟Windows視窗操作系統(tǒng)的廣泛應(yīng)用,IBM公司于1986年首 次推出了101鍵的標準鍵盤,除添加了F11、F12兩個功能鍵之外,還在鍵盤的中部多加了一組專用的光標控制和編輯的鍵,使鍵盤功能得到了進一步擴充, 成為當時業(yè)界的標準鍵盤。后來,為與微軟的Win95操作系統(tǒng)相配合,IBM又推出了104鍵鍵盤,新增了3個功能鍵(亦稱Windows快捷鍵或熱鍵 <HotKey>),使以前需要打開好幾個窗口才能完成的某些功能,通過快捷鍵的設(shè)定直接啟動菜單完成,而不必再點擊鼠標,這樣就使計算機的 操作更加便易。目前,這種104鍵的鍵盤(亦稱Win95鍵盤)的設(shè)計已成為業(yè)界和市場上最為普遍、最為流行的一種標準,業(yè)界通稱為標準鍵盤。實際上,所 謂的標準鍵盤并沒有標準,只因其應(yīng)用較為廣泛而被業(yè)界通稱為標準鍵盤。由于軟件的不斷升級更新,為配合軟件的需要,所謂的標準鍵盤的鍵數(shù)也在隨之擴增,并 因其又被業(yè)界所通常采納而又被業(yè)界通稱為標準鍵盤。
但是,無論是機械鍵盤或者電容鍵盤,還是從早期的83鍵鍵盤發(fā)展到目前通稱的標準鍵盤104鍵鍵盤,其應(yīng)用都是主要依賴于硬件CPU和軟件操作系統(tǒng)。以下就鍵盤的構(gòu)造及工作原理等問題進行介紹。
(一)鍵盤構(gòu)造及工作原理
PS/2設(shè)備履行一種雙向同步串行協(xié)議。換句話說,每次數(shù)據(jù)線上發(fā)送一位數(shù)據(jù)并且每在時鐘線上發(fā)一個脈沖就被讀入。設(shè)備可以發(fā)送數(shù)據(jù)到主機,而主機也可以發(fā)送數(shù)據(jù)到設(shè)備,但主機總是在總線上有優(yōu)先權(quán),它可以在任何時候抑制來自設(shè)備的通信,只需把時鐘線電平拉低即可。
鍵盤的內(nèi)部結(jié)構(gòu)主要包括控制電路板、按鍵、底板和面板等。電路板是整個鍵盤的控制核心,位于鍵盤的內(nèi)部,主要擔任按鍵掃描識別、編碼和傳輸接口工作;它將各個鍵所表示的數(shù)字或字母轉(zhuǎn)換成計算機可以識別的信號,是用戶和計算機之間主要的溝通者之一。
鍵盤主要由鍵開關(guān)矩陣、單片機和譯碼器三大部分組成。鍵開關(guān)矩陣即鍵盤按鍵由一組排列成矩陣方式的按鍵開關(guān)組成,所輸入的信號由按鍵所在的位置決定。單片 機即鍵盤內(nèi)部采用的Intel 8048單片機微處理器,這是一個40引腳的芯片,內(nèi)部集成了8位CPU、1024×8位的ROM、64×8位的RAM以 及8位的定時器/計數(shù)器等。譯碼器即信號編碼轉(zhuǎn)譯裝置,把鍵盤的字符信號通過編碼翻譯轉(zhuǎn)換成相應(yīng)的二進制碼。由于鍵盤排列成矩陣格式,被按鍵的識別和行列 位置掃描碼的產(chǎn)生,是由鍵盤內(nèi)部的單片機通過譯碼器來實現(xiàn)的。根據(jù)鍵盤向主機送入的二進制代碼類型,可把鍵盤分為編碼鍵盤和非編碼鍵盤兩種。IBM PC機的鍵盤屬于非編碼鍵盤,其特點是不直接提供所按鍵的編碼信息,而是用較為簡單的硬件和一套專用程序來識別所按鍵的位置,并提供與所按鍵相對應(yīng)的中間 代碼,然后再把中間代碼轉(zhuǎn)換成要對應(yīng)的編碼。這樣,非編碼鍵盤就為系統(tǒng)軟件在定義鍵盤的某些操作功能上提供了更大的靈活性。
計算機鍵盤通常采用行列掃描法來確定按下鍵所在的行列位置。所謂行列掃描法是指,把鍵盤按鍵排列成n行×m列的n*m行列點陣,把行、列線分別連接到兩個 并行接口雙向傳送的連接線上,點陣上的鍵一旦被按動,該鍵所在的行列點陣信號就被認為已接通。按鍵所排列成的矩陣,需要用硬件或軟件的方法輪轉(zhuǎn)順序地對其 行、列分別進行掃描,以查詢和確認是否有鍵按動。如有鍵按動,鍵盤就會向主機發(fā)送被按鍵所在的行列點陣的位置編碼,稱為鍵掃描碼。單片機通過周期性掃描 行、列線,讀回掃描信號結(jié)果,判斷是否有鍵按下,并計算按鍵的位置以獲得掃描碼。鍵被按下時,單片機分兩次將位置掃描碼發(fā)送到鍵盤接口:按下一次,叫接通 掃描碼;按完釋放一次,叫斷開掃描碼。這樣,通過硬件或軟件的方法對鍵盤分別進行行、列掃視,就可以確定按下鍵所在位置,獲得并輸出掃描位置碼,然后轉(zhuǎn)換 為ASCII碼,經(jīng)過鍵盤I/O電路送入主機,并由顯示器顯示出來。
鍵盤要增加鍵數(shù)是很容易的,任何矩陣鍵盤通過增加鍵盤的行或列便可實現(xiàn)增加按鍵數(shù)。如64 鍵的鍵盤排列成8行×8列的行列點陣,128鍵的鍵盤排列成8行×16列的行列點陣,256鍵的鍵盤排列成16行×16列的行列點陣,這在1992年7月 出版的《微處理機為基礎(chǔ)之設(shè)計》出版物上已作介紹(此對比文獻在2001年12月13日已遞交)。因此,鍵盤結(jié)構(gòu)采用矩陣式早已是公有技術(shù)。
(二)鍵盤的按鍵增加及功能改進
隨著計算機CPU(硬件)和Windows操作系統(tǒng)(軟件)的不斷升級換代,計算機的發(fā)展進入到了包括多媒體在內(nèi)的高速多功能時代。與此相適應(yīng),計算機鍵 盤也出現(xiàn)了一些新的變化,主要表現(xiàn)在鍵盤鍵數(shù)的增加及功能的整合。美國蘋果(Apple)公司早在1992年就曾推出過設(shè)有調(diào)整音量按鍵的鍵盤。時下流行 的多媒體鍵盤,也叫多功能鍵盤,其特征是增加了一些快捷鍵(或功能鍵),通過設(shè)定主板BIOS或軟件設(shè)定,使這些新增的鍵可以實現(xiàn)開關(guān)電腦、休眠啟動、 CD播放、音量調(diào)整、一鍵上網(wǎng)等特殊功能。此外還出現(xiàn)了一些多功能集成的鍵盤,如將掃描儀、錄音設(shè)備或手寫板、鼠標等整合為一體的鍵盤,以及帶有文字編輯 或指紋識別功能的智能鍵盤等。
如前所述,IBM定義的101鍵鍵盤與微軟(Microsoft)所定義的三鍵共同形成的104 鍵Win95鍵盤一般被稱作標準鍵盤,那么標準鍵盤的104鍵之外如何增加按鍵擴充功能呢?從目前鍵盤發(fā)展情況看,可以有多種方法。單就增加鍵盤按鍵的設(shè) 定技術(shù)看,一般來講,按鍵的增加取決于三個方面的因素:一是CPU能識別,二是操作系統(tǒng)能響應(yīng),三是鍵盤內(nèi)部電路結(jié)構(gòu)能安排。從前面的介紹可知,CPU和 操作系統(tǒng)這兩個因素是計算機必備的現(xiàn)成技術(shù),不成問題。這樣,增加鍵盤按鍵的關(guān)鍵就在于鍵盤的內(nèi)部結(jié)構(gòu)。以下兩種方法可以直接簡便地增加鍵盤按鍵。
目前PC機鍵盤按鍵一直沿用IBM的行列矩陣方式布局排列,稱為掃描矩陣,其內(nèi)部電路結(jié)構(gòu)的核心是8048(包括其后續(xù)升級系列)單片機微處理器。根據(jù)單 片機微處理器特定的I/O(即Input/Output輸入/輸出)電路,IBM將鍵盤按鍵的行列矩陣定義為8行×16列=128鍵,而現(xiàn)行的標準鍵盤只 使用了其中的104鍵,故尚有128-104=24鍵的陣點閑余,尚未定義。因此,增加按鍵的方法之一是,直接在這尚未定義的24個閑余按鍵陣點中繼續(xù)定 義新鍵以擴增新的功能鍵。方法之二是,通過改變單片機微處理器I/O電路的配線方式,可以把IBM的原8行×16列掃描矩陣變?yōu)椋?+n)行×16列,如 (8+1)行×16列=144鍵等,這樣就會在128鍵之外獲得新增加的一行16個鍵位,再根據(jù)需要為其定義功能。以上兩種方法都可以達到增加104鍵的 標準鍵盤的按鍵數(shù)的目的。簡而言之,第一種方法是在原掃描矩陣8行×16列的行列點陣中尚未利用的24個點上,根據(jù)需要可任意增加1至24個新鍵;第二種 方法是在單片機微處理器原掃描矩陣8行×16列基礎(chǔ)上再增加一行,變?yōu)?行×16列掃描矩陣,再根據(jù)需要任意增加新鍵,并不會帶來單片機微處理器本身原有 功能的更新。如IBM 的83鍵盤發(fā)展到原來的標準鍵盤101鍵,其要增加的鍵數(shù)只要通過增加鍵盤的行或列,并在增加的行列陣點上進行定義便可實現(xiàn);而原來的101鍵的標準鍵盤 后發(fā)展到目前的104鍵的標準鍵盤,其增加的3個鍵數(shù)可以不增加鍵盤的行和列,只要在原掃描矩陣中尚未定義的點上直接定義就可以。無論是第一種方法還是第 二種方法,都已經(jīng)屬于公有技術(shù)領(lǐng)域的技術(shù)。
什么是鍵盤的鍵位沖突?
簡單的說,也就是當你同時按下鍵盤上的幾個鍵的時候,這幾個鍵不能同時反映出來,這就叫做鍵盤的鍵位沖突。例如說,你能想象當你按下Ctrl-Alt-Del時,系統(tǒng)只能接收到前兩個鍵,而死活不承認你按了Del鍵嗎?
當然,現(xiàn)實中是不會有這樣的鍵盤的,按不下Ctrl-Alt-Del的鍵盤根本就沒法出廠,但其他一些常見的鍵位沖突就不稀奇了。例如,經(jīng)常有一些鍵盤不能同時對例如A-S-空格這樣的按鍵組合作出反應(yīng),這樣在FPS游戲中,使用者就會大為吃虧。
對于鍵位沖突問題,電腦用戶中有兩種完全不同的態(tài)度,絕大多數(shù)人根本意識不到鍵位沖突問題的存在,直到遇到?jīng)_突的時候才叫苦不迭,并且大呼“為什么他就能 做這個動作?”;而另一部分人,特別是一些游戲高手,又在孜孜不倦的尋找“沒有鍵位沖突的鍵盤”。這兩種人都是對鍵位沖突的原因認識不清楚的。
鍵位沖突的直接起因,是鍵盤的非編碼結(jié)構(gòu)。在2月號的專題中,我們提到過現(xiàn)在的鍵盤幾乎都是非編碼的薄膜接觸式鍵盤,那么什么是非編碼鍵盤呢?在專題里我們沒有詳細的解釋,下面我們就來詳細說明一下非編碼鍵盤的原理與結(jié)構(gòu)。
傳統(tǒng)的鍵盤,是編碼式鍵盤,它的每個鍵按下時都會產(chǎn)生唯一的按鍵編碼,并且通過專有的一組導線傳輸?shù)芥I盤接口電路,由于其線路和編碼的唯一性,這種鍵盤是不存在鍵位沖突的問題的,但是編碼鍵盤結(jié)構(gòu)復雜,現(xiàn)在已經(jīng)很少使用了。
而現(xiàn)代的薄膜接觸式鍵盤,任何一個按鍵都有上下兩層薄膜的觸點,我們將它拆開來仔細看一看(如圖),就會發(fā)現(xiàn)在任何一層薄膜上,導線數(shù)都遠少于按鍵數(shù),而 且每一條導線都同時連通多個按鍵的觸點,而且,上層和下層的任何兩條導線都最多只在一個按鍵上重合。也就是說,上層的1號導線可能會同時經(jīng)過1、2、3、 4、5……等按鍵,而下層的1號導線可能同時經(jīng)過1、Q、A、Z……等按鍵,且兩條導線只在1鍵上重合。
什么是鍵盤的鍵位沖突?簡單的說,也就是當你同時按下鍵盤上的幾個鍵的時候,這幾個鍵不能同時反映出來,這就叫做鍵盤的鍵位沖突。例如說,你能想象當你按下Ctrl-Alt-Del時,系統(tǒng)只能接收到前兩個鍵,而死活不承認你按了Del鍵嗎?
當然,現(xiàn)實中是不會有這樣的鍵盤的,按不下Ctrl-Alt-Del的鍵盤根本就沒法出廠,但其他一些常見的鍵位沖突就不稀奇了。例如,經(jīng)常有一些鍵盤不能同時對例如A-S-空格這樣的按鍵組合作出反應(yīng),這樣在FPS游戲中,使用者就會大為吃虧。
對于鍵位沖突問題,電腦用戶中有兩種完全不同的態(tài)度,絕大多數(shù)人根本意識不到鍵位沖突問題的存在,直到遇到?jīng)_突的時候才叫苦不迭,并且大呼“為什么他就能 做這個動作?”;而另一部分人,特別是一些游戲高手,又在孜孜不倦的尋找“沒有鍵位沖突的鍵盤”。這兩種人都是對鍵位沖突的原因認識不清楚的。
鍵位沖突的直接起因,是鍵盤的非編碼結(jié)構(gòu)。在2月號的專題中,我們提到過現(xiàn)在的鍵盤幾乎都是非編碼的薄膜接觸式鍵盤,那么什么是非編碼鍵盤呢?在專題里我們沒有詳細的解釋,下面我們就來詳細說明一下非編碼鍵盤的原理與結(jié)構(gòu)。
傳統(tǒng)的鍵盤,是編碼式鍵盤,它的每個鍵按下時都會產(chǎn)生唯一的按鍵編碼,并且通過專有的一組導線傳輸?shù)芥I盤接口電路,由于其線路和編碼的唯一性,這種鍵盤是不存在鍵位沖突的問題的,但是編碼鍵盤結(jié)構(gòu)復雜,現(xiàn)在已經(jīng)很少使用了。
而現(xiàn)代的薄膜接觸式鍵盤,任何一個按鍵都有上下兩層薄膜的觸點,我們將它拆開來仔細看一看(如圖),就會發(fā)現(xiàn)在任何一層薄膜上,導線數(shù)都遠少于按鍵數(shù),而 且每一條導線都同時連通多個按鍵的觸點,而且,上層和下層的任何兩條導線都最多只在一個按鍵上重合。也就是說,上層的1號導線可能會同時經(jīng)過1、2、3、 4、5……等按鍵,而下層的1號導線可能同時經(jīng)過1、Q、A、Z……等按鍵,且兩條導線只在1鍵上重合。
這樣,根據(jù)上層薄膜和下層薄膜所經(jīng)過的按鍵,就可以排出一個類似下面的表格:
|
上層導線1 |
上層導線2 |
上層導線3 |
上層導線4 |
上層導線5 |
…… |
下層導線1 |
1 |
2 |
3 |
4 |
5 |
…… |
下層導線2 |
Q |
W |
E |
R |
T |
…… |
下層導線3 |
A |
S |
D |
F |
G |
…… |
下層導線4 |
Z |
X |
C |
V |
B |
…… |
…… |
…… |
…… |
…… |
…… |
…… |
…… |
在非編碼鍵盤的接口控制電路中,就存儲著這樣一張表格,當按下某個按鍵,例如“Q”時,那么在這一點上,上下兩個觸點就會連通,反映到接口電路中,就會檢 測到上層導線1與下層導線2被連通了。相對應(yīng)在表中一查,就會知道,被按下的是字母“Q”,然后通過接口輸出其ASCII碼。
與老式的編碼式鍵盤相比,非編碼鍵盤的結(jié)構(gòu)要簡單許多,省略了復雜的編碼電路和蜘蛛網(wǎng)似的走線,而且更重要的是,由于非編碼式鍵盤將按鍵結(jié)構(gòu)和輸出鍵碼分 離,所以當需要制造不同鍵位排列的鍵盤時,不需要重新設(shè)計鍵盤線路,而只要將控制電路中的鍵位排列表格重新刷新就可以了。例如在德文鍵盤上,子母“Y”和 “Z”的位置是互調(diào)的,那么如果要把一條英文鍵盤生產(chǎn)線改造成德文鍵盤生產(chǎn)線,什么都不用改變,只須在控制芯片中刷進一個新的排列表,將“上層導線1-下 層導線4”的位置寫作“Y”,“Z”字也作同樣處理就行了,顯然比重新布線要簡單了很多。這也就是為什么非編碼式鍵盤大行其道的原因。
但是非編碼式鍵盤帶來的就是“鍵位沖突”的問題。以上面的按鍵排列表為例,當按下一個按鍵時,鍵盤肯定會正常識別的;當按下兩個按鍵時,例如同時按下 “Q”與“D”,此時上層導線1與下層導線2連通,而上層導線3與下層導線3連通,系統(tǒng)完全可以正常識別;或者同時按下“Q”與“E”,此時,上層導線 1、下層導線2、上層導線3同時連通,系統(tǒng)同樣可以正常識別出是按下了這三個按鍵。
但在同時按下3個或3個以上按鍵時,情況就復雜了。
在一種情況下,例如同時按下“Q”、“D”、“B”時,此時,從表中我們可以看出,上層導線1-下層導線2、上層導線3-下層導線3、上層導線5-下層導線4都分別連通,此時系統(tǒng)完全可以正常識別出按下了這三個按鍵。
但當按下的第三個按鍵不是“B”,而是“E”呢?
此時,我們可以發(fā)現(xiàn),由于第三組連通的導線變成了上層導線3-下層導線2,所以,此時反映到接口控制芯片的信號是:上層導線1-下層導線2-上層導線3-下層導線3統(tǒng)統(tǒng)被連通到了一起。
但是,問題就在于,除了按下的第三個按鍵是“E”以外,如果按下的第三個鍵是用來連通上層導線1和下層導線3的“A”,也會有同樣的信號組合?事實上, “Q”、“E”、“A”、“B”四個按鍵中按下任何三個都會有同樣的信號組合,那么此時接口電路怎么判斷呢?究竟是按下了哪三個按鍵或者是同時把四個按鍵 都按下了呢?
這個時候,大多數(shù)鍵盤選擇的方式,就是按照一個固定的規(guī)則輸出固定的按鍵組合代碼,對于其他可能的組合方式統(tǒng)統(tǒng)予以忽略,換句話說,在上面的鍵盤中,可能 無論你怎么按這四個按鍵,它可能永遠只會輸出“Q”-“E”-“D”的組合,盡管可能你按下的實際是“Q”-“A”-“D”(這里只是一個假設(shè),實際上為 了避免誤碼,大多數(shù)鍵盤根本只輸出兩個按鍵而已)。于是,“鍵位沖突”就出現(xiàn)了。
由于非編碼鍵盤的固有結(jié)構(gòu),“鍵位沖突”是不可避免的。于是就需要鍵盤的設(shè)計者絞盡腦汁修改鍵盤的線路排列和待查表格,盡量使可能會有的常用組合按鍵避開 沖突鍵位——盡管要做到所有的按鍵都不發(fā)生沖突是不可能的,但你總不能讓Ctrl-Alt-Del相互沖突吧?那這樣的鍵盤還怎么用?還有如果四個方向鍵 相互沖突,那賽車類的游戲還怎么玩?
不過,由于市場上的游戲?qū)嵲谔啵總€游戲都可能會有自己常用的按鍵組合,甚至每個人都有自己的習慣按鍵,鍵盤的設(shè)計者當然不可能面面俱到,有經(jīng)驗的設(shè)計 師可能會考慮得多一些,至少對最常見的游戲和最常見的按鍵設(shè)置能夠保證不出現(xiàn)問題,但要考慮到所有情況當然是不可能的。
所以,當你購買鍵盤的時候,絕對不要忽略“鍵位沖突”的問題,一定要把鍵盤裝到電腦上,試一試自己常玩的游戲是否能夠正常使用(只有實際試用才能試出鍵位 沖突問題,由于它與鍵位表相關(guān),所以看外表是看不出來的)。同時,一些游戲高手朋友也不要白費心機去尋找什么“沒有鍵位沖突的鍵盤”了,只要它依然是非編 碼鍵盤,那么鍵位沖突就是不可避免的,只要它的鍵位沖突不對你所玩的游戲構(gòu)成影響,這就足夠了。
PS/2協(xié)議分析
The PS/2 mouse and keyboard implement a bidirectional synchronous serial protocol.
PS/2鼠標和鍵盤執(zhí)行一個雙向同步串行協(xié)議。
The bus is "idle" when both lines are high (open-collector).
總線空閑時,兩條線都是高電平(集電極開路)。
This is the only state where the keyboard/mouse is allowed begin transmitting data.
在這種狀態(tài)下,鍵盤/鼠標才允許開始傳輸數(shù)據(jù)。
The host has ultimate control over the bus and may inhibit communication at any time by pulling the Clock line low.
主機對總線有最高的控制權(quán),在任何時候通過將時鐘線拉低就可以禁止通信。
The device always generates the clock signal.
時鐘信號總是由設(shè)備端生成的。
If the host wants to send data, it must first inhibit communication from the device by pulling Clock low.
如果主機想發(fā)送數(shù)據(jù),它必須先將時鐘拉低來禁止來自設(shè)備端的通信。
The host then pulls Data low and releases Clock.
然后主機再拉低數(shù)據(jù)線,釋放時鐘。 注釋:釋放時鐘,就是再恢復時鐘為高
This is the "Request-to-Send" state and signals the device to start generating clock pulses.
這就是"請求發(fā)送(Request-to-Send)"狀態(tài),提示 設(shè)備端 開始生成時鐘信號。
Summary: Bus States
Data = high, Clock = high: Idle state.
Data = high, Clock = low: Communication Inhibited.
Data = low, Clock = high: Host Request-to-Send
總結(jié):總線狀態(tài)
數(shù)據(jù) 0 1
0 ---------通信禁止-----------
時鐘
1 主機要求發(fā)送 總線空閑
The clock and data pins are bidirectional, open-collector
signals that are pulled to 5 V by pullup resistors in the keyboard.
時鐘和數(shù)據(jù) 引腳時 雙向 集電極開路的信號,可以被鍵盤內(nèi)部的上拉電阻 拉高到5V
Data sent from the device to the host is read on the falling edge of the clock signal; data sent from the host to the device is read on the rising edge.
從設(shè)備發(fā)送給主機的數(shù)據(jù)時在時鐘信號的下降沿讀取的;從主機發(fā)給設(shè)備的數(shù)據(jù)是在上升沿讀取的。
The clock frequency must be in the range 10 - 16.7 kHz. This means clock must be high for 30 - 50 microseconds and low for 30 - 50 microseconds..
時鐘頻率必須在10-16.7KHz之間。這意味著時鐘必須是 高電平持續(xù)30~50毫秒,低電平持續(xù)
30~50毫秒。
If you're designing a keyboard, mouse, or host emulator, you should modify/sample the Data line in the middle of each cell. I.e. 15 - 25 microseconds after the appropriate clock transition.
如果你設(shè)計一個鍵盤 鼠標 或者 主機模擬器,你必須 在每個單元的中間時刻 (也就是,在時鐘跳變之后的15~25毫秒后) 修改/取樣數(shù)據(jù)線.
Again, the keyboard/mouse always generates the clock signal, but the host always has ultimate control over communication.
重復一遍,鍵盤/鼠標 總是 生成時鐘信號, 而 主機 控制著整個通信過程。
Timing is absolutely crucial. Every time quantity I give in this article must be followed exactly.
時序是非常重要的。在本文中給出的時間數(shù)必須嚴格遵循。
設(shè)備發(fā)送數(shù)據(jù)到主機
The Data and Clock lines are both open collector.
數(shù)據(jù)和時鐘線都是集電極開路的。
A resistor is connected between each line and +5V, so the idle state of the bus is high.
在+5V 和每根線 之間連接著一個電阻,所以 總線的空閑狀態(tài) 是 高電平。
When the keyboard or mouse wants to send information, it first checks the Clock line to make sure it's at a high logic level.
當鍵盤或者鼠標想發(fā)送數(shù)據(jù)時,它首先必須檢查時鐘線 ,確認它處于高電平。
If it's not, the host is inhibiting communication and the device must buffer any to-be-sent data until the host releases Clock.
如果不是,主機禁止通信,設(shè)備必須緩沖任何要發(fā)送的數(shù)據(jù),直到主機釋放時鐘。
The Clock line must be continuously high for at least 50 microseconds before the device can begin to transmit its data.
在設(shè)備開始傳輸數(shù)據(jù)之前,時鐘線 必須持續(xù)為 高電平的 時間 必須 至少50ms
The keyboard/mouse writes a bit on the Data line when Clock is high, and it is read by the host when Clock is low.
當時鐘為高電平時,鍵盤/鼠標寫一個bit到數(shù)據(jù)線上;當時鐘為低電平時,主機從數(shù)據(jù)線上讀取這個bit 。
The Data line changes state when Clock is high and that data is valid when Clock is low.
當時鐘位高時,數(shù)據(jù)線 改變狀態(tài);
當時鐘位低時,(數(shù)據(jù)線上的)數(shù)據(jù)是有效的。
The clock frequency is 10-16.7 kHz.
時鐘頻率是10-16.7KHz
The time from the rising edge of a clock pulse to a Data transition must be at least 5 microseconds.
從時鐘脈沖的上升沿到數(shù)據(jù)跳變 的時間必須至少 5ms
The time from a data transition to the falling edge of a clock pulse must be at least 5 microseconds and no greater than 25 microseconds.
從數(shù)據(jù)跳變 到時鐘脈沖的下降沿 必須 至少5ms,且不超過25ms
The host may inhibit communication at any time by pulling the Clock line low for at least 100 microseconds.
主機可在任何時間禁止通信,只需要將時鐘線下拉位低電平超過100ms即可
If a transmission is inhibited before the 11th clock pulse, the device must abort the current transmission and prepare to retransmit the current "chunk" of data when host releases Clock.
如果在第11個脈沖時禁止傳輸,設(shè)備必須中止當前的傳輸,準備重新傳輸當前的數(shù)據(jù)"chunk(塊)"當主機釋放時鐘時
A "chunk" of data could be a make code, break code, device ID, mouse movement packet, etc.
一個數(shù)據(jù)塊可能時 通碼,斷碼,設(shè)備ID,鼠標移動包 等等。
For example, if a keyboard is interrupted while sending the second byte of a two-byte break code, it will need to retransmit both bytes of that break code, not just the one that was interrupted.
舉個例子,如果當發(fā)送 一個兩字節(jié)斷碼的 第2個字節(jié)時,鍵盤被中斷,它將需要重新發(fā)送
此斷碼的兩個字節(jié),而不僅僅時被中斷掉的那個字節(jié)。
If the host pulls clock low before the first high-to-low clock transition, or after the falling edge of the last clock pulse, the keyboard/mouse does not need to retransmit any data.
如果在第一個 高->低 時鐘跳變 時,(或者在 最后一個時鐘脈沖的下降沿 之后)主機將時鐘拉低,鍵盤/鼠標 不必重新傳輸任何數(shù)據(jù)。
However, if new data is created that needs to be transmitted, it will have to be buffered until the host releases Clock.
但是,如果新產(chǎn)生的數(shù)據(jù)需要傳輸,它必須將數(shù)據(jù)緩沖,知道主機釋放時鐘。
Keyboards have a 16-byte buffer for this purpose. If more than 16 bytes worth of keystrokes occur, further keystrokes will be ignored until there's room in the buffer.
鍵盤有一個16字節(jié)的緩沖區(qū)。如果有超過16個字節(jié)的擊鍵存在,更多的擊鍵將被忽略。直到
緩沖區(qū)有空地。
Mice only store the most current movement packet for transmission.
鼠標只能緩沖最近的一個要傳輸?shù)模ㄒ苿?數(shù)據(jù)包。
|
Time to auxiliary device inhibit after clock 11 to ensure the auxiliary device does not start another transmission
The auxiliary device checks the 'clock' line. If the line is inactive, output from the device is not allowed.
輔助設(shè)備(指 鍵盤) 檢查 時鐘線 ,如果時低電平,禁止發(fā)送數(shù)據(jù)
The auxiliary device checks the 'data' line. If the line is inactive, the controller receives data from the system.
設(shè)備檢查數(shù)據(jù)線,如果是 低電平,那么控制器從系統(tǒng)接收數(shù)據(jù)
The auxiliary device checks the 'clock' line during the transmission at intervals not exceeding 100 microseconds. If the device finds the system holding the 'clock' line inactive, the transmission is terminated. The system can terminate transmission anytime during the first 10 clock cycles.
設(shè)備在傳輸過程中 檢查 時鐘 線 間隔不超過100us。 如果設(shè)備發(fā)現(xiàn) 主機系統(tǒng) 將電平拉低,就終止傳輸。 在傳輸過程的前10個時鐘周期的任何時候,主機系統(tǒng)可以中止傳輸。
A final check for terminated transmission is performed at least 5 microseconds after the 10th clock.
終止傳輸?shù)淖詈笠粋€檢查 要持續(xù)至少5us
The system can hold the 'clock' signal inactive to inhibit the next transmission.
系統(tǒng)拉低時鐘線,將禁止下一次傳輸
The system can set the 'data' line inactive if it has a byte to transmit to the device. The 'data' line is set inactive when the start bit (always 0) is placed on the 'data' line.
系統(tǒng)如果有一個字節(jié)要傳輸給設(shè)備,可以拉低數(shù)據(jù)線。當開始位(總是0)放置到數(shù)據(jù)線時,數(shù)據(jù)線被拉低。
The system raises the 'clock' line to allow the next transmission.
系統(tǒng)拉高時鐘將允許下一次傳輸
Host-to-Device主機到設(shè)備的通信
First of all, the PS/2 device always generates the clock signal.
首先,PS/2設(shè)備總是產(chǎn)生時鐘信號
If the host wants to send data, it must first put the Clock and Data lines in a "Request-to-send" state as follows:
如果主機想發(fā)送數(shù)據(jù),它必須先將時鐘線和數(shù)據(jù)線設(shè)置成"Request-to-send"狀態(tài):
1) Inhibit communication by pulling Clock low for at least 100 microseconds.
拉低時鐘線至少100us來禁止通信
2) Apply "Request-to-send" by pulling Data low, then release Clock.
拉低數(shù)據(jù)線,請求 "Request-to-send", 然后釋放時鐘 .
The device should check for this state at intervals not to exceed 10 milliseconds.
設(shè)備應(yīng)該在不超過10ms(注意,是毫秒)的間隔內(nèi)就要檢查一次這個狀態(tài)。
When the device detects this state, it will begin generating Clock signals and clock in eight data bits and one stop bit.
當設(shè)備檢測到這個狀態(tài),它將開始產(chǎn)生時鐘信號,
The host changes the Data line only when the Clock line is low, and data is read by the device when Clock is high.
只有當時鐘線 為低的時候,主機才可以改變數(shù)據(jù)線(也就是將數(shù)據(jù)寫入到數(shù)據(jù)線)。數(shù)據(jù)將在時鐘為高電平的時候 被 設(shè)備讀取。
After the stop bit is received, the device will acknowledge the received byte by bringing the Data line low and generating one last clock pulse.
在收到停止位之后,設(shè)備將通過拉低數(shù)據(jù)線,生成最后一個時鐘脈沖 來 應(yīng)答收到的字節(jié)
If the host does not release the Data line after the 11th clock pulse, the device will continue to generate clock pulses until the the Data line is released (the device will then generate an error.)
在第11個時鐘脈沖之后,如果主機并沒有釋放數(shù)據(jù)線,設(shè)備將繼續(xù)產(chǎn)生時鐘脈沖,直到數(shù)據(jù)線被釋放(然后 設(shè)備將產(chǎn)生一個錯誤)
The host may abort transmission at time before the 11th clock pulse (acknowledge bit) by holding Clock low for at least 100 microseconds.
在第11個脈沖之前(回應(yīng)位),主機可以隨時中止傳輸,只要拉低時鐘持續(xù)100us即可
|
T9 == Time from inactive to active CLK transition, used to time when the auxiliary device samples DATA
FreeScale(Moto)提供的時序圖
主機到鍵盤的數(shù)據(jù)傳輸
1.主機 通過拉低 時鐘線 來 啟動一個主機到鍵盤的數(shù)據(jù)傳輸。大約35us后,主機拉低數(shù)據(jù)線
。這個事件序列 就是 通知 鍵盤,主機要傳輸一個命令了。在數(shù)據(jù)信號的下降沿大約 125us 后 時鐘信號釋放,就被鍵盤內(nèi)部的上拉電阻拉為高電平 。
2. 在時鐘信號的上升沿 約 1ms ,數(shù)據(jù)傳輸開始。這個期間,數(shù)據(jù)線保持低電平。鍵盤拉低時鐘線,clocking in the low data line. 這個就做傳輸?shù)钠鹗嘉弧?br>
3. 鍵盤用時鐘驅(qū)動 8個數(shù)據(jù)位從主機傳輸?shù)阶约哼@邊。 這個時鐘有50%的占空比(duty cycle).高電平和低電平的時間都在30~50us之間。主機在每個周期的低電平的時候改變數(shù)據(jù)線上的數(shù)據(jù)。在每個時鐘的上升沿5~25us之后鍵盤 開始從數(shù)據(jù)線上取樣,取出主機發(fā)來的數(shù)據(jù)。
4.數(shù)據(jù)位之后是一個奇偶校驗位(采用奇校驗)
5.最后是停止位
6.如果鍵盤讀到一個高電平的停止位,鍵盤就在 取樣停止位的那個時鐘的下降沿 之后的低電平期間 拉低數(shù)據(jù)線。這個行為叫做 鍵盤給主機的應(yīng)答信號。
鍵盤拉高時鐘之后,也拉高數(shù)據(jù)線。
7.在收到一個字節(jié)后,鍵盤對接收的數(shù)據(jù)執(zhí)行一個奇偶校驗。如果奇偶校驗錯誤,或者接收的數(shù)據(jù)無法識別為有效的命令,那么鍵盤請求重新發(fā)送(發(fā)送0xFE給主機)
1. 鍵盤發(fā)送數(shù)據(jù)前,首先必須讓時鐘 和數(shù)據(jù)線都在鍵盤內(nèi)部的上拉電阻作用下 拉成高電平。然后鍵盤拉低數(shù)據(jù)線,5-25us之后,鍵盤拉低時鐘線。在時鐘的下降沿,開始傳輸起始位The falling edge of the clock line clocks in the transfer’s start
bit.
2. 鍵盤用時鐘驅(qū)動 8個數(shù)據(jù)位到主機。 這個時鐘有50%的占空比(duty cycle).高電平和低電平的時間都在30~50us之間。鍵盤在每個周期的高電平的時候改變數(shù)據(jù)線上的數(shù)據(jù)。這個改變出現(xiàn)在時鐘的上升沿的5us后 和 下降沿的5us前。鍵盤的數(shù)據(jù)在時鐘的下降沿被鎖存進主機。
3.數(shù)據(jù)位之后是一個奇校驗位
4.最后是停止位。在時鐘的下降沿 0~50us之間 主機拉低時鐘 來鎖存停止位。這就告訴鍵盤主機現(xiàn)在忙,不能在接收 其他的鍵盤傳輸數(shù)據(jù)。在處理完接收的數(shù)據(jù),準備好接收下一個數(shù)據(jù)之前,主機釋放時鐘。
6.在鍵盤傳輸數(shù)據(jù)到主機的過程中,主機任何時候都可以中斷這個傳輸,發(fā)送一個命令到鍵盤。主機拉低時鐘和數(shù)據(jù)線 即可中止傳輸。所以,鍵盤在時鐘為 低電平的時候必須取樣數(shù)據(jù)線。(無論什么時候輸出高數(shù)據(jù)位的時候)。在產(chǎn)生時鐘的上升沿時,必須讀取時鐘。
在任何時候發(fā)現(xiàn)這兩個條件不滿足,就拉高時鐘和數(shù)據(jù)線,放棄這次傳輸,并準備從 主機接收命令。
Moto 香港公司的 Derek Lau
當時鐘 高電平是,發(fā)送給主機的數(shù)據(jù)被主機讀取。在空閑狀態(tài),時鐘和數(shù)據(jù)線都被拉為高電平。主機 拉低 時鐘最少100ms(?還是us)開始發(fā)送數(shù)據(jù)給鍵盤:
1.主機等待,直到?jīng)]有外部設(shè)備傳輸被處理
2.主機 拉低時鐘
3.主機拉低數(shù)據(jù)作為開始位
4 .主機釋放時鐘
5.設(shè)備拉低時鐘
6.主機發(fā)送數(shù)據(jù)
7.設(shè)備釋放時鐘,讀取數(shù)據(jù)
8.設(shè)備檢查時鐘線,如果時鐘為低,中止傳輸
9.重復 5-7步,發(fā)送 數(shù)據(jù)1-到數(shù)據(jù)0,以及 奇校驗位
10. 設(shè)備拉低時鐘
11. 主機釋放數(shù)據(jù)
12.設(shè)備時鐘時鐘
13.設(shè)備讀取數(shù)據(jù)線,想得到停止位,如果數(shù)據(jù)線為低(不是停止位),產(chǎn)生錯誤
14.設(shè)備拉低 時鐘和數(shù)據(jù)線
15.設(shè)備釋放 時鐘和數(shù)據(jù)線
從設(shè)備發(fā)送到主機的數(shù)據(jù),在時鐘的下降沿被讀取。在發(fā)送數(shù)據(jù)前,設(shè)備檢查通過檢測時鐘信號為高來得知 主機是否貯備好:
1.鍵盤(設(shè)備)等待時鐘為高(約50ms?us)
2.如果數(shù)據(jù)為 低,終止
3.鍵盤 發(fā)送數(shù)據(jù)
4.鍵盤拉低時鐘為低
5.鍵盤釋放時鐘為高
6.鍵盤 讀取時鐘線,如果時鐘為低,中止傳輸
7.重復 4-6步,傳輸數(shù)據(jù)0-數(shù)據(jù)7,奇校驗位和停止位
8.鍵盤釋放時鐘為高
評論
查看更多