不管是文書處理或遊戲中,我們都經常會使用到組合鍵,也就是多顆按鍵一起按下,執行某些特定的功能。有時候你可能會發現,明明只按下2顆鍵,再按下第3顆鍵時訊號卻沒有輸出。要是打報告到一半遇到這種狀況還好,如果在遊戲中遇到,那可能發生被大屠殺的慘劇。而造成這些情況產生,就是鍵盤的「鍵位衝突」(或稱「按鍵衝突」)所致。

再舉個簡單的例子,當在CS遊戲中拿著小刀要往斜後方行走時(按下S+D鍵或A+S鍵),這時看到敵人要切換武器(壓下數字鍵2或3),有些鍵盤就無法直接拿出武器,一定要放開行走的按鍵才能切換武器。這並不是遊戲的Bug,而是因為鍵盤內部先天性設計所產生的問題。

鍵位衝突不是卡鍵

鍵位衝突與卡鍵事實上是不相同的情況,許多人習慣以後者來形容鍵位衝突,而且在網路以訛傳訛的結果,就把這2種名詞變成同義了。事實上,「卡鍵」代表鍵帽壓下時陷在鍵盤內,彈不回來原有的位置,或者彈回來的時間比正常的時間還長,完全直接是照字面意思來解釋的。

結構、訊號雙管齊下

要認識什麼是鍵位衝突,就必須分2個部分來討論。第1部分得先了解鍵盤內部的構造,訊號是如何判斷與傳遞,以及遇到錯誤該如何避免;第2部分是探討如何將鍵盤訊號傳輸至電腦端,內在架構雖然不會造成鍵位衝突,但不同鍵盤的連接介面可能會造成影響,而無法順利將每個訊號送出。將2個部分整合起來,才能完全認識鍵位衝突原理。

非編碼鍵盤當道

鍵盤依轉換代碼來分類,可以分為編碼鍵盤與非編碼鍵盤2種。編碼鍵盤是指按下按鍵時,直接由數位電路上產生出ASCII碼,或者特別編碼來輸出。非編碼鍵盤則是將鍵盤按鍵排成矩陣形式(Keyboard Matrix),當按鍵觸發時,由鍵盤控制器(Keyboard Controller)依照行(Clown)與列(Row)的資訊,來查詢鍵盤碼表格,藉此找出使用者壓下的按鍵資訊並輸出。非編碼鍵盤的鍵盤碼表格較容易重新定義,結構技術不難。對於不同國家的鍵盤配置都容易進行鍵位設計,所以已經成為目前鍵盤主要的設計方式。

薄膜式鍵盤的行與列電路,會分散到鍵盤的2層薄膜電路上,而機械式則設計在PCB電路板上。這些行與列至少會由16條線路與8條線路交叉形成,組合出共有128個交叉點。目前鍵盤按鍵數大約為103鍵,就算語系不同按鍵數也不會相差太多,這128個點可以運用到目前所有的鍵盤。不過這種矩陣的設計方式代表壓下就會形成通路,如果一次壓下太多鍵,就有可能造成訊號誤判。

行與列判斷訊號

接下來,我們來看看是鍵盤訊號是如何偵測與送出。鍵盤的按鍵資訊都是設計在鍵盤矩陣中,裡面每個行與列的交錯點都代表著1顆按鍵資訊。當按鍵被觸發時,鍵盤就會進行掃描,查詢是哪顆鍵被壓下。首先會以行為單位會輪流掃描,之後再判斷是哪一列形成通路。

當單一按鍵被壓下時,鍵盤掃描行與列的原理非常簡單,很容易就會找到是哪顆鍵被壓下,立即就會將訊號送出,但如果同時觸發超過1顆按鍵時,則是另一種情況。鍵盤矩陣中最小矩形單位會是由4顆按鍵所組成,4顆鍵壓下任何1顆鍵都能順利輸出訊號。任意2顆鍵按下時,鍵盤控制器也能依行列資訊判斷是哪些鍵被觸發。當同時壓下1顆鍵與2顆鍵時,鍵盤很容易就能判斷訊號並將其送出。

產生Ghost Key

