當前位置:編程學習大全網 - 編程語言 - 鼠標接口的電學引腳

鼠標接口的電學引腳

1: 數據

2: 空

3:地

4:+5V

5:時鐘

6: 空

PS/2接口是目前最常見的鼠標接口,最初是IBM公司的專利,俗稱“小口”。這是壹種鼠標和鍵盤的專用接口,是壹種6針的圓型接口。但鼠標只使用其中的4針傳輸數據和供電,其余2個為空腳。PS/2接口的傳輸速率比COM接口稍快壹些,而且是ATX主板的標準接口,是目前應用最為廣泛的鼠標接口之壹,但仍然不能使高檔鼠標完全發揮其性能,而且不支持熱插拔。在BTX主板規範中,這也是即將被淘汰掉的接口。

需要註意的是,在連接PS/2接口鼠標時不能錯誤地插入鍵盤PS/2接口(當然,也不能把PS/2鍵盤插入鼠標PS/2接口)。壹般情況下,符合PC99規範的主板,其鼠標的接口為綠色、鍵盤的接口為紫色,另外也可以從PS/2接口的相對位置來判斷:靠近主板PCB的是鍵盤接口,其上方的是鼠標接口

摘 要分析PS/2協議;介紹PS/2標準健盤的第二套掃描碼和命令集,並給出在單片機系統中支持PS/2健盤的硬件連接方式和利用Keil C51語言實現的驅動程序設計及部分代碼。該驅動程序可以方便地移植到其他單片機或嵌入式系統中。

關健詞 PS/2協議 PS/2健盤 單片機 驅動程序

在單片機系統中,經常使用的鍵盤都是專用鍵盤。這類鍵盤都是單獨設計制作的,成本高,連線多,且可靠性不高。這些問題在那些要求鍵盤按鍵較多的應用系統中顯得更加突出。與此相比,在 PC系統中廣泛使用的PS/2鍵盤具有價格低、通用可靠,且使用的連線少(僅使用2根信號線)的特點,並可滿足多數系統的要求。因此,在單片機系統中應用PS/2鍵盤是壹種很好的選擇。

本文在分析PS/2協議和PS/2鍵盤工作原理與特點的基礎上,給出在AT89C51單片機上實現對PS/2鍵盤支持的硬件連接方法以及驅動程序的設計實現。

1 PS/2協議

現在PC機廣泛采用的PS/2接口為mini - DIN 6引腳的連接器。其引腳如圖1所示。

740)this.width=740" border=undefined>

PS/2設備有主從之分,主設備采用female插座,從設備采用male插座。現在廣泛使用的PS/2鍵盤鼠標均工作在從設備方式下。PS/2接口的時鐘與數據線都是集電

極開路結構的,必須外接上拉電阻。壹般上拉電阻設置在主設備中。主從設備之間數據通信采用雙向同步串行方式傳輸,時鐘信號由從設備產生。

(1)從設備到主設備的通信

當從設備向主設備發送數據時,首先會檢查時鐘線,以確認時鐘線是否是高電平。如果是高電平,從設備就可以開始傳輸數據;否則,從設備要等待獲得總線的控制權,才能開始傳輸數據。傳輸的每壹幀由11位組成,發送時序及每壹位的含義如圖2所示。

740)this.width=740" border=undefined>

每壹幀數據中開始位總是為0,數據校驗采用奇校驗方式,停止位始終為1。從設備到主設備通信時,從設備總是在時鐘線為高時改變數據線狀態,主設備在時鐘下降沿讀人數據線狀態。

(2)主設備到從設備的通信

主設備與從設備進行通信時,主設備首先會把時鐘線和數據線設置為“請求發送”狀態。具體方式為:首先下拉時鐘線至少100 us來抑制通信,然後下拉數據線“請求發送”,最後釋放時鐘線。在此過程中,從設備在不超過 10us的間隔內就要檢查這個狀態。當設備檢測到這個狀態時,將開始產生時鐘信號。

此時數據傳輸的每壹幀由12位構成,其時序和每壹位含義如圖3所示。

740)this.width=740" border=undefined>

與從設備到主設備通信相比,其每幀數據多了壹個ACK位。這是從設備應答接收到的字節的應答位,由從

設備通過拉低數據線產生,應答位ACK總是為。。主設備到從設備通信過程中,主設備總是在時鐘為低電平時改變數據線的狀態,從設備在時鐘的上升沿讀入數據線狀態。

2 PS/2鍵盤的編碼與命令集

(1) PS/2扭盤的編碼

現在PC機使用的PS/2鍵盤都默認采用第二套掃描碼集。該掃描碼集可參考文獻[1]。掃描碼有兩種不同的

類型:通碼(make code)和斷碼(break code)。當壹個鍵被按下或持續按住時,鍵盤會將該鍵的通碼發送給主機;而當壹個鍵被釋放時,鍵盤會將該鍵的斷碼發送給主機。

根據鍵盤按鍵掃描碼的不同,在此可將按鍵分為如下幾類:

第壹類按鍵,通碼為1字節,斷碼為OxFO+通碼形式。如A鍵,其通碼為Ox1C,斷碼為OxFO Ox1C, 第二類按鍵,通碼為2字節0 xEO + 0 xXX形式,斷碼為OxEO+OxFO+OxXX形式。如 right ctrl鍵,其通碼為OxEO 0x14,斷碼為OxEO OxFO 0x14, 第三類特殊按鍵有兩個,print screen鍵通碼為OxEO 0x12 OxEO Ox7C,斷碼為 OxEO OxFO Ox7C OxEO OxFO 0x12; pause鍵通碼為Ox El 0x14 0x77 OxEl OxFO 0x14 OxFO 0x77,斷碼為空。

組合按鍵的掃描碼發送按照按鍵發生的次序,如以下面順序按左SHIFT+A鍵:1按下左SHIFT鍵,2按下 A

鍵,3釋放A鍵,4釋放左SHIFT鍵,那麽計算機上接收到的壹串數據為0x12 Ox1C OxFO Ox1C OxFO 0x12, 在驅動程序設計中,就是根據這樣的分類來對不同的按鍵進行不同處理的。

(2) PS/2鍵盤的命令集

主機可以通過向PS/2鍵盤發送命令來對鍵盤進行設置或者獲得鍵盤的狀態等操作。每發送壹個字節,主機都會從鍵盤獲得壹個應答0 xFA“重發resend"和“回應echo',命令例外)。下面簡要介紹驅動程序在鍵盤初始化過程中所用的指令(詳細鍵盤命令集見參考文獻[1]): OxED主機在本命令後跟隨發送壹個參數字節,用於指示鍵盤上num lock, caps lock, scroll lock led的狀態; OxF3主機在這條命令後跟隨發送壹個字節參數來定義鍵盤機打的速率和延時; OxF4用於在當主機發送OxF5禁止鍵盤後,重新使能鍵盤。

3 PS/2鍵盤與單片機的連接電路

PS/2鍵盤與AT89C51單片機的連接方式如圖4所示。Pi. 0接 PS/2數據線,P3. 2 (INTO)接 PS/2時鐘線。

因為單片機的P1,P3口內部是帶上拉電阻的,所以PS/2的時鐘線和數據線可以直接與單片機的P1,P3相連接。

740)this.width=740" border=undefined>

4 驅動程序設計

驅動程序使用Keil C51語言,Keil uVision2編程環境。PS/2 104鍵盤驅動程序的主要任務,是實現單片機與鍵盤間PS/2通信,以及將接收到的按鍵掃描碼轉換為該按鍵的鍵值KeyVal,提供給系統上層軟件使用。

(1)單片機與健盤間PS/2通信的程序設計

在PS/2通信過程中,主設備(單片機)是在時鐘信號為低時發送和接收數據信號的。因為單片機到鍵盤發送的是指令,需要鍵盤回應,所以這部分程序采用查詢方式;而單片機接收鍵盤數據時,數據線上的信號在時鐘為低時已經穩定,所以這部分程序采用中斷方式,且不需要在程序中加人延時程序。

(2)健盤掃描碼轉換程序設計

