📄 n8251.asm
字号:
;---------------------------------------------------------
C8255 EQU 0C006H ;8255命令口地址
P8255A EQU 0C000H ;8255 PA口地址
P8255B EQU 0C002H ;8255 PB口地址
P8255C EQU 0C004H ;8255 PC口地址
Z8251 EQU 0D002H ;8251 状态/命令口地址
D8251 EQU 0D000H ;8251 数据口地址
COM_MOD EQU 04EH ;字符 8 位, 1 位起始位, 1 位停止位,异步 * 16
COM_COM EQU 25H ;请求发送,发送允许,接收允许
TIM_CTL EQU 0C806H ;8253 状态/命令口地址
TIMER0 EQU 0C800H
MODE03 EQU 00110110B;定时器0工作在方式3
AL EQU 1AH
AH EQU 1BH
AX EQU 1AH
BL EQU 22H
BX EQU 22H
CX EQU 24H
DL EQU 26H
DX EQU 26H
;---------------------------------------------------------
ORG 2080H
START: LD SP,#0F8H
LCALL INIT55 ;初始化
LCALL INIT53
LCALL INIT51
GOON: LCALL P55IN ;键盘输入,CRT显示
LCALL P51IN ;串口输入,LED显示
SJMP GOON ;循环
;---------------------------------------------------------
P55IN:
SCALL RD_KB ;读键盘值
JBS AL,4,EXIT_55 ;无键值则返回
SJMP OUT ;有键则发送
EXIT_55:
RET
OUT: LCALL OUT55 ;先显示到数码管上
LDB AH,#0H
LDB AL,ASCII[AL] ;转换成ASCII码
LCALL OUT51 ;发送到PC机屏幕上
RET
;---------------------------------------------------------
P51IN: LDB AL,Z8251 ;判断是否有串行输入
JBS AL,1,I51 ;有则跳到I51
RET ;无则返回
I51: LDB AL,D8251 ;读接收到的字符
LCALL OUT51 ;先在CRT上显示
CMPB AL,#61H ;以字母‘a’为界限
JNC I52
ANDB AL,#11011111B ;小写转大写
I52: SUBB AL,#30H
JNC IGNO ;<30H
CMPB AL,#0AH
JC I511 ;>=3AH
LCALL OUT55 ;显示到数码管上
IGNO: RET
I511: SUBB AL,#07
CMPB AL,#0AH
JNC IGNO
CMPB AL,#10H
JC IGNO
LCALL OUT55
RET
OUT51: STB AL,D8251
PUSH AL
LDB AL,Z8251
JBC AL,0,$-5
POP AL
RET
OUT55:
PUSH DL
LDB DL,LED[AX] ;显示键值
STB DL,P8255A
POP DL
RET
;---------------------------------------------------------
RD_KB:
LDB BL,#0AH ;键盘扫描第一行
STB BL,P8255C[0]
SKIP
SKIP
LDB AL,P8255B[0] ;读键值
XORB AL,#0FFH
JNE AA ;判键是否按下
SJMP BB ;无键转第二行
AA: LCALL DELAY ;延时消抖
LDB AL,P8255B[0] ;读键值
XORB AL,#0FFH
JNE KEYVAL ;计算键值
BB:
LDB BL,#09H ;扫描第二行
STB BL,P8255C[0]
SKIP
SKIP
LDB AL,P8255B[0]
XORB AL,#0FFH
JNE CC
SJMP NOKEY
CC: LCALL DELAY ;延时消抖
LDB AL,P8255B[0] ;读键值
XORB AL,#0FFH
JNE KEYVAL ;计算键值
SJMP NOKEY
KEYVAL: ;计算键码
ANDB BL,#01H
SHL BL,#03H
LDB AH,AL
LDB AL,#0FFH
SHIFT: INCB AL
SHRB AH,#01H
JNC SHIFT
ORB AL,BL
SCALL DELAY
LJMP KEYWAIT
NOKEY: LD AL,#10H ;返回无键标志
LJMP KEYEXIT
KEYWAIT:
LDB BL,P8255B[0] ;等待键释放
XORB BL,#0FFH
JNE KEYWAIT
KEYEXIT:
RET
;---------------------------------------------------------
INIT53:
PUSH DX
PUSH AX
LD DX,#TIM_CTL ;定时器0工作在方式3
LDB AL,#MODE03
STB AL,[DX]
LD DX,#TIMER0 ;计数初值为0010H,16分频
LDB AL,#10H
STB AL,[DX]
LDB AL,#00H
STB AL,[DX]
POP AX
POP DX
RET
;---------------------------------------------------------
INIT55:
PUSH AX
LDB AL,#82H ;PB口输入,PA,PC口输出
STB AL,C8255[0]
LDB AL,#08H ;使PC3置1
STB AL,P8255C[0]
POP AX
RET
;---------------------------------------------------------
INIT51: LDB AL,#4EH ;置 8251 工作方式
STB AL,D8251+2
NOP
NOP
LDB AL,#25H ;请求发送,发送允许,接收允许
STB AL,D8251+2
NOP
NOP
LDB AL,#65H
STB AL,D8251+2
NOP
NOP
LDB AL,#4EH ;置 8251 工作方式
STB AL,D8251+2
NOP
NOP
LDB AL,#25H ;请求发送,发送允许,接收允许
STB AL,D8251+2
NOP
NOP
RET
;---------------------------------------------------------
DELAY: LD DX,#0F00H ;延时子程序
DELAY1: DEC DX
JNE DELAY1
RET
;---------------------------------------------------------
;LED显示常数表
LED 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'
;0-F ASCII码表
ASCII: 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 + -