INT0_EXIT:
POP DPL ; 從堆;謴(fù)數(shù)據(jù)指針低8位DPL
POP DPH ; 從堆棧恢復(fù)數(shù)據(jù)指針高8位DPH
POP PSW ; 從堆;謴(fù)程序狀態(tài)字PSW
POP ACC ; 從堆;謴(fù)累加器A
RETI ; 中斷返回,恢復(fù)PC值并開(kāi)中斷
MOV A, R1 ; 復(fù)制當(dāng)前行掃描碼到A
RL A ; 循環(huán)左移生成下一行掃描碼
MOV R1, A ; 保存新的行掃描碼
INC R0 ; 行計(jì)數(shù)器加1
CJNE R0, #4, KEY_SCAN_1 ; 未掃描完4行則繼續(xù)掃描
INT1_EXIT:
POP DPL ; 恢復(fù)DPL
POP DPH ; 恢復(fù)DPH
POP PSW ; 恢復(fù)PSW
POP ACC ; 恢復(fù)ACC
RETI ; 中斷返回
;====================================================================
; 按鍵處理與數(shù)碼管顯示
;====================================================================
KEY_00: MOV A, R0 ; 將行號(hào)(R0)復(fù)制到累加器A
MOV B, #4 ; 將常數(shù)4放入寄存器B
MUL AB ; 執(zhí)行乘法: A = A × B (行號(hào)×4)
MOV R2, A ; 將計(jì)算結(jié)果(行號(hào)×4)保存到R2
SJMP DISPLAY_KEY ; 跳轉(zhuǎn)到DISPLAY_KEY顯示按鍵值
KEY_01: MOV A, R0 ; 復(fù)制行號(hào)到A
MOV B, #4 ; 常數(shù)4放入B
MUL AB ; 行號(hào)×4
ADD A, #1 ; 加1(第2列對(duì)應(yīng)的偏移量)
MOV R2, A ; 保存按鍵值到R2
SJMP DISPLAY_KEY ; 跳轉(zhuǎn)到顯示處理
KEY_10: MOV A, R0 ; 復(fù)制行號(hào)到A
MOV B, #4 ; 常數(shù)4放入B
MUL AB ; 行號(hào)×4
ADD A, #2 ; 加2(第3列對(duì)應(yīng)的偏移量)
MOV R2, A ; 保存按鍵值到R2
SJMP DISPLAY_KEY ; 跳轉(zhuǎn)到顯示處理
KEY_11: MOV A, R0 ; 復(fù)制行號(hào)到A
MOV B, #4 ; 常數(shù)4放入B
MUL AB ; 行號(hào)×4
ADD A, #3 ; 加3(第4列對(duì)應(yīng)的偏移量)
MOV R2, A ; 保存按鍵值到R2
DISPLAY_KEY:
MOV A, R2 ; 將按鍵值從R2復(fù)制到累加器A
MOV DPTR, #SEG_TAB ; 將段碼表的基地址存入數(shù)據(jù)指針DPTR
MOVC A, @A+DPTR ; 查表獲取按鍵值對(duì)應(yīng)的段碼
; A = 段碼表[按鍵值]
MOV SBUF, A ; 將段碼發(fā)送到串口數(shù)據(jù)緩沖區(qū)SBUF
; 觸發(fā)串口發(fā)送過(guò)程
JNB TI, $ ; 等待發(fā)送完成標(biāo)志位TI置位
; $表示當(dāng)前地址,形成原地循環(huán)
CLR TI ; 手動(dòng)清除發(fā)送完成標(biāo)志位TI
SJMP INT0_EXIT ; 跳轉(zhuǎn)到INT0_EXIT恢復(fù)現(xiàn)場(chǎng)并返回
DA轉(zhuǎn)換程序:
ORG 0000H
LJMP MAIN
ORG 100H
;程序初始化
MAIN: MOV A,#00H ;賦初值
UP: MOVX @DPTR, A ;輸出 4機(jī)器周期
INC A ;A的值加1 1機(jī)器周期
CJNE A ,0FFH ,UP ;如果上次計(jì)算的結(jié)果不是0,就跳轉(zhuǎn) 當(dāng)A加到255,再變成0之后就會(huì)下降。
DOWN: DEC A ;同上
MOVX @DPTR, A ;4個(gè)機(jī)器周期
CJNE A ,#00H , DOWN ;條件滿足時(shí)使用4個(gè)機(jī)器周期,條件不滿足時(shí)使用3個(gè)機(jī)器周期
INC A ;1個(gè)機(jī)器周期
SJMP UP ;2個(gè)機(jī)器周期