由於鍵盤掃描碼無規律可循,因此由鍵盤掃描碼獲得相應按鍵的鍵值(字符鍵為其ASCII值,控制鍵如Fl,

CTRL等為自定義值),只能通過查表的方式。由於按鍵的三種類型及部分按鍵對應著兩個鍵值(如A鍵的鍵值

根據CAPS和 SHIFT鍵狀態有 0x41 (A)和 Ox61(a)兩種),因此綜合考慮查表轉換速度和資源消耗,設計中使用4個鍵盤表:鍵盤掃描碼轉換基本集和切換集kb-plain_map[ NR_ KEYS]與kb- shift- map[ NR_ KEYS];包含EO前綴的鍵盤掃描碼轉換基本集和切換集kbe0_plain_map[N又KEYS〕與kbe0_ shift-map [ NR_ KEYS]。PS/2 104鍵盤按鍵掃描碼最大值為0x83,所以設置NR_ KEYS為132。所有四個鍵盤表的定義均為如下形式:KB_ MAP

[ MAKE CODE] = KEYVAL,如果掃描碼對應的按鍵為空,如KB_MAP[0x00],則定義相應鍵值為NULL-KEY(0x00)。以下是鍵盤掃描碼基本集的部分代碼實例:

kb_plain_map[NIZKEYS] ={……

NULL- KEY; Ox2C; Ox6B; 0x69;Ox6F;Ox3O;0x39;NULL_

KEY;//掃描碼Ox4O-Ox47

刀對應按鍵 空,逗號,K,I,0,0,9,空

//對應鍵值0x00,’,’,'k','i','o','0','9',0x00

……};

如此設計鍵盤轉換表的另壹個好處在於,以後如需擴展支持有ACPI, Windows多媒體按鍵鍵盤時,只需要將鍵表中相應處修改即可。如ACPI power按鍵通碼為OxEO 0x37,修改 kbeO _ plain- map [ 0x37 ] = KB _ACPI_PWR即可。

特殊按鍵PAUSE使用單獨程序處理,如果接收到OxEl就轉入這段程序;而print screen鍵則將其看作是兩

個通碼分別為OxEO 0x12和OxEO Ox7C的“虛鍵,,的組合鍵來處理。

在驅動程序中聲明如下全局變量:led-status其bit0壹scroll lock led關0、開 1; bitl壹num lock led關為。,開為1; bit2壹caps lock led關為0,開為1; bit3-bit?總是。;agcs_status記錄左右shift ctrl gui alt狀態,bit0壹左shift鍵,bitl壹左。trl鍵,bit2壹左gui鍵, bit3壹左alt鍵,bit4-右shift鍵,bit5壹右ctrl鍵,bit6壹右gui鍵,bit7壹右alt鍵,相應鍵按下則對應位為I,釋放為。。EO_FLAG接到

OxEO置1; El FLAG接收到OxEl置1; FO-FLAG接收到OxFO置1。按鍵鍵值通過Keyval提供給上層使用。

PS/2鍵盤掃描碼鍵值轉換程序ps2_codetrans()流程如圖5所示。

第壹類按鍵的掃描碼鍵值轉換程序代碼:

if (FO-FLAG) t//接收掃描碼為斷碼

switch (mcu_revchar){//處理控制鍵

case 0x11:agcs_status& = OxF7;break;//左alt釋放

case 0x12:agcs_status & =0xFE; break; //左shift釋放

case 0x14:agcs_status&=OxFD; break;//左ctrl釋放

case 0x58:if (1e走status&0x04)

le走status&二0x03; //caps lock鍵

else led_statusl =0x04;

ps2_ledchange();

break;

case 0x59; agcs_status&二OxEF;break;//右shift釋放

case 0x77:if (led status&0x02 )

led_status& = 0x05; //num lock鍵

else led_status{ =0x02;

ps2_ledchange();

break;

case Ox7E; if(led_status&0x01)

led_status&=0x06; //scroll lock鍵

else led_statusI =0x01;

ps2_ledchange();

break;

default; break;

}

FO-FLAG = 0;lse { //接收掃描碼為通碼

if (1e走status衣0x04) caps flag=1;else caps-flag二0;

if (led-status & 0x02) num_flag=1;else num-flag二0;

if (scga_status&0x11) shift flag=1;else shift flag=0;

刀掃描碼鍵值轉換

if ((caps flag==shift-flag)}1(!num_flag)) KeyVal=b_plain_map[mciLrevchar];

else KeyVal二 kb-shift map[mcu_revcha];

switch (mcu-revchar){ //處理控制鍵或狀態鍵

case 0x11: agcs_statusl二0x08;//左alt按下

case 0x12: ages-status}二0x01;//左shift按下

case 0x14: ages-status}二0x02;//左ctrl按下

case 0x59:agcs_status}二0x10;//右shift按下

default: break;

}

}

740)this.width=740" border=undefined>

第二類按鍵的掃描碼鍵值轉換程序與上相似。要註意的是在退出該程序段時對EO- FLAG和FO_FLAG標誌的清0。

PAUSE鍵的處理程序:如果接收到OxEl,置El-FLAG= 1,然後順次將後續接收到的7個字節數據和PAUSE的通碼後7個字節比較,壹致則返回KeyVal =KB PAUSE。在比較完所有 7個字節後清除El_ FLAG標誌。

鍵盤初始化程序kb_init()流程:

① 上電後,接收鍵盤上電自檢通過信號0 xAA,或者自檢出錯信號OxFC。單片機接收為OxAA,進人下壹步,否則,進行出錯處理。

② 關 LED指示,單片機發送 OxED,然後接收鍵盤回應0 xFA,接著發送0x00接收O xFA,

③ 設置機打延時和速率。單片機發送 0xF3,接收0 xFA,發送OxOO(250ms,2. Ocps),接收OxFA,

④ 檢查LED,發送 0 xED,接收0 xFA,發送0x07開所有 LED),接收 OxFA。發送 0 xED,接收 0 xFA,發送0x00(關 LED),接收OxFA,

⑤允許鍵盤發送OxF4,接收0 xFA,鍵盤LED改變ps2_ledchange()函數流程:發送0 xED ~接收0 xFA~發送led-status~接收。xFA.

結 語

該驅動程序經Keil uVision2編譯,在AT89C51單片機上運行通過,實現了對 PS/2 104鍵盤的支持,以及對字符按鍵大小寫切換,num lock切換,控制鍵及組合按鍵的支持。該程序對其他嵌入式或單片機系統中PS/2鍵盤的應用也有借鑒意義。

  • 上一篇:結構體數組的定義和引用(壹)
  • 下一篇:變廢為寶的手工藝歷程
  • copyright 2024編程學習大全網