一種PC鍵盤的革命性設(shè)計
1 引言
當(dāng)電腦上別的配件都跟著摩爾定律越來越時髦的時候,鍵盤總是顯得比較落寞,而“掌心鍵”的問世則將傳統(tǒng)PC鍵盤的設(shè)計引領(lǐng)至一個全新的領(lǐng)域。掌心鍵,是放在單手掌中使用,對應(yīng)于五個手指各有一個多功能按鍵,并通過五指同時組合操作,從而實現(xiàn)字符的輸入;自帶有點(diǎn)陣顯示屏,通過其指示各種操作狀態(tài),考慮到用戶使用習(xí)慣和人體特征,掌心鍵的外形設(shè)計大小適中,適合大眾人群的手形,不論男女,皆可輕松的一手掌握,獨(dú)特的按鍵凹槽設(shè)計將使手指的放位倍感舒適,而且降低了對坐姿的要求,同時支持左右手互換使用,且保證長時間使用也不易感到疲勞。
2 系統(tǒng)結(jié)構(gòu)及工作原理
掌心鍵是通過五指組合方式進(jìn)行輸入,共有25=32種組合,其中包括一種無任何鍵按下的組合,實際可用組合則為31種。為了設(shè)計中描述、編程方便,將五指對應(yīng)一個5位二進(jìn)制數(shù)的5個位,D4D3D2D1D0,母指對應(yīng)D4位,食指對應(yīng)D3位,中指對應(yīng)D2位,無名指對應(yīng)D1位,小指對應(yīng)D0位,按下手指的位值為1,不按的位值為0,這樣每次組合按鍵時產(chǎn)生了一個按鍵值n,將32種組合定義為Km(m=0…31)。
為了單手能方便輸入PC鍵盤的所有按鍵,首先要將PC按鍵分集,分為數(shù)字集、小寫字母集、大寫字母集、標(biāo)點(diǎn)符集、編輯鍵集、功能鍵集等,表2-1列出了部分鍵集詳細(xì)說明;輸入時先選鍵集,再輸入字符。在任何狀態(tài)下都將K31定義為集切換,然后按Kn(n=1…30)可選30種鍵集,再按鍵集下相應(yīng)字符對應(yīng)的Kn即可完成一個字符的輸入。如果接下來的字符是同一個鍵集的,就不必再切換鍵集,直接輸入即可,這樣可提高輸入速度。輸入任一個字符最多按3次鍵,即先按集轉(zhuǎn)換,再選子集,然后輸入指定字符,大部分時間都只需一次按鍵即可。
子集中以字母集用鍵值KN最多,從K1到K26,所有子集中的K27、K28、K29、K30很少用到,當(dāng)前統(tǒng)一定義成最常用的全局通用功能鍵,就如集切換K31;分別定義為K27:空格,K28:回刪,K29:后移,K30:回車。為了方便使用,用戶可以自己配置,重新定義以上鍵值的功能。
鍵集分類 | 子集說明 |
01: | K1CapsLock K2NumLock K3ScrollLock K4KeepStart K5KeepRep K6KeepEnd K7ShiftL K8CtrlL K9GuiL K10AltL K11ShiftR K12CtrlR K13GuiR K14AltR K15Apps K16ESC K17PrScrn K18PauseBreak |
02:數(shù)字 | K1 1 K2 2 K3 3 K4 4 K5 5 K6 6 K7 7 K8 8 K9 9 K10 0 |
03:字母 | K1到K26分別對應(yīng) A 到 Z |
04:功能鍵 | K1到K12分別對應(yīng) F1 到 F12 |
05:移動 | K1ArrowU、K2ArrowD、K3ArrowL、K4ArrowR、K5Home、K6End、K7PgUp、K8PgDn、K9Tab、K10Insert |
06:運(yùn)算符 | K1 + K2 - K3 * K4 / K5 = K6 K7 | K8 ~ K9 ! K10 % K11 ^ K12 ` K13 @ K14 # K15 $ K15 |
07:標(biāo)點(diǎn)符號 | K1 , K2 . K3 ; K4 : K5 ? K6 ’ K7 ” K8( K9 ) K10 [ K11 ] K12 { K13 } K14 K15 > |
表2-1:鍵集分類表
對于PC鍵上多個鍵組合操作的情況,這里設(shè)置一個本地KeepLock狀態(tài),有三個鍵處理該狀態(tài),KeepStart是進(jìn)入KeepLock,KeepRep是保持此前按的所有鍵不松開,稱為重復(fù)鍵組KeepGroup,其后每按一次鍵與KeepGroup組合一起發(fā)給PC,直到KeepEnd結(jié)束KeepLock狀態(tài)。比如在文本編輯時,要選擇光標(biāo)后的兩個字符,在PC上應(yīng)按兩次Shift+ArrowR,操作過程是:KeepStart、ShiftL、KeepRep、ArrowR、ArrowR、KeepEnd;如果要輸入兩次Ctrl+Alt+Del,過程是:KeepStart、CtrlL、AltL、KeepRep、Del、Del、KeepEnd。
3 硬件設(shè)計
掌心鍵系統(tǒng)硬件結(jié)構(gòu)如圖3-1所示。硬件以PHILIPS公司含ARM7核的LPC2114單片機(jī)為中心,具有背光、黑白128X64點(diǎn)陣LCD屏,五個獨(dú)立式多功能按鍵,配有PS2接口。
圖3-1系統(tǒng)硬件結(jié)構(gòu)圖
電源來自PS2鍵盤接口,或電池,5V電源經(jīng)過LM1117-3.3和LM1117-1.8穩(wěn)壓后供給各部分電路。顯示部分選用COG的128X64點(diǎn)陣黑白LCD液晶,以I/O方式接入LPC2114單片機(jī),LCD用來提示各種狀態(tài),以及輸入的信息,亦用于脫機(jī)錄入的信息顯示。MAX3232構(gòu)成RS-232串行通信接口,實現(xiàn)掌心鍵與PC機(jī)之間資料相互傳送。五個獨(dú)立按鍵都以外部電平中斷方式輸入,沒有按鍵時,系統(tǒng)進(jìn)入節(jié)電狀態(tài),只有按鍵時系統(tǒng)才短時工作,在脫機(jī)狀態(tài)下工作時,電池供電的節(jié)電問題顯得非常重要。設(shè)置蜂鳴器是為了協(xié)助提示按鍵操作。而JTAG接口是保留給軟件開發(fā)和升級時使用。
正確檢測掌心鍵的按鍵操作是硬件設(shè)計的重點(diǎn)。普通按鍵檢測時,可以用軟件方法處理按鍵機(jī)械抖動問題,程序過濾按鍵前后20ms時間即可解決抖動。而掌心鍵是多個鍵組合按下實現(xiàn)單PC鍵,不但要對每個按鍵去抖動,還要解決多鍵同時按下的時間差問題。剛開始使用掌心鍵時,操作速度較慢,隨著使用時間的延長,按鍵速度越來越快,這樣就有一個熟練的過程。為此,將去抖動的時間設(shè)成可配置的,設(shè)為JitterTime,當(dāng)有操作時,保持JitterTime時間鍵Kn沒有變化,即認(rèn)為是Kn,從一個Kn變?yōu)镵m,也是用JitterTime時間去抖動,當(dāng)Km=0時就表明沒有任按鍵操作。JitterTime的范圍從20ms到2000ms。
4 軟件設(shè)計
軟件以uCos實時嵌入式操作為核心,按功能分為多個任務(wù),軟件采用C語言編寫,主要完成兩部分功能,其一是本地按鍵和顯示,其二是將按鍵變?yōu)镻C鍵掃描碼通過PS2接口送給PC機(jī)。軟件結(jié)構(gòu)如圖4-1所示。
圖4-1 系統(tǒng)軟件結(jié)構(gòu)
算法的關(guān)鍵是對按鍵值的處理。由于PC鍵盤中的每個鍵都具有通碼(接下)和斷碼(松開),產(chǎn)生的鍵盤掃描碼由多個字節(jié)組成,而掌心鍵是多次操作才能構(gòu)成PC鍵盤的單次操作,所以在算法中要設(shè)置很多狀態(tài)變量來記憶操作過程,在完成一個PC鍵操作后才通過PS2接口輸出通碼或斷碼。下面給出了詳細(xì)的原碼程序和注釋。
首先說明以下重要的全局變量:
char KeySet; //存入子鍵集號,因為不同子集的Kn值代表不同的鍵
char KeyStatus; //記憶處理狀態(tài),在不同階段Kn有不同的意義
char …….
函數(shù)KeyMessage( )將按鍵原始值分集處理,分集后的值調(diào)用函數(shù)KeySend( )保存或發(fā)送,函數(shù)KeySendOn( )發(fā)送通碼的掃描碼,而函數(shù)KeySendOff( )發(fā)送斷碼的掃描碼。
void KeySend( unsigned char OnCode ) //發(fā)送通碼
{ if( KeepLock==1){ //保存組合通碼KeepGroup
KeepGroup[KeepPtr++] = OnCode;
return; //只保存,不發(fā)送
}
If(KeepLock==2)……..
KeySendOn( OnCode ); //發(fā)送通碼的掃描碼
}
void KeySendOn( unsigned char OnCode )
{ KeyOnCodeOff = 0; //設(shè)標(biāo)志,要求發(fā)斷碼
KeyOnCode = OnCode; //記憶通碼,以便發(fā)相應(yīng)斷碼
switch( KeyOnCode ){ //根據(jù)KeyOnCode發(fā)送通碼
OnCode_A: Ps2Out(0x1C); break;
OnCode_ArrowR: Ps2Out(0xE0); Ps2Out(0x74); break;
……..}}
void KeySendOff( void ) //發(fā)送斷碼的掃描碼
{ if( KeyOnCodeOff ) return; //沒發(fā)過通碼,所有沒有斷碼
KeyOnCodeOff = 1; //防止連續(xù)發(fā)斷碼
switch( KeyOnCode){ //根據(jù)最后發(fā)送的通碼KeyOnCode補(bǔ)發(fā)斷碼
OnCode_A: Ps2Out(0xF0); Ps2Out(0x1C);
………}}
void KeyMessage( unsigned char Kn) //Kn是原始按鍵值
{ if( Kn==31){ KeyStatus=1; return; }
if( KeyStatus==1){ if(Kn != 0 ){ KeySet=Kn; KeyStatus=2; } return; }
if( KeyStatus==2){
if( Kn==0){ KeySendOff(); return; }
if( KeySet==1){
switch( Kn ){
1: CapsLock =! CapsLock; KeySend(OnCapsLock); break;
2: NumLock=! NumLock; KeySend(OnNumLock); break;
3: ScrollLock=!ScrollLock; KeySend(OnScrollLock); break;
………… //其它情況處理同上
}
return;
}
if(KeySet==2){ //處理數(shù)字 }
if(KeySet==3){ //處理字母 }
…………}}
5 結(jié)束語
以目前PC鍵盤設(shè)計中比較突出的布局設(shè)計,反手操作,坐姿,坐高等問題為中心,以模擬試驗的方法獲得掌心鍵設(shè)計的基本原則,它非常適用于現(xiàn)代的青少年人群,在部分學(xué)生用戶中實際測試,結(jié)果一周左右的時間,他們就能熟練操作掌心鍵,實現(xiàn)單手快速輸入。此外,該方案還可以用到大部分的掌上移動設(shè)備中,比如PDA和手機(jī)。掌心鍵的進(jìn)一步完善,是增加按鍵的上推下?lián)芄δ?,這樣將一個鍵變?yōu)槿齻€鍵,具有45=1024種組合值,選擇其中部分容易操作的組合,即可實現(xiàn)更快的輸入速度;配合拇指的軌跡球使用,單手即可實現(xiàn)鼠標(biāo)和鍵盤雙操作。
本文作者的創(chuàng)新點(diǎn):掌心鍵設(shè)計充分體現(xiàn)了后PC時代“功能主導(dǎo)型”這一特質(zhì),它不僅具備傳統(tǒng)鍵盤的所有功能,且可將其置于手掌中,單手五鍵組合操作,并具有脫機(jī)輸入文本文件,聯(lián)機(jī)拷貝文件的功能,該設(shè)計具有良好的市場前景和推廣應(yīng)用價值。掌心鍵不再受到傳統(tǒng)PC鍵盤置放位置的約束,而成為真正的可隨意移動的掌中鍵盤,相信在不久的將來,掌心鍵必將成為PC用戶的“掌中乾坤”。
參考文獻(xiàn)
[1] Amorim ,Vitor,andJSimoes,"ADCcircuitoptimizeskeyencoding,"EDN,Feb4,1999,pg101,www.edn.com/article/CA56657
[2] 張普,《字符編碼鍵盤輸入文集》 北京:中國標(biāo)準(zhǔn)出版社,1997
[3] 劉勇 王玉晶.一種嵌入式PC非標(biāo)準(zhǔn)鍵盤的設(shè)計.微計算機(jī)信息,2007,1-2:87-88
[4] 鄭煒,單片機(jī)系統(tǒng)中PS/2鍵盤驅(qū)動程序設(shè)計,《單片機(jī)與嵌入式系統(tǒng)應(yīng)用》,2005.04
蜂鳴器相關(guān)文章:蜂鳴器原理
評論