什么是鍵盤的鍵位沖突?
簡單的說,也就是當(dāng)你同時按下鍵盤上的幾個鍵的時候,這幾個鍵不能同時反映出來,這就叫做鍵盤的鍵位沖突。例如說,你能想象當(dāng)你按下Ctrl-Alt-Del時,系統(tǒng)只能接收到前兩個鍵,而死活不承認(rèn)你按了Del鍵嗎?
?????? 當(dāng)然,現(xiàn)實中是不會有這樣的鍵盤的,按不下Ctrl-Alt-Del的鍵盤根本就沒法出廠,但其他一些常見的鍵位沖突就不稀奇了。例如,經(jīng)常有一些鍵盤不能同時對例如A-S-空格這樣的按鍵組合作出反應(yīng),這樣在FPS游戲中,使用者就會大為吃虧。
?????? 對于鍵位沖突問題,電腦用戶中有兩種完全不同的態(tài)度,絕大多數(shù)人根本意識不到鍵位沖突問題的存在,直到遇到?jīng)_突的時候才叫苦不迭,并且大呼“為什么他就能 做這個動作?”;而另一部分人,特別是一些游戲高手,又在孜孜不倦的尋找“沒有鍵位沖突的鍵盤”。這兩種人都是對鍵位沖突的原因認(rèn)識不清楚的。
?????? 鍵位沖突的直接起因,是鍵盤的非編碼結(jié)構(gòu)。在2月號的專題中,我們提到過現(xiàn)在的鍵盤幾乎都是非編碼的薄膜接觸式鍵盤,那么什么是非編碼鍵盤呢?在專題里我們沒有詳細(xì)的解釋,下面我們就來詳細(xì)說明一下非編碼鍵盤的原理與結(jié)構(gòu)。
?????? 傳統(tǒng)的鍵盤,是編碼式鍵盤,它的每個鍵按下時都會產(chǎn)生唯一的按鍵編碼,并且通過專有的一組導(dǎo)線傳輸?shù)芥I盤接口電路,由于其線路和編碼的唯一性,這種鍵盤是不存在鍵位沖突的問題的,但是編碼鍵盤結(jié)構(gòu)復(fù)雜,現(xiàn)在已經(jīng)很少使用了。
?????? 而現(xiàn)代的薄膜接觸式鍵盤,任何一個按鍵都有上下兩層薄膜的觸點,我們將它拆開來仔細(xì)看一看(如圖),就會發(fā)現(xiàn)在任何一層薄膜上,導(dǎo)線數(shù)都遠(yuǎn)少于按鍵數(shù),而 且每一條導(dǎo)線都同時連通多個按鍵的觸點,而且,上層和下層的任何兩條導(dǎo)線都最多只在一個按鍵上重合。也就是說,上層的1號導(dǎo)線可能會同時經(jīng)過1、2、3、 4、5……等按鍵,而下層的1號導(dǎo)線可能同時經(jīng)過1、Q、A、Z……等按鍵,且兩條導(dǎo)線只在1鍵上重合。
?????? 什么是鍵盤的鍵位沖突?簡單的說,也就是當(dāng)你同時按下鍵盤上的幾個鍵的時候,這幾個鍵不能同時反映出來,這就叫做鍵盤的鍵位沖突。例如說,你能想象當(dāng)你按下Ctrl-Alt-Del時,系統(tǒng)只能接收到前兩個鍵,而死活不承認(rèn)你按了Del鍵嗎?
?????? 當(dāng)然,現(xiàn)實中是不會有這樣的鍵盤的,按不下Ctrl-Alt-Del的鍵盤根本就沒法出廠,但其他一些常見的鍵位沖突就不稀奇了。例如,經(jīng)常有一些鍵盤不能同時對例如A-S-空格這樣的按鍵組合作出反應(yīng),這樣在FPS游戲中,使用者就會大為吃虧。
?????? 對于鍵位沖突問題,電腦用戶中有兩種完全不同的態(tài)度,絕大多數(shù)人根本意識不到鍵位沖突問題的存在,直到遇到?jīng)_突的時候才叫苦不迭,并且大呼“為什么他就能 做這個動作?”;而另一部分人,特別是一些游戲高手,又在孜孜不倦的尋找“沒有鍵位沖突的鍵盤”。這兩種人都是對鍵位沖突的原因認(rèn)識不清楚的。
?????? 鍵位沖突的直接起因,是鍵盤的非編碼結(jié)構(gòu)。在2月號的專題中,我們提到過現(xiàn)在的鍵盤幾乎都是非編碼的薄膜接觸式鍵盤,那么什么是非編碼鍵盤呢?在專題里我們沒有詳細(xì)的解釋,下面我們就來詳細(xì)說明一下非編碼鍵盤的原理與結(jié)構(gòu)。
?????? 傳統(tǒng)的鍵盤,是編碼式鍵盤,它的每個鍵按下時都會產(chǎn)生唯一的按鍵編碼,并且通過專有的一組導(dǎo)線傳輸?shù)芥I盤接口電路,由于其線路和編碼的唯一性,這種鍵盤是不存在鍵位沖突的問題的,但是編碼鍵盤結(jié)構(gòu)復(fù)雜,現(xiàn)在已經(jīng)很少使用了。
?????? 而現(xiàn)代的薄膜接觸式鍵盤,任何一個按鍵都有上下兩層薄膜的觸點,我們將它拆開來仔細(xì)看一看(如圖),就會發(fā)現(xiàn)在任何一層薄膜上,導(dǎo)線數(shù)都遠(yuǎn)少于按鍵數(shù),而 且每一條導(dǎo)線都同時連通多個按鍵的觸點,而且,上層和下層的任何兩條導(dǎo)線都最多只在一個按鍵上重合。也就是說,上層的1號導(dǎo)線可能會同時經(jīng)過1、2、3、 4、5……等按鍵,而下層的1號導(dǎo)線可能同時經(jīng)過1、Q、A、Z……等按鍵,且兩條導(dǎo)線只在1鍵上重合。
?????? 這樣,根據(jù)上層薄膜和下層薄膜所經(jīng)過的按鍵,就可以排出一個類似下面的表格:
?
? ? |
? 上層導(dǎo)線1 |
? 上層導(dǎo)線2 |
? 上層導(dǎo)線3 |
? 上層導(dǎo)線4 |
? 上層導(dǎo)線5 |
? …… |
? 下層導(dǎo)線1 |
? 1 |
? 2 |
? 3 |
? 4 |
? 5 |
? …… |
? 下層導(dǎo)線2 |
? Q |
? W |
? E |
? R |
? T |
? …… |
? 下層導(dǎo)線3 |
? A |
? S |
? D |
? F |
? G |
? …… |
? 下層導(dǎo)線4 |
? Z |
? X |
? C |
? V |
? B |
? …… |
? …… |
? …… |
? …… |
? …… |
? …… |
? …… |
? …… |
在非編碼鍵盤的接口控制電路中,就存儲著這樣一張表格,當(dāng)按下某個按鍵,例如“Q”時,那么在這一點上,上下兩個觸點就會連通,反映到接口電路中,就會檢 測到上層導(dǎo)線1與下層導(dǎo)線2被連通了。相對應(yīng)在表中一查,就會知道,被按下的是字母“Q”,然后通過接口輸出其ASCII碼。
?????? 與老式的編碼式鍵盤相比,非編碼鍵盤的結(jié)構(gòu)要簡單許多,省略了復(fù)雜的編碼電路和蜘蛛網(wǎng)似的走線,而且更重要的是,由于非編碼式鍵盤將按鍵結(jié)構(gòu)和輸出鍵碼分 離,所以當(dāng)需要制造不同鍵位排列的鍵盤時,不需要重新設(shè)計鍵盤線路,而只要將控制電路中的鍵位排列表格重新刷新就可以了。例如在德文鍵盤上,子母“Y”和 “Z”的位置是互調(diào)的,那么如果要把一條英文鍵盤生產(chǎn)線改造成德文鍵盤生產(chǎn)線,什么都不用改變,只須在控制芯片中刷進(jìn)一個新的排列表,將“上層導(dǎo)線1-下 層導(dǎo)線4”的位置寫作“Y”,“Z”字也作同樣處理就行了,顯然比重新布線要簡單了很多。這也就是為什么非編碼式鍵盤大行其道的原因。
?????? 但是非編碼式鍵盤帶來的就是“鍵位沖突”的問題。以上面的按鍵排列表為例,當(dāng)按下一個按鍵時,鍵盤肯定會正常識別的;當(dāng)按下兩個按鍵時,例如同時按下 “Q”與“D”,此時上層導(dǎo)線1與下層導(dǎo)線2連通,而上層導(dǎo)線3與下層導(dǎo)線3連通,系統(tǒng)完全可以正常識別;或者同時按下“Q”與“E”,此時,上層導(dǎo)線 1、下層導(dǎo)線2、上層導(dǎo)線3同時連通,系統(tǒng)同樣可以正常識別出是按下了這三個按鍵。
?????? 但在同時按下3個或3個以上按鍵時,情況就復(fù)雜了。
?????? 在一種情況下,例如同時按下“Q”、“D”、“B”時,此時,從表中我們可以看出,上層導(dǎo)線1-下層導(dǎo)線2、上層導(dǎo)線3-下層導(dǎo)線3、上層導(dǎo)線5-下層導(dǎo)線4都分別連通,此時系統(tǒng)完全可以正常識別出按下了這三個按鍵。
?????? 但當(dāng)按下的第三個按鍵不是“B”,而是“E”呢?
?????? 此時,我們可以發(fā)現(xiàn),由于第三組連通的導(dǎo)線變成了上層導(dǎo)線3-下層導(dǎo)線2,所以,此時反映到接口控制芯片的信號是:上層導(dǎo)線1-下層導(dǎo)線2-上層導(dǎo)線3-下層導(dǎo)線3統(tǒng)統(tǒng)被連通到了一起。
?????? 但是,問題就在于,除了按下的第三個按鍵是“E”以外,如果按下的第三個鍵是用來連通上層導(dǎo)線1和下層導(dǎo)線3的“A”,也會有同樣的信號組合?事實上, “Q”、“E”、“A”、“B”四個按鍵中按下任何三個都會有同樣的信號組合,那么此時接口電路怎么判斷呢?究竟是按下了哪三個按鍵或者是同時把四個按鍵 都按下了呢?
?????? 這個時候,大多數(shù)鍵盤選擇的方式,就是按照一個固定的規(guī)則輸出固定的按鍵組合代碼,對于其他可能的組合方式統(tǒng)統(tǒng)予以忽略,換句話說,在上面的鍵盤中,可能 無論你怎么按這四個按鍵,它可能永遠(yuǎn)只會輸出“Q”-“E”-“D”的組合,盡管可能你按下的實際是“Q”-“A”-“D”(這里只是一個假設(shè),實際上為 了避免誤碼,大多數(shù)鍵盤根本只輸出兩個按鍵而已)。于是,“鍵位沖突”就出現(xiàn)了。
?????? 由于非編碼鍵盤的固有結(jié)構(gòu),“鍵位沖突”是不可避免的。于是就需要鍵盤的設(shè)計者絞盡腦汁修改鍵盤的線路排列和待查表格,盡量使可能會有的常用組合按鍵避開 沖突鍵位——盡管要做到所有的按鍵都不發(fā)生沖突是不可能的,但你總不能讓Ctrl-Alt-Del相互沖突吧?那這樣的鍵盤還怎么用?還有如果四個方向鍵 相互沖突,那賽車類的游戲還怎么玩?
?????? 不過,由于市場上的游戲?qū)嵲谔?,每個游戲都可能會有自己常用的按鍵組合,甚至每個人都有自己的習(xí)慣按鍵,鍵盤的設(shè)計者當(dāng)然不可能面面俱到,有經(jīng)驗的設(shè)計 師可能會考慮得多一些,至少對最常見的游戲和最常見的按鍵設(shè)置能夠保證不出現(xiàn)問題,但要考慮到所有情況當(dāng)然是不可能的。
?????? 所以,當(dāng)你購買鍵盤的時候,絕對不要忽略“鍵位沖突”的問題,一定要把鍵盤裝到電腦上,試一試自己常玩的游戲是否能夠正常使用(只有實際試用才能試出鍵位 沖突問題,由于它與鍵位表相關(guān),所以看外表是看不出來的)。同時,一些游戲高手朋友也不要白費心機(jī)去尋找什么“沒有鍵位沖突的鍵盤”了,只要它依然是非編 碼鍵盤,那么鍵位沖突就是不可避免的,只要它的鍵位沖突不對你所玩的游戲構(gòu)成影響,這就足夠了。
PS/2協(xié)議分析
The PS/2 mouse and keyboard implement a bidirectional synchronous serial protocol.
PS/2鼠標(biāo)和鍵盤執(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)下,鍵盤/鼠標(biāo)才允許開始傳輸數(shù)據(jù)。
The host has ultimate control over the bus and may inhibit communication at any time by pulling the Clock line low.
主機(jī)對總線有最高的控制權(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.
如果主機(jī)想發(fā)送數(shù)據(jù),它必須先將時鐘拉低來禁止來自設(shè)備端的通信。
The host then pulls Data low and releases Clock.
然后主機(jī)再拉低數(shù)據(jù)線,釋放時鐘。 注釋:釋放時鐘,就是再恢復(fù)時鐘為高
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????????? 主機(jī)要求發(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ā)送給主機(jī)的數(shù)據(jù)時在時鐘信號的下降沿讀取的;從主機(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è)計一個鍵盤 鼠標(biāo) 或者 主機(jī)模擬器,你必須 在每個單元的中間時刻 (也就是,在時鐘跳變之后的15~25毫秒后) 修改/取樣數(shù)據(jù)線.
Again, the keyboard/mouse always generates the clock signal, but the host always has ultimate control over communication.
重復(fù)一遍,鍵盤/鼠標(biāo) 總是 生成時鐘信號, 而 主機(jī) 控制著整個通信過程。
Timing is absolutely crucial. Every time quantity I give in this article must be followed exactly.
時序是非常重要的。在本文中給出的時間數(shù)必須嚴(yán)格遵循。
評論
查看更多