不過同時3顆鍵壓下時,就會送出2個行資訊與2個列資訊到鍵盤控制器。由於2行與2列共可形成4顆鍵,所以光靠行列資訊無法推算是4顆鍵中的哪3顆,而這時意外被導通電路的第4顆鍵,稱為Phantom Key(幽靈鍵)或Ghost Key(鬼鍵)。

Ghost Key出現時,控制器因無法判斷正確按鍵而產生錯誤的判斷資訊,為了避免錯誤訊號被送出,鍵盤控制器就會忽略第3顆壓下的訊號,只會輸出前2顆鍵一定正確的訊號。這就是目前使用者常會疑惑,明明已經壓下按鍵,為什麼電腦卻沒有送出訊號,其實就是因為產生Ghost Key發生鍵位衝突。

▲此為鍵盤矩陣簡化圖,在3行3列的電路中配有Q、W、E、A、S、D、Z、X、C鍵共9鍵。實際鍵盤矩陣不會如此簡單,會更為複雜。

▲當Q鍵壓下時:從C1開始掃描,R1有被導通電路,R2沒有,所以推論出C1R1被壓下。再從C2開始掃描,R1與R2都沒有形成通路。結論得到C1R1即Q鍵被觸發。

▲當Q、S鍵壓下時:從C1開始掃描,R1有被導通電路,R2沒有,所以推論出C1R1被壓下。再從C2開始掃描,R1沒有形成通路,R2有被導通電路,所以推論出C2R2被壓下。結論得到C1R1與C2R2即Q鍵、S鍵被觸發。

▲當Q、W、A鍵壓下時:從C1開始掃描,R1被導通電路,R2也被導通電路,所以推論出C1R1、C1R2都形成通路。再從C2開始掃描,R1被導通電路,此時R2透過C1也被導通電路,所以推論出C2R1、C2R2都形成通路。結論得到C1R1、C1R2、C2R1、C2R2即Q鍵、W鍵、A鍵、S鍵都被觸發,不過實際並不是如此。S鍵沒有按下卻意外被導通,此鍵就命名為Phantom Key,即Ghost鍵(鬼鍵)。

USB照樣能N-Key

目前鍵盤連接介面以PS/2與USB為主,而這2種介面的傳輸方式與內容都不相同。在前一單元有提到,鍵盤控制器(Keyboard Controller)由行列資訊查出是哪顆鍵被觸發後,就將按鍵資訊傳輸到電腦中。這只能算是簡略的說法,其實在這段過程中,鍵盤還做了許多事情。

隨時監控按鍵狀態

鍵盤控制器(Keyboard Controller)大部分時間都在掃描鍵盤矩陣,以及監控鍵盤是否有更動按鍵狀態。當按鍵被按下或將按鍵放開時,都會送一組掃描碼(Sacn Code)給電腦。這組掃描依不同情況分為2種:Make Code與Break Code。Make Code是在使用者按下按鍵時立即送出,Break Code是使用者放開按鍵時送出。這2種的內容都是獨一無二,方便給電腦主機能夠準確辨識之用。

先找出按鍵位置

送出Mack Code與Break Code訊號,得要先找到使用者是按下哪顆鍵才行。鍵盤無論採用何種鍵位配置,都會針對每一顆按鍵定義一個鍵盤號碼(Key Number)。當使用者壓下按鍵時,鍵盤控制器由行列資訊找出哪顆按鍵被壓下,再從鍵盤表中查出此按鍵位置所代表的是哪一個按鍵訊號。這中間過程無論是在PS/2介面或USB介面下都是相同的,但之後查表送出的訊號就有所不同了。

▲無論是101鍵與102鍵的按鍵配置,每個按鍵都會有1組按鍵號碼。

進行查表

知道按鍵位置之後,便會從Scan Codes Tables(掃描碼表格)中查詢Scan Codes(掃描碼)並送出訊號。其中Scan Codes Tables有分為Set 1、Set 2、Set 3共3組,一般系統預設是查詢Scan Codes Tables Set 2。

預設查表Set 2

在Scan Codes Tables Set 2中,鍵盤主要鍵位區Make Code每顆按鍵都是由1組8-bit位元碼(1Byte)組成,Break Code為2Bytes,其中Break Code第1個Byte皆為十六進位的F0,第2個Byte則與Mack Code相同。在主要鍵位區中,只有右側Ctrl鍵與右側Alt鍵不同,分別與左側Ctrl鍵與左側Alt鍵相比較,在Make Code部分多十六進位的E0,Break Code多十六進位的E0F0。

擴展功能鍵(Extended Keys)如鍵盤中間九宮格區(Insert、Delete等)、方向鍵區與右側數字鍵區,與Number Lock關閉時的右側數字鍵區功能重複。換句話說,因為擴展功能鍵常會隨著Shift鍵與Number Lock鍵的開啟與關閉而影響輸出結果,所以獨立定義出一組規則,不會與主要鍵位區相同。在Make Code會增加十六進位的E0,Break Code多出十六進位的E0F0。另外數字鍵區「/」、PrintScreen鍵、Pause鍵,這些也是有獨立的Make Code與Break Code表示。

電腦轉ASCII使用

當電腦接收到鍵盤所送出的掃描碼,會再轉成ASCII。最後這部分是由系統中驅動程式來完成,以便套用多國語系的設定。用PS/2介面的鍵盤運作狀況大致是如此,若用USB介面,就又是下面這種情況。

▲IBM技術參考手冊有將每一個按鍵的Make Code與Break Code一一條列出來。

USB HID限制6+2鍵

PS/2按鍵壓下與放開,是分Make Code與Break Code送出,而USB介面下則完全不同。依據USB HID(Human Interface Devices)規範,它是將正在壓下的按鍵訊號送出,沒有壓下按鍵的訊號就不送出。壓下的訊號按鍵每一次的封包為8 Bytes,其中2 Bytes 為Modifier Keys與Reserved保留鍵。

Modifier Keys為1Byte即8 bit,每一個bit可以記錄Shift、Ctrl、Alt、Windows鍵,左右側各有1顆鍵共8鍵。Reserved保留鍵可以做為Caps Lock、Number Lock、Scroll Lock等等鍵使用。扣除Modifier Keys與Reserved Keys之後,其他按鍵最多只有6鍵可以輸出。

USB鍵盤按鍵定義

▲由USB HID 1.11中可以明確看到USB鍵盤使用8 Bytes。

▲Reserved Keys保留鍵可以讓廠商做為多種用途。

▲Modifier Keys每1個bit各代表著不同按鍵訊號。

▲其他按鍵的訊號送出的定義也與Scan Codes Tables Set 2不同,USB有自己的一套查表,詳細可以查詢USB HID Uasage Tables。

訊號先進先出不打結

在USB HID中,我們真正可以使用的按鍵只有6鍵。如果按下超過6鍵,或者送出Ghost Key時,鍵盤便會送出錯誤訊息而停止。有些廠商在這裡的處理方式為採用FIFO(First In First Out,先進先出),當已經滿6顆訊號時,再讀取使用者新輸入的第7鍵訊號,就捨棄原本的第1鍵訊號,持續保持同時6鍵輸出。

▲USB按鍵送出範例:此範例以4 Bytes封包送出鍵盤訊號,其中1 Byte保留給Modifier Keys使用。如果鍵盤沒有動作時(None),送出的封包訊號與前一次相同。

解開HID封印可行

USB HID只是對USB設備設立的規範,USB裝置也能照著自己的規則走,所以USB鍵盤同時輸出6鍵還是可行,在這分享幾種USB鍵盤突破限制的方法。只是這些方法都需要付出額外的成本,早期鍵盤幾乎都是遵守USB HID規範,所以才會有許多人認為多鍵輸出在USB介面下是不可能的任務。

模擬多把鍵盤

但其實仍有辦法遵守USB HID規範,又能突破限制。最簡單的方法,就是利用鍵盤晶片,讓電腦在使用1把鍵盤情形下,誤認為同時連接多把鍵盤。就能將鍵盤按鍵,透過模擬的鍵盤分送訊號。原本限制的6顆鍵就能串聯起來,而重複的Modifier Keys與Reserved Keys位置,也能重新定義新按鍵送出,達成多顆鍵同時輸出。

此種方法穩定性較高,造成系統誤判的機率較低,許多鍵盤都採用這種方式。不過每多模擬1把鍵盤,至少就需要多1顆晶片,還要將晶片互接連接並將訊號分配控制,成本也隨之增加。通常採用此方法時會猜測玩家的按鍵需求,而非無上限地模擬鍵盤。

▲由作業系統的裝置管理員中,可以觀察到微軟SideWinder X4鍵盤模擬出2把鍵盤。

更改按鍵定義宣告

USB鍵盤變數宣告中,原本每Byte是代表著不同按鍵,但是可依需要重新宣告變數。每一個Byte分開成8 bits來計算,每1個bit各代表著1個按鍵,所以總共可以代表8個按鍵訊號。延伸至USB鍵盤原本8 Byte的訊號資料中,就可以代表著64顆鍵。搭配模擬多把鍵盤方式,只要模擬出第2把鍵盤就能有128個訊號,可滿足鍵盤全鍵輸出的需求。此種方法可以很容易在USB介面下達到全鍵輸出,打破介面的限制。

穩定性最重要

鍵盤相關的技術每年都會進步,要達到一樣的目標會有許多種技術,使用時通常也不會採用單一種方法,而是混合搭配。筆者無法針對每一種方法都加以詳細介紹,只能將比較常見的方法提出來討論研究。

雖然有些方法可以達到超過6鍵以上輸出,但是無法保證在每台電腦都能正常輸出。透過USB HUB等連接器時,鍵盤通常發生問題的機會較高。最後在市場鋪貨的鍵盤,多數都是將問題發生率降到最低,或者已有其他的配套方式可使用。無論如何,能夠讓玩家順利輸出鍵盤訊號才會是最重要的。

土砲自己的NKRO鍵盤

當然如果要靠自己力量,土砲出一把N-Key Rollover鍵盤不是難事。內部電路比較好去掌握,介面部分則較為複雜不易更動。國外有玩家自行購買二極體,然後再焊接於PCB電路板上,將鍵盤矩陣的電路加上跳線再加以改造,使得每個按鍵都能獨立送出訊號。這位玩家使用型號為1N4148的二極體,有興趣你也可以試試。

國外玩家做法

圖片來源網頁:http://geekhack.org/

▲圓圈代表按鍵,此圖為製作的重點。將按鍵獨立出來,並且焊上二極體。部分按鍵電路可依需要另外連接線路。

▲真正電路板上的按鍵訊號很複雜,判斷上不容易。首先要將按鍵獨立出來,所以部分電路板上需要先截斷電路。

▲然後再焊上二極體,與連接跳線。

▲全部完成後就製作出一把N-Key Rollover鍵盤。

看清產品真相

從市面上的產品規格不難觀察到,部分電競廠商會加入Anti-Ghosting標示,表示鍵盤能夠避免Ghost Key產生。但了解原理後,就能知道不是N-Key Rollover結構鍵盤,就會產生Ghost Key。

避免Ghost Key的方式都是將鍵盤矩陣進行最佳化處理,將常使用的遊戲按鍵畫出區隔,避免出現在同一個矩型內,減少鍵位衝突的機率。不過並非每家廠商都會註明鍵盤針對哪些按鍵有最佳化處理,加上每種遊戲會使用到的組合按鍵都不同,所以玩家可能還是會遇到鍵位衝突。

詳列按鍵最負責

認為光是註明Anti-Ghosting是不夠,應該將不會造成鍵位衝突的所有按鍵列出才是最負責的做法,也能讓玩家能清楚了解廠商所謂「最佳化鍵盤矩陣」的成果。目前有提出按鍵列表的是i-rocks的KR-6220G,這把薄膜式鍵盤針對Q、W、E、A、S、D、空白鍵與方向鍵共11顆鍵特別進行鍵位處理,將這些鍵避免設計在同一個鍵盤矩形中,能同時輸出11顆按鍵訊號並不衝突。因為是最多11顆鍵不衝突,所以i-rocks行銷宣傳時就是強調最多11顆鍵不衝突,而不是11-Key Rollover。

1種N-Key各自解讀

並不是每家廠商或店家都了解鍵位衝突的定義,除了常會解釋錯誤外,更有可能看到2-Key Rollover與N-Key Rollover表達以外的規格出現。如常見的會是6鍵、8鍵或10鍵,許多廠商對於這些鍵數定義都是以「最多」而不是「任意」,這應該直接以敘述方式表示而不是使用Rollover用詞。筆者更有遇過標示6 N-Key Rollover、Full N-Key Rollover,這種使用法錯得更是明顯。

注意鍵盤使用介面

由N-Key Rollover的定義可以知道,N代表著「任意同時可以處理的鍵數」,這句話與「同時可以處理最多的鍵數」是完全不一樣的。在早期PS/2時代時,稱為N-Key Rollover的鍵盤代表能全鍵輸出。而使用USB介面,就算內在使用N-Key Rollover架構設計,廠商如果沒有特別處理,便會受到USB HID規範影響而無法全鍵輸出。這時筆者認為能以6-Key Rollover來表示,事實上鍵盤的任意6鍵確實不會衝突,通常鍵盤在標示擁有N-Key Rollover功能時,都會標示使用介面以減少誤會。

各家計算按鍵數定義不同

廠商計算最多幾個按鍵送出,可能與我們的認知會有差距。如Modifier Keys保留雖然為1 Byte,不過可以送出8個按鍵訊號,所以要計算最大值是可以考慮進來。USB鍵盤的按鍵最多鍵輸出數量,會依廠商對於Modifier Keys採計數量標準不同,造成最後數據有所差異。例如微軟SideWinder X4可以同時最多輸出26鍵,分別為17個主要鍵位、7個Modifier Keys、1個多媒體鍵、1個巨集鍵。

測試按鍵衝突方法很多

目前有許多方法可以測試鍵盤是否有鍵位衝突問題,國外有付費軟體KeyboardTest,提供30天免費試用,之後如要再使用則要付24美元(約新台幣768元);國內則有玩家Ivan Lin開發出的hKBTEST免費軟體可供測試。

除了軟體測試外,最簡單的方法是開網頁就能測試。微軟在開發SideWinder X4時,提供了網頁平台,可以讓玩家利用網頁測試按鍵訊號。測試鍵位衝突時,建議針對遊戲常用的鍵先測試,如QWEASD或加入方向鍵等,小範圍比較容易注意到每個按鍵是否有順利送出,也可以注意是否送出玩家沒有壓下的按鍵。最後才是大範圍測試,計算鍵盤最多可以輸出幾個鍵。

