51單片機系統(tǒng)與標準PC鍵盤的接口模塊設(shè)計
FIFO棧是程序中設(shè)置的發(fā)送緩沖區(qū),它是按“先進先出”原則建立的32字節(jié)循環(huán)隊列,有一個隊列頭指針和一個隊列尾指針。進隊列時,編碼數(shù)據(jù)進入由隊列尾指針所指單元,同時隊列尾指針增量,指向下一個單元,當(dāng)數(shù)據(jù)不斷進入隊列,使尾指針指向隊列末端時,尾指針循環(huán)重新繞回隊列始端;出隊列時,編碼數(shù)據(jù)從隊列頭指針所指的單元取出,同時隊列頭指針增量,指向下一個單元,在頭指針指向隊列末端時,也要重新繞回隊列始端,但頭指針始終不能“超過”尾指針。如果按鍵速度快于上位單片機接收碼值的速度,有可能尾指針繞回后與頭指針再次相等,這時表明隊列已滿,不能再存入數(shù)據(jù),如果此時再有鍵按下,那么棧溢出指示燈將點亮。
在系統(tǒng)中設(shè)立了三個標志分別對應(yīng)于CAPS LOCK鍵、NUM LOCK鍵及SCROLL LOCK鍵的狀態(tài),每次有這三個鍵按下時,程序都要翻轉(zhuǎn)相應(yīng)標志,然后向鍵盤發(fā)送EDH命令,命令鍵盤對其上的三個LED指示燈做相應(yīng)激勵。
在向上位單片機發(fā)送FIFO棧首的碼值之前要先檢測ACK信號狀態(tài)以確定上位單片機是否已取走上次碼值。若ACK信號有效,則將碼值鎖存在P1口上,然后由P3.7產(chǎn)生模擬的時鐘脈沖信號,一方面將8位并行碼值置入串-并轉(zhuǎn)換芯片(74LS165)中,另一方面將觸發(fā)器(74LS74)置為1,使端變?yōu)?,為上位單片機提供碼值準備好(PS_READY#)的狀態(tài)信號,并點亮指示燈。在上位單片機中,可查詢此狀態(tài)信號也可利用此狀態(tài)信號申請中斷。上位單片機若采用并行接口方法,則發(fā)出讀緩沖器信號(P_RD#)和片選信號(P_CS#),便可通過三態(tài)緩沖器(74LS244)取得鍵值;若采用串行接口方法,則需發(fā)出串行時鐘(S_CLK),從74LS165的串行數(shù)據(jù)端(S_DAT)讀回8位碼值。在上位單片機讀取完當(dāng)前的鍵值后,ACK信號將由握手邏輯自動置為有效,系統(tǒng)可通過檢測ACK信號的狀態(tài)以發(fā)送下一個碼值。
圖4 主程序流程圖
結(jié)語
實踐證明應(yīng)用該模塊不但可大大地簡化鍵盤輸入電路及程序設(shè)計,而且在使用高級語言書寫程序時更加方便。該模塊可識別標準PC鍵盤上的所有按鍵,并能自動考慮SHIFT、NUMLOCK及CAPLOCK鍵對編碼的影響。對于DOS系統(tǒng)中CRTL+按鍵、ALT+按鍵等組合鍵,該模塊并未考慮,但相對上位的單片機系統(tǒng)而言,目前所提供的按鍵數(shù)量已足夠用了。
評論