1 引言 當電腦上別的配件都跟著摩爾定律越來越時髦的時候,鍵盤總是顯得比較落寞,而“掌心鍵”的問世則將傳統PC鍵盤的設計引領至一個全新的領域。掌心鍵,是放在單手掌中使用,對應于五個手指各有一個多功能按鍵,并通過五指同時組合操作,從而實現字符的輸入;自帶有點陣顯示屏,通過其指示各種操作狀態,考慮到用戶使用習慣和人體特征,掌心鍵的外形設計大小適中,適合大眾人群的手形,不論男女,皆可輕松的一手掌握,獨特的按鍵凹槽設計將使手指的放位倍感舒適,而且降低了對坐姿的要求,同時支持左右手互換使用,且保證長時間使用也不易感到疲勞。 2 系統結構及工作原理 掌心鍵是通過五指組合方式進行輸入,共有25=32種組合,其中包括一種無任何鍵按下的組合,實際可用組合則為31種。為了設計中描述、編程方便,將五指對應一個5位二進制數的5個位,D4D3D2D1D0,母指對應D4位,食指對應D3位,中指對應D2位,無名指對應D1位,小指對應D0位,按下手指的位值為1,不按的位值為0,這樣每次組合按鍵時產生了一個按鍵值n,將32種組合定義為Km(m=0…31)。 為了單手能方便輸入PC鍵盤的所有按鍵,首先要將PC按鍵分集,分為數字集、小寫字母集、大寫字母集、標點符集、編輯鍵集、功能鍵集等,表2-1列出了部分鍵集詳細說明;輸入時先選鍵集,再輸入字符。在任何狀態下都將K31定義為集切換,然后按Kn(n=1…30)可選30種鍵集,再按鍵集下相應字符對應的Kn即可完成一個字符的輸入。如果接下來的字符是同一個鍵集的,就不必再切換鍵集,直接輸入即可,這樣可提高輸入速度。輸入任一個字符最多按3次鍵,即先按集轉換,再選子集,然后輸入指定字符,大部分時間都只需一次按鍵即可。 子集中以字母集用鍵值KN最多,從K1到K26,所有子集中的K27、K28、K29、K30很少用到,當前統一定義成最常用的全局通用功能鍵,就如集切換K31;分別定義為K27:空格,K28:回刪,K29:后移,K30:回車。為了方便使用,用戶可以自己配置,重新定義以上鍵值的功能。 對于PC鍵上多個鍵組合操作的情況,這里設置一個本地KeepLock狀態,有三個鍵處理該狀態,KeepStart是進入KeepLock,KeepRep是保持此前按的所有鍵不松開,稱為重復鍵組KeepGroup,其后每按一次鍵與KeepGroup組合一起發給PC,直到KeepEnd結束KeepLock狀態。比如在文本編輯時,要選擇光標后的兩個字符,在PC上應按兩次Shift+ArrowR,操作過程是:KeepStart、ShiftL、KeepRep、ArrowR、ArrowR、KeepEnd;如果要輸入兩次Ctrl+Alt+Del,過程是:KeepStart、CtrlL、AltL、KeepRep、Del、Del、KeepEnd。 3 硬件設計 掌心鍵系統硬件結構如圖3-1所示。硬件以PHILIPS公司含ARM7核的LPC2114單片機為中心,具有背光、黑白128X64點陣LCD屏,五個獨立式多功能按鍵,配有PS2接口。 圖3-1系統硬件結構圖 電源來自PS2鍵盤接口,或電池,5V電源經過LM1117-3.3和LM1117-1.8穩壓后供給各部分電路。顯示部分選用COG的128X64點陣黑白LCD液晶,以I/O方式接入LPC2114單片機,LCD用來提示各種狀態,以及輸入的信息,亦用于脫機錄入的信息顯示。MAX3232構成RS-232串行通信接口,實現掌心鍵與PC機之間資料相互傳送。五個獨立按鍵都以外部電平中斷方式輸入,沒有按鍵時,系統進入節電狀態,只有按鍵時系統才短時工作,在脫機狀態下工作時,電池供電的節電問題顯得非常重要。設置蜂鳴器是為了協助提示按鍵操作。而JTAG接口是保留給軟件開發和升級時使用。 正確檢測掌心鍵的按鍵操作是硬件設計的重點。普通按鍵檢測時,可以用軟件方法處理按鍵機械抖動問題,程序過濾按鍵前后20ms時間即可解決抖動。而掌心鍵是多個鍵組合按下實現單PC鍵,不但要對每個按鍵去抖動,還要解決多鍵同時按下的時間差問題。剛開始使用掌心鍵時,操作速度較慢,隨著使用時間的延長,按鍵速度越來越快,這樣就有一個熟練的過程。為此,將去抖動的時間設成可配置的,設為JitterTime,當有操作時,保持JitterTime時間鍵Kn沒有變化,即認為是Kn,從一個Kn變為Km,也是用JitterTime時間去抖動,當Km=0時就表明沒有任按鍵操作。JitterTime的范圍從20ms到2000ms。 4 軟件設計 軟件以uCos實時嵌入式操作為核心,按功能分為多個任務,軟件采用C語言編寫,主要完成兩部分功能,其一是本地按鍵和顯示,其二是將按鍵變為PC鍵掃描碼通過PS2接口送給PC機。軟件結構如圖4-1所示。 圖4-1 系統軟件結構 算法的關鍵是對按鍵值的處理。由于PC鍵盤中的每個鍵都具有通碼(接下)和斷碼(松開),產生的鍵盤掃描碼由多個字節組成,而掌心鍵是多次操作才能構成PC鍵盤的單次操作,所以在算法中要設置很多狀態變量來記憶操作過程,在完成一個PC鍵操作后才通過PS2接口輸出通碼或斷碼。下面給出了詳細的原碼程序和注釋。 首先說明以下重要的全局變量: char KeySet; //存入子鍵集號,因為不同子集的Kn值代表不同的鍵 char KeyStatus; //記憶處理狀態,在不同階段Kn有不同的意義 char ……. 函數KeyMessage( )將按鍵原始值分集處理,分集后的值調用函數KeySend( )保存或發送,函數KeySendOn( )發送通碼的掃描碼,而函數KeySendOff( )發送斷碼的掃描碼。 void KeySend( unsigned char OnCode ) //發送通碼 { if( KeepLock==1){ //保存組合通碼KeepGroup KeepGroup[KeepPtr++] = OnCode; return; //只保存,不發送 } If(KeepLock==2)…….. KeySendOn( OnCode ); //發送通碼的掃描碼 } void KeySendOn( unsigned char OnCode ) { KeyOnCodeOff = 0; //設標志,要求發斷碼 KeyOnCode = OnCode; //記憶通碼,以便發相應斷碼 switch( KeyOnCode ){ //根據KeyOnCode發送通碼 OnCode_A: Ps2Out(0x1C); break; OnCode_ArrowR: Ps2Out(0xE0); Ps2Out(0x74); break; ……..}} void KeySendOff( void ) //發送斷碼的掃描碼 { if( KeyOnCodeOff ) return; //沒發過通碼,所有沒有斷碼 KeyOnCodeOff = 1; //防止連續發斷碼 switch( KeyOnCode){ //根據最后發送的通碼KeyOnCode補發斷碼 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){ //處理數字 } if(KeySet==3){ //處理字母 } …………}} 5 結束語 以目前PC鍵盤設計中比較突出的布局設計,反手操作,坐姿,坐高等問題為中心,以模擬試驗的方法獲得掌心鍵設計的基本原則,它非常適用于現代的青少年人群,在部分學生用戶中實際測試,結果一周左右的時間,他們就能熟練操作掌心鍵,實現單手快速輸入。此外,該方案還可以用到大部分的掌上移動設備中,比如PDA和手機。掌心鍵的進一步完善,是增加按鍵的上推下撥功能,這樣將一個鍵變為三個鍵,具有45=1024種組合值,選擇其中部分容易操作的組合,即可實現更快的輸入速度;配合拇指的軌跡球使用,單手即可實現鼠標和鍵盤雙操作。 本文作者的創新點:掌心鍵設計充分體現了后PC時代“功能主導型”這一特質,它不僅具備傳統鍵盤的所有功能,且可將其置于手掌中,單手五鍵組合操作,并具有脫機輸入文本文件,聯機拷貝文件的功能,該設計具有良好的市場前景和推廣應用價值。掌心鍵不再受到傳統PC鍵盤置放位置的約束,而成為真正的可隨意移動的掌中鍵盤,相信在不久的將來,掌心鍵必將成為PC用戶的“掌中乾坤”。 |