鄔法磊,李曉陽,塵 源
(青島理工大學(xué),山東 青島266033)
專用鍵盤常用作單片機(jī)系統(tǒng)中的輸入設(shè)備,因?yàn)橐獑为?dú)設(shè)計(jì),不免存在設(shè)計(jì)制作成本高,通用性差,可靠性不高等諸多不足。在一些按鍵要求較多的應(yīng)用系統(tǒng)中使用專用鍵盤顯得更不合時(shí)宜。由于PS/2鍵盤應(yīng)用較為廣泛,且滿足多系統(tǒng)要求,所以本文考慮將PS/2標(biāo)準(zhǔn)鍵盤應(yīng)用到單片機(jī)系統(tǒng)中,既節(jié)約了制造成本,又可以滿足按鍵要求多的諸多場合,具有一定的實(shí)際意義。
與單片機(jī)相連的是CLOCK和DATA引腳,單片機(jī)通過這兩個(gè)引腳實(shí)現(xiàn)了與PS/2鍵盤的通信,接口物理特性見圖1。
圖1 接口物理特性
ps/2通訊協(xié)議是一種雙向同步串行通訊協(xié)議。通訊的兩端通過CLOCK同步,時(shí)鐘信號總是由鍵盤發(fā)出,并通過DATA交換數(shù)據(jù)。鍵盤向主機(jī)發(fā)送數(shù)據(jù)時(shí),首先檢查CLOCK是否為高電平。如果不是,那么主機(jī)抑制了通訊。具體時(shí)序如圖2所示,其中主機(jī)一直為高電平。
每一幀數(shù)據(jù)中開始位總是為0,數(shù)據(jù)校驗(yàn)采用奇校驗(yàn)方式,停止位始終為1。從設(shè)備到主設(shè)備通信時(shí),從設(shè)備總是在時(shí)鐘線為高時(shí)改變數(shù)據(jù)線狀態(tài),主設(shè)備在時(shí)鐘下降沿讀入數(shù)據(jù)線狀態(tài)。
圖2 單片機(jī)接收時(shí)序
目前,PC機(jī)使用的PS/2鍵盤都默認(rèn)采用第二套掃描碼。掃描碼有兩種不同的類型:“通碼(make code)”和“斷碼(break code)”。當(dāng)一個(gè)鍵被按下或持續(xù)按住時(shí),鍵盤會將該鍵的通碼發(fā)送給主機(jī)。而當(dāng)一個(gè)鍵被釋放時(shí),鍵盤會將該鍵的斷碼發(fā)送給主機(jī)。例如,按下A鍵,通碼為0x1c,松開按鍵時(shí),斷碼為0xF0 0x1c.
根據(jù)鍵盤按鍵掃描碼的不同,可將按鍵分為3類:
第1類按鍵通碼為一個(gè)字節(jié),斷碼為0xF0+通碼形式。如A鍵,其通碼為0x1C;斷碼為0xF0 0x1C。
第2類按鍵通碼為兩字節(jié)0xE0+0xXX形式,斷碼為0xE0+0xF0+0xXX形式。如Right Ctrl鍵,其通碼為0xE0 0x14;斷碼為0xE0 0xF0 0x14。
第3類特殊按鍵有兩個(gè),Print Screen鍵,其通碼為0xE0 0x12 0xE0 0x7C;斷碼為0xE0 0xF0 0x7C0xE0 0xF0 0x12.Pause鍵,其通碼為0xE1 0x14 0x77 0xE1 0xF0 0xl4 0xF0 0x77;斷碼為空。
組合按鍵掃描碼的發(fā)送是按照按鍵發(fā)生的次序,如按下面順序按左Shift+A鍵:按下左Shift鍵;按下A鍵;釋放A鍵;釋放左Shift鍵,那么計(jì)算機(jī)上接收到的一串?dāng)?shù)據(jù)為0×12 0×1C0×F0 0×1C0×F0 0×12.在文中的驅(qū)動程序設(shè)計(jì)中,就是根據(jù)按鍵的分類對其分別進(jìn)行處理。
PS/2鍵盤與單片機(jī)的連接方式如圖3所示。P3.0接 PS/2數(shù)據(jù)線;P3.2(INT0)接 PS/2時(shí)鐘線。因?yàn)閱纹瑱C(jī)的P3口內(nèi)部是帶上拉電阻的,所以PS/2的時(shí)鐘線和數(shù)據(jù)線可以直接與單片機(jī)的P3相連接。單片機(jī)接收鍵盤數(shù)據(jù)時(shí),數(shù)據(jù)線上的信號在時(shí)鐘為低時(shí)已經(jīng)穩(wěn)定,所以可以采用中斷方式實(shí)現(xiàn)接收數(shù)據(jù)(圖3)。
圖3 硬件設(shè)計(jì)
軟件流程如圖4。
本文程序通過中斷的方式接收按鍵值,轉(zhuǎn)換代碼后送給LCD1602顯示,中斷程序如下:
void Keyboard_out(void)interrupt 0
{
if((IntNum >0)&&(IntNum <9))
{
KeyV=KeyV>>1;//因鍵盤數(shù)據(jù)是低>>高,結(jié)合上一句所以右移一位
圖4 軟件流程
if(Key_Data)
KeyV= KeyV|0x80;//當(dāng)鍵盤數(shù)據(jù)線為1時(shí)到最高位
}
IntNum++;
while(!Key_CLK);//等待PS/2CLK拉高
if(IntNum >10)
{
IntNum=0;//當(dāng)中斷11次后表示一幀數(shù)據(jù)收完,清變量準(zhǔn)備下一次接收
BF=1;//標(biāo)識有字符輸入完了
EA=0;//關(guān)中斷等顯示完后再開中斷
}
本文著重介紹了PS/2通信協(xié)議,并將其應(yīng)用到單片機(jī)系統(tǒng)中,可以應(yīng)用到按鍵要求多的一些場合,而且對于設(shè)計(jì)專用鍵盤也有一定的指導(dǎo)意義。
[1]胡汗才.單片機(jī)原理及系統(tǒng)設(shè)計(jì)[M].北京:清華大學(xué)出版社,2002.
[2]孫德文.微型計(jì)算機(jī)技術(shù)[M].北京:高等教育出版社,2002.
[3]寧 飛,王維華,孔 宇.微型計(jì)算機(jī)原理與接口實(shí)踐[M].北京:清華大學(xué)出版社,2006.