單片機系統與標準PC鍵盤(pán)的接口模塊設計
概述
在單片機系統中,當輸入按鍵較多時(shí),在硬件設計和軟件編程之間總存在著(zhù)矛盾。對于不同的單片機系統需要進(jìn)行專(zhuān)用的鍵盤(pán)硬件設計和編程調試,通用性差,使項目開(kāi)發(fā)復雜化。標準pc鍵盤(pán)在工藝與技術(shù)上都已相當成熟,而且工作穩定,價(jià)格低廉。本設計實(shí)現了一個(gè)接口模塊,它將標準pc鍵盤(pán)發(fā)出的位置掃描碼,變換為標準的ascii碼和oem掃描碼或windows虛擬鍵代碼,再以并行或串行方式傳送給上位單片機。
接口模塊的特點(diǎn)
該模塊在pc鍵盤(pán)與上位單片機之間起轉換作用,它屏蔽了與pc鍵盤(pán)進(jìn)行數據和命令交互的復雜過(guò)程,大大簡(jiǎn)化了上位單片機系統的輸入設計;它實(shí)現了類(lèi)似dos操作系統中鍵盤(pán)中斷服務(wù)程序的功能,使設計人員只需關(guān)心接收按鍵的結果,并可使用標準的鍵盤(pán)編碼進(jìn)行編程;它要求上位單片機通過(guò)8位并行接口與其相接,對于不能提供并行接口的系統,可使用spi兼容的同步串行接口與其相接,特別是對于那些希望占用單片機的系統資源少而需要擴展的鍵數較多、儀器整體需要美觀(guān)大方的應用場(chǎng)合,其性能價(jià)格比更具優(yōu)勢。該模塊與單片機系統的連接關(guān)系如圖1所示,在圖中也給出與上位單片機相接的20腳接插件的信號定義。
計算機中標準pc機鍵盤(pán)的工作原理

圖1 該模塊與上位單片機系統的連接關(guān)系及信號定義

圖2 鍵盤(pán)接口時(shí)序(a) 鍵盤(pán)發(fā)送時(shí)序;(b) 鍵盤(pán)接收時(shí)序

圖3 單片機系統與標準pc鍵盤(pán)接口模塊原理框圖 鍵盤(pán)與主機通過(guò)鍵盤(pán)插頭相接,鍵盤(pán)插頭有5芯大插頭和6芯小插頭(ps/2接口)兩種。接口信號有:電源、地、鍵盤(pán)時(shí)鐘kb_clk、鍵盤(pán)數據kb_dat。正常工作時(shí),鍵盤(pán)電路不斷地掃描鍵盤(pán)矩陣。若有鍵按下,則以串行方式發(fā)送按鍵的位置掃描碼給主板鍵盤(pán)接口電路。按下鍵時(shí),發(fā)送接通掃描碼,松開(kāi)鍵時(shí),發(fā)送該鍵的斷開(kāi)掃描碼。斷開(kāi)掃描碼一般是在接通掃描碼前加一個(gè)斷開(kāi)標志字節f0h。若某鍵一直按下,則以按鍵重復率連續發(fā)送該鍵的接通掃描碼。掃描碼與按鍵的位置有關(guān),與該鍵的ascii碼并無(wú)對應關(guān)系。表1第二列給出經(jīng)實(shí)際測試得到的若干按鍵的位置掃描碼。由表1可見(jiàn),根據鍵的按下或釋放及所按鍵的不同,這個(gè)序列可以是1、2、3、4、6、或8字節,可稱(chēng)之為位置掃描碼序列。
標準鍵盤(pán)與主機的通信是雙向的,并采用11位的串行異步通信格式,這11位數據包括:起始位0、8位數據位(lsb在先)、奇校驗位p、停止位1。圖2(a)給出了鍵盤(pán)發(fā)送時(shí)序。數據(kb_dat)在時(shí)鐘(kb_clk)的上升沿改變,下降沿時(shí)有效,可被主機讀取。圖2(b)給出鍵盤(pán)接收時(shí)序。主機發(fā)送前,先將kb_clk拉低,以抑制鍵盤(pán)發(fā)送,再將kb_dat拉低發(fā)送起始位,然后釋放kb_clk線(xiàn),鍵盤(pán)接管kb_clk并產(chǎn)生時(shí)鐘信號,主機在kb_clk信號同步下發(fā)送其他位。
標準pc鍵盤(pán)接口模塊的工作原理
基本工作原理概述
該模塊的原理框圖如圖3所示。pc鍵盤(pán)與該模塊通過(guò)專(zhuān)用插座相連,數據kb_dat接到at89c2051的p3.0引腳,時(shí)鐘kb_clk接到引腳。在pc鍵盤(pán)有鍵按下時(shí),kb_clk信號會(huì )引起at89c2051的連續中斷,通過(guò)定時(shí)器t0與外中斷的協(xié)同工作,可將pc鍵盤(pán)發(fā)出的位置掃描碼序列接收至緩沖區中。然后,在主程序中將位置掃描碼解碼、查表?yè)Q算,再編碼成一字節的windows虛擬鍵代碼或兩字節的oem掃描碼與ascii碼,并存入系統中fifo棧。在上位單片機可以接收新鍵值時(shí),將fifo棧中編碼數據以并行或串行方式傳送給上位單片機。 為了能更清楚地指示系統當前的工作狀態(tài),在硬件上加裝了電源、正在解碼、fifo棧溢出、碼值準備好等指示燈。
中斷解碼的工作原理
由于鍵盤(pán)的按鍵輸入是隨機的,為了能實(shí)時(shí)地響應,在程序中使用定時(shí)器t0中斷和中斷協(xié)同工作,將位置掃描碼序列恢復至鍵盤(pán)接收緩沖區中。中斷服務(wù)程序用來(lái)將碼值的一位移入緩沖區中,t0溢出的中斷服務(wù)程序主要用來(lái)判斷一次按鍵所發(fā)出的碼是否已全部接收。系統設置t0的定時(shí)間隔為5ms,并在系統啟動(dòng)后就開(kāi)始定時(shí)。由于在正常接收每個(gè)按鍵的碼值序列過(guò)程中,鍵盤(pán)發(fā)送的每位數據間隔不會(huì )大于5ms,因此在每次中斷服務(wù)中,首先要判斷t0是否溢出過(guò),若曾經(jīng)溢出,則認為該次中斷是一次新碼值接收的開(kāi)始,需將位計數器清零,否則只需移入一位數據即可,然后重新啟動(dòng)定時(shí)器,退出中斷服務(wù)程序。在新按鍵碼值序列接收完成后,設置blndatavalid標志,以通知主程序。
主程序的工作原理
主程序主要有四個(gè)任務(wù):①將鍵盤(pán)接收緩沖區的位置掃描碼通過(guò)查表等算法換成統一編碼的一個(gè)字節windows虛擬鍵代碼或兩個(gè)字節的oem掃描碼與ascii碼;②根據系統中caps lock鍵、num lock鍵及scroll lock鍵的狀態(tài)信息控制鍵盤(pán)上三個(gè)指示燈的亮滅;③系統中設立的fifo棧的維護;④與上位單片機碼值傳送的握手交互過(guò)程。主程序的流程圖如圖4所示。
在主程序中檢測到blndatavalid標志后,即說(shuō)明在鍵盤(pán)接收緩沖區中已接收到一個(gè)新的位置掃描碼序列,程序根據這個(gè)序列的不同特點(diǎn)做不同的處理,最后再根據硬件跳線(xiàn)的設置得到相應按鍵的windows虛擬鍵代碼或ascii碼與oem掃描碼,圖4中的跳線(xiàn)接至“w”位時(shí),編碼為windows虛擬鍵代碼。虛擬鍵代碼是windows系統中引入的一組按鍵編碼常量,每一個(gè)按鍵都有惟一的碼值與之對應。ascii碼與oem掃描碼則是在dos系統定義的,但在windows系統中沿用的按鍵碼值定義,每一個(gè)按鍵都有兩個(gè)碼值與之對應,對于功能鍵,例如f1、home、up等,只存在oem掃描碼,其ascii碼為0,參見(jiàn)表1。
fifo棧是程序中設置的發(fā)送緩沖區,它是按“先進(jìn)先出”原則建立的32字節循環(huán)隊列,有一個(gè)隊列頭指針和一個(gè)隊列尾指針。進(jìn)隊列時(shí),編碼數據進(jìn)入由隊列尾指針所指單元,同時(shí)隊列尾指針增量,指向下一個(gè)單元,當數據不斷進(jìn)入隊列,使尾指針指向隊列末端時(shí),尾指針循環(huán)重新繞回隊列始端;出隊列時(shí),編碼數據從隊列頭指針所指的單元取出,同時(shí)隊列頭指針增量,指向下一個(gè)單元,在頭指針指向隊列末端時(shí),也要重新繞回隊列始端,但頭指針始終不能“超過(guò)”尾指針。如果按鍵速度快于上位單片機接收碼值的速度,有可能尾指針繞回后與頭指針再次相等,這時(shí)表明隊列已滿(mǎn),不能再存入數據,如果此時(shí)再有鍵按下,那么棧溢出指示燈將點(diǎn)亮。 在系統中設立了三個(gè)標志分別對應于caps lock鍵、num lock鍵及scroll lock鍵的狀態(tài),每次有這三個(gè)鍵按下時(shí),程序都要翻轉相應標志,然后向鍵盤(pán)發(fā)送edh命令,命令鍵盤(pán)對其上的三個(gè)led指示燈做相應激勵。
在向上位單片機發(fā)送fifo棧首的碼值之前要先檢測ack信號狀態(tài)以確定上位單片機是否已取走上次碼值。若ack信號有效,則將碼值鎖存在p1口上,然后由p3.7產(chǎn)生模擬的時(shí)鐘脈沖信號,一方面將8位并行碼值置入串-并轉換芯片(74ls165)中,另一方面將觸發(fā)器(74ls74)置為1,使端變?yōu)?,為上位單片機提供碼值準備好(ps_ready#)的狀態(tài)信號,并點(diǎn)亮指示燈。在上位單片機中,可查詢(xún)此狀態(tài)信號也可利用此狀態(tài)信號申請中斷。上位單片機若采用并行接口方法,則發(fā)出讀緩沖器信號(p_rd#)和片選信號(p_cs#),便可通過(guò)三態(tài)緩沖器(74ls244)取得鍵值;若采用串行接口方法,則需發(fā)出串行時(shí)鐘(s_clk),從74ls165的串行數據端(s_dat)讀回8位碼值。在上位單片機讀取完當前的鍵值后,ack信號將由握手邏輯自動(dòng)置為有效,系統可通過(guò)檢測ack信號的狀態(tài)以發(fā)送下一個(gè)碼值。

圖4 主程序流程圖 結語(yǔ)
實(shí)踐證明應用該模塊不但可大大地簡(jiǎn)化鍵盤(pán)輸入電路及程序設計,而且在使用高級語(yǔ)言書(shū)寫(xiě)程序時(shí)更加方便。該模塊可識別標準pc鍵盤(pán)上的所有按鍵,并能自動(dòng)考慮shift、numlock及caplock鍵對編碼的影響。對于dos系統中crtl+按鍵、alt+按鍵等組合鍵,該模塊并未考慮,但相對上位的單片機系統而言,目前所提供的按鍵數量已足夠用了。
評論