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个机器周期