51 匯編編程:8255 驅(qū)動(dòng)矩陣鍵盤和數(shù)碼管
匯編編程:矩陣鍵盤控制數(shù)碼管切換顯示0~F。
下面是電路圖。要求16個(gè)鍵按下能顯示0~F字樣。
看到這樣的電路和程序,不由得想起初學(xué)單片機(jī)時(shí)情景。
十幾年前,是一本北航的書,里面就是這樣的程序。
后來又看過幾本,里面也有雷同的程序。
其實(shí),該程序編寫的很濫。
它把行列號(hào)碼,算的很清。還特意弄成幾個(gè)分支。
換下一行時(shí),行號(hào)就要分別存入 00H、08H、10H、18H。
想法也太笨了,其實(shí),只要加上 8,就可以編寫成循環(huán)程序了。
程序中,還有很多應(yīng)該簡(jiǎn)化的地方。
這程序?qū)W起來,的確浪費(fèi)了我不少的時(shí)間。
根據(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)用延時(shí)子程序
ACALL KS1 //再次判斷有無鍵按下
JZ KEY1 //無則返回
;
MOV R2, #0FEH //初始列掃描字
MOV R3, #8 //檢查8次
MOV R4, #0 //初始鍵號(hào)
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 //鍵號(hào)放于A中
MOV DPTR, #0030H //指向段碼表首址
MOVC A, @A + DPTR //鍵號(hào)轉(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: //延時(shí)子程序, 約10ms
MOV R7, #20
D1: DJNZ R6, $
DJNZ R7, D1
RET
END
;======================================
本程序運(yùn)行的仿真截圖,可見前面的插圖。
題目中的電路,僅僅使用了一個(gè)數(shù)碼管。這和實(shí)用的場(chǎng)合,還有差距。
如果使用動(dòng)態(tài)顯示的方法,驅(qū)動(dòng)多位數(shù)碼管,那么,矩陣鍵盤的規(guī)模,就可以再擴(kuò)大一些。
而做而論道在這里給出的程序,卻不用增加很多,僅僅再添上三、五行即可夠用。