Ch 29 輸出入埠 (2) 鍵盤


按鍵延遲重複時間及重複速率

使用電腦的人應該會有這樣的經驗,當按下鍵盤的按鍵不放 ( 特殊按鍵如 Ctrl、Shift、Alt 等按鍵除外 ),過一段時間,會一直重複此按鍵,這段時間稱之為『按鍵延遲重複時間』。過了這段時間後,這個按鍵的字會重複出現,直到手不再按住該按鍵為止,每秒重複次數稱為『重複速率』。這個按住鍵不放就會重複的功用很好用,尤其是在文書處理時要用游標移到某個位置。在重複時,每一台電腦每秒鐘重複的字數不盡相同,這是可以調整的。

或許有些人知道,按鍵延遲重複時間與重複速度都可以在 BIOS 堻]定。其實 DOS/Win 9x 指令,MODE.COM ( 在 Win 9x 的「C:\WINDOWS\COMMAND」子目錄),也可以設定開始按鍵延遲重複時間與重複速率。

假如您想寫個程式來調整,但是查遍了整個 DOS 中斷服務或 BIOS 中斷服務,大概都查不到,這大概是當初設計 DOS 或 BIOS 的人認為這個功能不重要,所以沒寫這段服務程式,才讓我們有機會碰觸到更底層的硬體。

在 IBM PC 的鍵盤內,有一顆名為 8042 的晶片,他是用來控制鍵盤的運作,他可以接受 CPU 來的指令來控制鍵盤的輸入,也是他把使用者所按下的鍵傳回給主機板。8042 晶片是用編號 60H 和 64H 兩個輸出入埠與電腦溝通。

埠 60H 和埠 64H 的操作方式有點複雜。一般而言,埠 60H 是負責用來把 8042 的訊息傳回電腦的,這些訊息包含按鍵碼、鬆開碼、命令回應等。埠 64H 是用來接收電腦發出的命令,而有些命令還會伴隨著一些參數,這些參數要在主命令寫入埠 64H 之後再寫入埠 60H。但是有些命令卻又是由埠 60H 寫入,您亦可把這些命令視為無主命令,例如按鍵燈號的明滅、設定按鍵延遲重複時間與重複速率。

設定按鍵延遲重複時間是要把命令 0F3H 寫入埠 60H,如果正常,鍵盤會回應一個認可訊號 ( 大部分輸出到鍵盤的命令如果正常執行,鍵盤都會回應一個認可的訊號給電腦,此訊號是一個位元組的長度,0FAH,認可碼簡寫成 ACK ),然後程式再把要設定的按鍵延遲重複時間及重複速率寫到埠 60H。

按鍵延遲重複時間及重複速率的資料長度為一個位元組,其第七位元必為零,第五、六位元表示按鍵延遲重複時間,


鍵盤上的按鍵之按下與放開

一般寫程式的人,大部分都是用 AH=1/AH=0/INT 16H 來讀取使用者按下那一個鍵,所以我們有辦法知道按鍵何時被壓下,但是按鍵何時鬆開,沒有辦法利用服務中斷副程式得知。

可是在有些情形下,按鍵何時鬆開是很重要的,例如在玩電腦遊戲時,發射子彈的動作,您總不希望您設計的程式在玩家已經鬆開發射鍵,但是因為按鍵重複功能 ( 有時電腦處理速度不夠快,因此有些重複的鍵還未處理 ) 還一直發射子彈吧?假如您玩過毀滅戰士、古墓奇兵就知道我所言不虛,這些電腦遊戲不但必須很準確的知道鍵盤被按下,同時也要知道按鍵何時鬆開。底下小木偶想寫一段程式,就是希望能很準確的知道按鍵何時按下,何時鬆開,以及知道使用者按下那一個鍵。


註一:每一台電腦進入 BIOS 設定程式的方法不盡相同,但大部分的電腦可以在剛開機後,到進入作業系統畫面前按下「F2」鍵進入 BIOS 設定畫面。進入 BIOS 設定?e面後,選擇「BIOS FEATURES SETUP」,然後會進入另一個新畫面,其中有關設定按鍵延遲時間與重複速度的相關選項有三個:「Typematic Rate Setting」、「Typematic Rate (Char/Sec)」和「Typematic Delay (mSec)」。底下是他們的說明:

假如您想用 MODE.COM 設定,可以在 Win 9x 按『開始』、『程式集』、『MS DOS 模式』,然後先改變目錄到「C:\WINDOWS\COMMAND」,然後才可以執行「MODE.COM」指令 ( 其實 Windows 9x 似乎會設定路徑,所以有些電腦可以在任何子目錄下都可以執行 MODE.COM )。在小木偶的電腦中,剛進入 MS DOS 模式畫面如下,您也可以用「/?」來查閱如何使用 MODE.COM。

Microsoft(R) Windows 98
   (C)Copyright Microsoft Corp 1981-1999. →剛進入 MS DOS 模式標題
C:\WINDOWS>cd command [Enter]

C:\WINDOWS\COMMAND>mode /? [Enter]
Configures system devices.

Printer port:      MODE LPTn[:] [COLS=c] [LINES=l] [RETRY=r]
Serial port:       MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s] [RETRY=r]
Device Status:     MODE [device] [/STATUS]
Redirect printing: MODE LPTn[:]=COMm[:]
Prepare code page: MODE device CP PREPARE=((yyy[...]) [drive:][path]filename)
Select code page:  MODE device CP SELECT=yyy
Refresh code page: MODE device CP REFRESH
Code page status:  MODE device CP [/STATUS]
Display mode:      MODE [display-adapter][,n]
                   MODE CON[:] [COLS=c] [LINES=n]
Typematic rate:    MODE CON[:] [RATE=r DELAY=d] →調整重複速度 (RATE) 及延遲時間 (DELAY)

C:\WINDOWS\COMMAND>

用 MODE.COM 來設定按鍵延遲時間與重複速度必須使用 CON[:] [RATE=r DELAY=d]這三個參數。「CON[;]」表示控制台,在文字模式就是鍵盤與螢幕的意思,冒號可有可無。RATE 表示重複速度,其後接的速度選項,r,是在 1 到 32 之間的整數,表示每秒重複的字元數是 2 到 33 次,所以 r 越大表示重複速度越快。DELAY 表示按下鍵多久後開始重複字元,其後的數字,d,可以有 1、2、3、4 四種選擇,分別表示 250、500、750、1000 毫秒,故 d 越大表示越慢開始重複。舉個例子:

C:\WINDOWS\COMMAND>mode con: rate=32 delay=1 [Enter]

表示按下鍵 0.25 秒後開始重複,重複速度是每秒 33 個字元。


回到首頁到第二十八章到第三十章