接口模塊的特
點該模塊在PC鍵盤與上位單片機(jī)之間起轉(zhuǎn)換作用,,它屏蔽了與PC鍵盤進(jìn)行數(shù)據(jù)和命令交互的復(fù)雜過程,大大簡化了上位單片機(jī)系統(tǒng)的輸入設(shè)計,;它實現(xiàn)了類似DOS操作系統(tǒng)中鍵盤中斷服務(wù)程序的功能,,使設(shè)計人員只需關(guān)心接收按鍵的結(jié)果,并可使用標(biāo)準(zhǔn)的鍵盤編碼進(jìn)行編程,;它要求上位單片機(jī)通過8位并行接口與其相接,,對于不能提供并行接口的系統(tǒng),可使用SPI兼容的同步串行接口與其相接,,特別是對于那些希望占用單片機(jī)的系統(tǒng)資源少而需要擴(kuò)展的鍵數(shù)較多,、儀器整體需要美觀大方的應(yīng)用場合,其性能價格比更具優(yōu)勢,。該模塊與單片機(jī)系統(tǒng)的連接關(guān)系如圖1所示,,在圖中也給出與上位單片機(jī)相接的20腳接插件的信號定義。
圖1 該模塊與上位單片機(jī)系統(tǒng)的連接關(guān)系及信號定義
計算機(jī)中標(biāo)準(zhǔn)PC機(jī)鍵盤的工作原理
鍵盤與主機(jī)通過鍵盤插頭相接,,鍵盤插頭有5芯大插頭和6芯小插頭(PS/2接口)兩種,。接口信號有:電源、地,、鍵盤時鐘KB_CLK,、鍵盤數(shù)據(jù)KB_DAT。正常工作時,,鍵盤電路不斷地掃描鍵盤矩陣,。若有鍵按下,,則以串行方式發(fā)送按鍵的位置掃描碼給主板鍵盤接口電路。按下鍵時,,發(fā)送接通掃描碼,,松開鍵時,發(fā)送該鍵的斷開掃描碼,。斷開掃描碼一般是在接通掃描碼前加一個斷開標(biāo)志字節(jié)F0H,。若某鍵一直按下,則以按鍵重復(fù)率連續(xù)發(fā)送該鍵的接通掃描碼,。掃描碼與按鍵的位置有關(guān),,與該鍵的ASCII碼并無對應(yīng)關(guān)系。表1第二列給出經(jīng)實際測試得到的若干按鍵的位置掃描碼,。由表1可見,,根據(jù)鍵的按下或釋放及所按鍵的不同,這個序列可以是1,、2,、3、4,、6,、或8字節(jié),可稱之為位置掃描碼序列,。
標(biāo)準(zhǔn)鍵盤與主機(jī)的通信是雙向的,,并采用11位的串行異步通信格式,這11位數(shù)據(jù)包括:起始位0,、8位數(shù)據(jù)位(LSB在先),、奇校驗位P、停止位1,。圖2(a)給出了鍵盤發(fā)送時序,。數(shù)據(jù)(KB_DAT)在時鐘(KB_CLK)的上升沿改變,下降沿時有效,,可被主機(jī)讀取,。圖2(b)給出鍵盤接收時序。主機(jī)發(fā)送前,,先將KB_CLK拉低,,以抑制鍵盤發(fā)送,再將KB_DAT拉低發(fā)送起始位,,然后釋放KB_CLK線,,鍵盤接管KB_CLK并產(chǎn)生時鐘信號,主機(jī)在KB_CLK信號同步下發(fā)送其他位。
圖2 鍵盤接口時序(a) 鍵盤發(fā)送時序,;(b) 鍵盤接收時序
標(biāo)準(zhǔn)PC鍵盤接口模塊的工作原理
基本工作原理概述
該模塊的原理框圖如圖3所示。PC鍵盤與該模塊通過專用插座相連,,數(shù)據(jù)KB_DAT接到AT89C2051的P3.0引腳,,時鐘KB_CLK接到引腳。在PC鍵盤有鍵按下時,,KB_CLK信號會引起AT89C2051的連續(xù)中斷,,通過定時器T0與外中斷的協(xié)同工作,可將PC鍵盤發(fā)出的位置掃描碼序列接收至緩沖區(qū)中,。然后,,在主程序中將位置掃描碼解碼、查表換算,,再編碼成一字節(jié)的WINDOWS虛擬鍵代碼或兩字節(jié)的OEM掃描碼與ASCII碼,,并存入系統(tǒng)中FIFO棧。在上位單片機(jī)可以接收新鍵值時,,將FIFO棧中編碼數(shù)據(jù)以并行或串行方式傳送給上位單片機(jī),。
圖3 單片機(jī)系統(tǒng)與標(biāo)準(zhǔn)PC鍵盤接口模塊原理框圖
為了能更清楚地指示系統(tǒng)當(dāng)前的工作狀態(tài),在硬件上加裝了電源,、正在解碼,、FIFO棧溢出、碼值準(zhǔn)備好等指示燈,。
中斷解碼的工作原理
由于鍵盤的按鍵輸入是隨機(jī)的,為了能實時地響應(yīng),,在程序中使用定時器T0中斷和中斷協(xié)同工作,,將位置掃描碼序列恢復(fù)至鍵盤接收緩沖區(qū)中。中斷服務(wù)程序用來將碼值的一位移入緩沖區(qū)中,,T0溢出的中斷服務(wù)程序主要用來判斷一次按鍵所發(fā)出的碼是否已全部接收,。系統(tǒng)設(shè)置T0的定時間隔為5ms,并在系統(tǒng)啟
動后就開始定時,。由于在正常接收每個按鍵的碼值序列過程中,,鍵盤發(fā)送的每位數(shù)據(jù)間隔不會大于5ms,因此在每次中斷服務(wù)中,,首先要判斷T0是否溢出過,,若曾經(jīng)溢出,則認(rèn)為該次中斷是一次新碼值接收的開始,,需將位計數(shù)器清零,,否則只需移入一位數(shù)據(jù)即可,然后重新啟動定時器,退出中斷服務(wù)程序,。在新按鍵碼值序列接收完成后,,設(shè)置blnDataValid標(biāo)志,以通知主程序,。
主程序的工作原理
主程序主要有四個任務(wù):
①將鍵盤接收緩沖區(qū)的位置掃描碼通過查表等算法換成統(tǒng)一編碼的一個字節(jié)Windows虛擬鍵代碼或兩個字節(jié)的OEM掃描碼與ASCII碼,;
②根據(jù)系統(tǒng)中CAPS LOCK鍵、NUM LOCK鍵及SCROLL LOCK鍵的狀態(tài)信息控制鍵盤上三個指示燈的亮滅,;
③系統(tǒng)中設(shè)立的FIFO棧的維護(hù),;
④與上位單片機(jī)碼值傳送的握手交互過程。
主程序的流程圖如圖4所示,。在主程序中檢測到blnDataValid標(biāo)志后,,即說明在鍵盤接收緩沖區(qū)中已接收到一個新的位置掃描碼序列,程序根據(jù)這個序列的不同特點做不同的處理,,最后再根據(jù)硬件跳線的設(shè)置得到相應(yīng)按鍵的Windows虛擬鍵代碼或ASCII碼與OEM掃描碼,,圖4中的跳線接至“W”位時,編碼為Windows虛擬鍵代碼,。虛擬鍵代碼是Windows系統(tǒng)中引入的一組按鍵編碼常量,,每一個按鍵都有惟一的碼值與之對應(yīng)。ASCII碼與OEM掃描碼則是在DOS系統(tǒng)定義的,但在Windows系統(tǒng)中沿用的按鍵碼值定義,,每一個按鍵都有兩個碼值與之對應(yīng),,對于功能鍵,例如F1,、HOME,、UP等,只存在OEM掃描碼,,其ASCII碼為0,。
圖4 主程序流程圖
FIFO棧是程序中設(shè)置的發(fā)送緩沖區(qū),它是按“先進(jìn)先出”原則建立的32字節(jié)循環(huán)隊列,,有一個隊列頭指針和一個隊列尾指針,。進(jìn)隊列時,編碼數(shù)據(jù)進(jìn)入由隊列尾指針?biāo)竼卧?,同時隊列尾指針增量,,指向下一個單元,當(dāng)數(shù)據(jù)不斷進(jìn)入隊列,,使尾指針指向隊列末端時,,尾指針循環(huán)重新繞回隊列始端;出隊列時,,編碼數(shù)據(jù)從隊列頭指針?biāo)傅膯卧〕?,同時隊列頭指針增量,指向下一個單元,在頭指針指向隊列末端時,,也要重新繞回隊列始端,,但頭指針始終不能“超過”尾指針。如果按鍵速度快于上位單片機(jī)接收碼值的速度,,有可能尾指針繞回后與頭指針再次相等,,這時表明隊列已滿,不能再存入數(shù)據(jù),,如果此時再有鍵按下,,那么棧溢出指示燈將點亮。
在系統(tǒng)中設(shè)立了三個標(biāo)志分別對應(yīng)于CAPS LOCK鍵,、NUM LOCK鍵及SCROLL LOCK鍵的狀態(tài),,每次有這三個鍵按下時,程序都要翻轉(zhuǎn)相應(yīng)標(biāo)志,,然后向鍵盤發(fā)送EDH命令,,命令鍵盤對其上的三個LED指示燈做相應(yīng)激勵。
在向上位單片機(jī)發(fā)送FIFO棧首的碼值之前要先檢測ACK信號狀態(tài)以確定上位單片機(jī)是否已取走上次碼值,。若ACK信號有效,,則將碼值鎖存在P1口上,然后由P3.7產(chǎn)生模擬的時鐘脈沖信號,,一方面將8位并行碼值置入串-并轉(zhuǎn)換芯片(74LS165)中,,另一方面將觸發(fā)器(74LS74)置為1,使端變?yōu)?,,為上位單片機(jī)提供碼值準(zhǔn)備好(PS_READY#)的狀態(tài)信號,,并點亮指示燈。在上位單片機(jī)中,,可查詢此狀態(tài)信號也可利用此狀態(tài)信號申請中斷,。上位單片機(jī)若采用并行接口方法,則發(fā)出讀緩沖器信號(P_RD#)和片選信號(P_CS#),,便可通過三態(tài)緩沖器(74LS244)取得鍵值;若采用串行接口方法,,則需發(fā)出串行時鐘(S_CLK),,從74LS165的串行數(shù)據(jù)端(S_DAT)讀回8位碼值。在上位單片機(jī)讀取完當(dāng)前的鍵值后,,ACK信號將由握手邏輯自動置為有效,,系統(tǒng)可通過檢測ACK信號的狀態(tài)以發(fā)送下一個碼值。
結(jié)語
實踐證明應(yīng)用該模塊不但可大大地簡化鍵盤輸入電路及程序設(shè)計,,而且在使用高級語言書寫程序時更加方便,。該模塊可識別標(biāo)準(zhǔn)PC鍵盤上的所有按鍵,并能自動考慮SHIFT、NUMLOCK及CAPLOCK鍵對編碼的影響,。對于DOS系統(tǒng)中CRTL+按鍵,、ALT+按鍵等組合鍵,該模塊并未考慮,,但相對上位的單片機(jī)系統(tǒng)而言,,目前所提供的按鍵數(shù)量已足夠用了。
參考文獻(xiàn)
1 榮振,梁華,王春生.單片機(jī)擴(kuò)展標(biāo)準(zhǔn)微機(jī)鍵盤的技術(shù).微型機(jī)與應(yīng)用,2000(7)
2 于印泉,佴曉東,王兆娟.單片機(jī)與PC鍵盤接口.內(nèi)燃機(jī)車,2000(5)