📄 16c550.asm
字号:
RBR_16C550 EQU 8200H ;接收缓冲寄存器(READ ONLY) (DLAB=0)
THR_16C550 EQU 8200H ;发送缓冲寄存器(WRITER ONLY)(DLAB=0)
IER_16C550 EQU 8201H ;中断使能寄存器(DLAB=0)
IIR_16C550 EQU 8202H ;中断识别寄存器(READ ONLY)
LCR_16C550 EQU 8203H ;线控制寄存器
LSR_16C550 EQU 8205h ;线状态寄存器
MSB_16C550 EQU 8201H ;除数锁存器 (DLAB=1)
LSB_16C550 EQU 8200H ;除数锁存器 (DLAB=1)
FCR_16C550 EQU 8202H ;FIFO控制寄存器(WRITE ONLY)
BTEMT BIT ACC^6
BRBR BIT ACC^0
ORG 0000H
MOV DPTR,#LCR_16C550 ;除数锁定允许
MOV A,#83H
MOVX @DPTR, A
MOV DPTR,#LSB_16C550 ;波特率为9600baud
MOV A,#0cH
MOVX @DPTR, A
INC DPTR
CLR A
MOVX @DPTR, A
NOP
NOP
MOV DPTR,#FCR_16C550 ;使能FIFO
MOV A,#01H
MOVX @DPTR, A
NOP
NOP
MOV DPTR,#LCR_16C550 ;除数锁定禁止
MOV A,#03H ;8位数据位,一位停止位,无奇偶校验,DLAB=0;
MOVX @DPTR, A
NOP
MOV R0,#30H
MOV R6,#06H
lJMP LOOP1 ;跳到循环发送
;LJMP LOOP2 ;跳到循环接收
LOOP1:
MOV DPTR,#THR_16C550
MOV A,#066H
MOVX @DPTR, A
MOV DPTR,#LSR_16C550
WAITT:
MOVX A,@DPTR
JNB BTEMT,WAITT ;判断TEMT位是否为1
LCALL DL1S
AJMP loop1
;--------------------------------------------------------
LOOP2:
MOV DPTR,#LSR_16C550
WAITR:
MOVX A,@DPTR
JNB BRBR,WAITR ;判断RBR位是否为1
MOV DPTR,#RBR_16C550
MOVX A,@DPTR ;读取RBR寄存器即是接收到的数据
MOV @R0,A
INC R0
DJNZ R6,LOOP2
LCALL DL1S
AJMP $
;--------------------------------------------------------
;******************
; 延时程序 ;
;******************
DL1MS: MOV R3, #0F9H ;延时 1250US 只为DISPLY所调用
DL1MS1: NOP
NOP
NOP
DJNZ R3, DL1MS1
RET
DL50MS: MOV R7, #0AH ;50毫秒延时程序
DL50M1: DJNZ R7, DL50M1 ; 调用10次
RET
DL100: ACALL DL50MS ;延时100毫秒
ACALL DL50MS
RET
;
DL05S: ACALL DL100 ; 延时0.5秒
ACALL DL100
ACALL DL100
ACALL DL100
ACALL DL100
RET
;
DL1S: ACALL DL05S ;延时1秒
ACALL DL05S
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -