51 匯編編程:8255 驅(qū)動矩陣鍵盤和數(shù)碼管
匯編編程:矩陣鍵盤控制數(shù)碼管切換顯示0~F。
下面是電路圖。要求16個鍵按下能顯示0~F字樣。
看到這樣的電路和程序,不由得想起初學(xué)單片機時情景。
十幾年前,是一本北航的書,里面就是這樣的程序。
后來又看過幾本,里面也有雷同的程序。
其實,該程序編寫的很濫。
它把行列號碼,算的很清。還特意弄成幾個分支。
換下一行時,行號就要分別存入 00H、08H、10H、18H。
想法也太笨了,其實,只要加上 8,就可以編寫成循環(huán)程序了。
程序中,還有很多應(yīng)該簡化的地方。
這程序?qū)W起來,的確浪費了我不少的時間。
根據(jù)題目中的電路和程序,做而論道改寫的程序如下。
;
? ? ORG ? 0000H
? ? SJMP ?START
? ? ORG ? 0030H
;--------------------------------------
DUMA:
? ? DB ? ?3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H //共陰段碼
? ? DB ? ?7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
;--------------------------------------
START:
? ? MOV ? DPTR, #7F03H ?//8255初始化
? ? MOV ? A, #90H
? ? MOVX ?@DPTR, A
? ? MOV ? A, #16
;--------------------------------------
KEY1:
? ? ACALL KS1 ? ? ? ? ? //判斷有無鍵按下, 返回PA口狀態(tài)存放在A中
? ? JZ ? ?KEY1 ? ? ? ? ?//無則返回
? ? ACALL DELAY ? ? ? ? //調(diào)用延時子程序
? ? ACALL KS1 ? ? ? ? ? //再次判斷有無鍵按下
? ? JZ ? ?KEY1 ? ? ? ? ?//無則返回
;
? ? MOV ? R2, #0FEH ? ? //初始列掃描字
? ? MOV ? R3, #8 ? ? ? ?//檢查8次
? ? MOV ? R4, #0 ? ? ? ?//初始鍵號
LK4:
? ? MOV ? DPTR, #7F01H ?//指向PB口
? ? MOV ? A, R2
? ? MOVX ?@DPTR, A
? ? MOV ? DPTR, #7F00H ?//指向PA口
? ? MOVX ?A, @DPTR
? ? JNB ? ACC.0, LK3
? ? INC ? R4
? ? JNB ? ACC.1, LK3
? ? INC ? R4
? ? MOV ? A, R2
? ? RL ? ?A ? ? ? ? ? ? //無則左移一位列掃描字, 繼續(xù)判斷下一列
? ? MOV ? R2, A
? ? DJNZ ?R3, LK4
LK3:
? ? ACALL KS1 ? ? ? ? ?
? ? JNZ ? LK3 ? ? ? ? ? //判斷按下的鍵有沒有彈起, 無則原地等待繼續(xù)判斷
;
? ? MOV ? A, R4 ? ? ? ? //鍵號放于A中
? ? MOV ? DPTR, #0030H ?//指向段碼表首址
? ? MOVC ?A, @A + DPTR ?//鍵號轉(zhuǎn)成相應(yīng)的段碼
? ? MOV ? DPTR, #7F02H ?//指向PC口
? ? MOVX ?@DPTR, A ? ? ?//數(shù)碼管顯示
;
? ? SJMP ?KEY1
;--------------------------------------
KS1:
? ? MOV ? DPTR, #7F01H ?//指向PB口
? ? MOV ? A, #0
? ? MOVX ?@DPTR, A
? ? MOV ? DPTR, #7F00H ?//指向PA口
? ? MOVX ?A, @DPTR
? ? CPL ? A
? ? ANL ? A, #03H
? ? RET ? ? ? ? ? ? ? ? //返回PA口數(shù)據(jù)存放在A中, 若有鍵按下, 則A不等于零
;--------------------------------------
DELAY: ? ? ? ? ? ? ? ? ?//延時子程序, 約10ms
? ? MOV ? R7, #20
D1: DJNZ ?R6, $
? ? DJNZ ?R7, D1
? ? RET
END
;======================================
本程序運行的仿真截圖,可見前面的插圖。
題目中的電路,僅僅使用了一個數(shù)碼管。這和實用的場合,還有差距。
如果使用動態(tài)顯示的方法,驅(qū)動多位數(shù)碼管,那么,矩陣鍵盤的規(guī)模,就可以再擴大一些。
而做而論道在這里給出的程序,卻不用增加很多,僅僅再添上三、五行即可夠用。