▲微軟提供線上測試鍵位衝突問題,直接在網頁上就能即時測試出來。(測試網頁:http://www.microsoft.com/appliedsciences/KeyboardGhostingDemo.mspx

N-Key Rollover功能運用

這是許多玩家心中的疑問:「1個人只有10隻手指頭,怎麼可能需要鍵盤訊號全部輸出呢?」把N-Key Rollover分成2種需求走向來討論。以「按鍵數量」來看,確實1個人使用時不大可能同時超過10鍵;但如果是2個人使用同一把鍵盤玩遊戲,全部訊號輸出就有可能派上用場。

近年來遊戲人口逐漸增加,漸漸會注意到鍵位衝突。即使最佳化處理過的鍵盤矩陣,還是有可能會有特定的按鍵會出問題。N-Key Rollover的鍵盤,代表著無論玩家按下任何組合鍵都不會造成鍵位衝突,可以適用在任何遊戲上,不需要擔心鍵盤是否會造成遊戲特定鍵無法發揮功能。筆者認為使用支援N-Key Rollover的鍵盤,就可以不用擔心會產生鍵位衝突問題。

▲i-rocks 6820E由於有註明特別優化的鍵位圖,在國外頗受好評。

什麼是 N-key 與按鍵衝突?原理說明、改善技術、選購注意完全解析的更多相关文章

  1. man page分類與說明

    轉載自http://itzone.hk/article/article.php?aid=200407152225014657 (如有侵權,請留言或來信告知) 前言 Man page是每位程式設計員及U ...

  2. INSERT ... ON DUPLICATE KEY UPDATE产生death lock死锁原理

    前言 编辑 我们在实际业务场景中,经常会有一个这样的需求,插入某条记录,如果已经存在了则更新它如果更新日期或者某些列上的累加操作等,我们肯定会想到使用INSERT ... ON DUPLICATE K ...

  3. 淺析LED、LED背光、OLED的技術原理與區別

    眼下很多廠商在推廣自己產品的時候都偷換了概念.明明是LED背光顯示器卻要簡稱為LED顯示器.事實上LED顯示器和目前的LED背光顯示器有著本質的區別.當然容易讓大家混淆的還有個技術非常先進的OLED. ...

  4. Gazebo與ROS版本說明

    使用哪种ROS / Gazebo版本的组合 介绍 本文档提供了有关将不同版本的ROS与不同版本的Gazebo结合使用的选项的概述.建议在安装Gazebo ROS包装之前阅读它.重要!简单的分析,快速和 ...

  5. 為什麼gnome-terminal中不能使用ctrl_shift_f來進行查找? 是因為 跟输入法的全局设置衝突了!

    但是,也要注意, 为什么ctrl+shift_f有时候可以使用, 有时候又不可以使用? 是因为, 这个跟输入法的状态有关, 如果输入法是英文, 那么中文的 "简体/繁体切换快捷键ctrl+s ...

  6. X86 Booting Sequence

    1.BIOS 0xFFFF0 電源正常啟動後,x86 CPU 會先執行 0xFFFF0,也就是 BIOS ROM 的進入點.由於 0xFFFF0 ~ 0xFFFFF 只有少的很可憐的 16 bytes ...

  7. JavaScript基礎知識

    JavaScript基礎知識 1.標籤組使用 <script charset='utf-8' //設置字元集 defet //使腳本延遲到文檔解析完成,Browser已忽略 language=' ...

  8. VMware虛擬化技術實作問答

    http://www.netadmin.com.tw/article_content.aspx?sn=1202130002&ns=1203280001&jump=3 Q4:啟用VMwa ...

  9. FCS校验 C语言简单实现

    static uint8 calcFCS(uint8 *pBuf, uint8 len){  uint8 rtrn = 0;  while (len--)  {    rtrn ^= *pBuf++; ...

随机推荐

  1. Oracle select 中case 的使用以及使用decode替换case

    表结构如下: 将money<50的显示为贫农,money<80的显示为中农,其他的显示为富农,sql 语句如下 select name, case then '贫农' then '中农' ...

  2. 创业不要在IT业内创(市场太小,而且都喜欢自己折腾、没有花钱的习惯)

    精神是好的.但是,我看了你的产品和网站:你选的创业方向基本是死路一条,我劝你该放弃就放弃.我判断你的思路还局限在IT行业内,创业不要在IT业内创,要走出去,睁开眼看看别人的世界,自己体会.我不是打击你 ...

  3. 【转】GCC警告选项例解 -- 不错

    原文网址:http://blog.csdn.net/hcx25909/article/details/7383716 程序员是追求完美的一族,即使是一般的程序员大多也都不想看到自己的程序中有甚至那么一 ...

  4. Kth Largest Element in an Array 解答

    Question Find the kth largest element in an unsorted array. Note that it is the kth largest element ...

  5. hdu 2896 病毒侵袭_ac自动机

    题意:略 思路:套用ac自动机模板 #include <iostream> #include<cstdio> #include<cstring> using nam ...

  6. tr转换或删除字符

    字符处理命令:tr —— 转换或删除字符 逐个字符处理而不是处理单词的tr [OPTION]... SET1 [SET2]    -d: 删除出现在字符集中的所有字符 tr ab AB

  7. 网站服务器、VPS和虚拟主机的联系与区别

     网站服务器是指在互联网数据中心中存放网站的服务器.主要用于网站的互联网中的发布.应用,是网络应用的基础硬件设施.简单的说服务器就是一台电脑,只是这台电脑因为要24 小时高速运行,所以配置要比一般的家 ...

  8. 认识xml

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...

  9. Primes on Interval(二分 + 素数打表)

    Primes on Interval Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u ...

  10. 九度OnlineJudge之1032:ZOJ

    题目描述: 读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当某个字符用完时,剩下的仍然按照ZOJ的顺序输出. 输入: 题目包含多组用例,每组用例占一行,包含ZOJ三个 ...