📄 s8251.asm
字号:
;FOR EAT598
Z8279 EQU 0F239H ;8279 状态/命令口地址
D8279 EQU 0F238H ;8279 数据口地址
LEDMOD EQU 00H ;左边输入 八位字符显示
;外部译码键扫描方式,双键互锁
LEDFEQ EQU 2FH ;扫描速率
LEDCLS EQU 0C1H ;清除显示 RAM
LEDWR0 EQU 80H ;设定的将要写入的显示RAM地址
READKB EQU 40H ;读 FIFO RAM 地址 0 的命令字
Z8251 EQU 0F202H ;8251 状态/命令口地址
D8251 EQU 0F200H ;8251 数据口地址
COM_MOD EQU 04EH ;字符 8 位, 1 位起始位, 1 位停止位
;异步 * 16,不校验
COM_COM EQU 25H ;请求发送,发送允许,接收允许
ORG 0000H
AJMP START
ORG 0040H
START:
MOV SP,#60H
LCALL INIT8279 ;初始化8279
LCALL INIT8251 ;初始化8251
SETB EA ;开中断
WAIT:
MOV DPTR,#Z8251 ;8251 状态寄存器(读)
MOVX A,@DPTR
ANL A,#02H
JZ WAIT1 ;判断是否有串行输入
SJMP DIS_REC ;显示字符
WAIT1: LCALL GETKEY ;读键盘
CJNE A,#0FFH,WAIT ;判断是否有按键
MOV DPTR,#Z8251
WAIT3: MOVX A,@DPTR
ANL A,#01H
JZ WAIT3 ;判断发送允许
MOV A,B
MOV DPTR,#D8251
MOVX @DPTR,A ;发送数据
NOP
MOV DPTR,#Z8251
WAIT2: MOVX A,@DPTR
ANL A,#01H
JZ WAIT2 ;判断发送允许
SJMP WAIT
DIS_REC:
MOV DPTR,#D8251
MOVX A,@DPTR ;读接收到的字符
CLR C
SUBB A,#30H ;以下判定输入是否在0-F内
JC ERROR
SUBB A,#0AH
JNC DIS_REC1
ADD A,#0AH
SJMP DIS_REC2
DIS_REC1:
SUBB A,#7H
JC ERROR
SUBB A,#6H
JNC ERROR
ADD A,#10H
DIS_REC2:
MOV R4,#0
MOV R5,A
LCALL DISLED ;显示输入的数字(0-F)
ERROR: AJMP WAIT
INIT8251: ;8251 初始化子程序
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
MOV DPTR,#Z8251
MOV A,#COM_MOD ;置 8251 工作方式
MOVX @DPTR,A
NOP
MOV A,#COM_COM ;请求发送,发送允许,接收允许
MOVX @DPTR,A
NOP
MOV A,#65H
MOVX @DPTR,A
NOP
MOV A,#COM_MOD ;置 8251 工作方式
MOVX @DPTR,A
NOP
MOV A,#COM_COM ;请求发送,发送允许,接收允许
MOVX @DPTR,A
NOP
POP ACC ;恢复现场
POP DPL
POP DPH
RET
INIT8279: ;8279初始化子程序
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
LCALL DELAY ;延时
MOV DPTR ,#Z8279
MOV A,#LEDMOD ;置8279工作方式
MOVX @DPTR,A
MOV A,#LEDFEQ ;置键盘扫描速率
MOVX @DPTR,A
MOV A,#LEDCLS ;清除 LED 显示
MOVX @DPTR,A
LCALL DELAY ;延时
POP ACC ;恢复现场
POP DPL
POP DPH
RET
;读键盘子程序
;输入: 无 ; 输出: B: 读到的键码 A: 按键的标志
GETKEY: PUSH DPH ;保存现场
PUSH DPL
PUSH PSW
MOV DPTR,#Z8279
MOVX A,@DPTR ;读8279状态
ANL A,#07H ;屏蔽D7-D3
JNZ GETVAL ;判断是否有键输入
MOV A,#0H ;置标志(无键输入)
SJMP NKBHIT
GETVAL: MOV A,#READKB ;读 FIFO RAM 命令
MOVX @DPTR,A
MOV DPTR,#D8279
MOVX A,@DPTR ;读键
ANL A,#3FH ;屏蔽 SHIFT 和 CTRL 键
MOV R6,A
MOV DPTR,#KEYCODE ;键码表起始地址
MOVC A,@A+DPTR ;查表
MOV B,A ;置返回键值
MOV A,#0FFH ;置标志(有键输入)
MOV A,#LEDWR0 ;置显示起始地址
MOV DPTR,#Z8279
MOVX @DPTR,A ;设定显示位置
MOV DPTR,#LEDSEG ;置显示常数表起始位置
MOV A,R6
MOVC A,@A+DPTR ;查表
MOV DPTR,#D8279
MOVX @DPTR,A ;显示数据
MOV A,#0FFH
NKBHIT: POP PSW ;恢复现场
POP DPL
POP DPH
RET
;显示字符子程序
;输入: R4,位置 R5,值
DISLED: PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
MOV A,#LEDWR0 ;置显示起始地址
ADD A,R4 ;加位置偏移量
MOV DPTR,#Z8279
MOVX @DPTR,A ;设定显示位置
MOV DPTR,#LEDSEG ;置显示常数表起始位置
MOV A,R5
MOVC A,@A+DPTR ;查表
MOV DPTR,#D8279
MOVX @DPTR,A ;显示数据
POP ACC ;恢复现场
POP DPL
POP DPH
RET
DELAY: ;延时子程序
PUSH 0 ;保存现场
PUSH 1
MOV 0,#0H
DELAY1: MOV 1,#0H
DJNZ 1,$
DJNZ 0,DELAY1
POP 1 ;恢复现场
POP 0
RET
;LED显示常数表
LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
;键盘键码表
KEYCODE:DB 30H,31H,32H,33H,34H,35H,36H,37H ;'0,1,2,3,4,5,6,7'
DB 38H,39H,41H,42H,43H,44H,45H,46H ;'8,9,A,B,C,D,F,F'
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -