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