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