📄 16c550.asm
字号:
NAME TL16C550
RHR XDATA 0F300H; //接收数据缓冲区
THR XDATA 0F300H; //发送数据缓冲区
IER XDATA 0F301H; //中断控制寄存器
FCR XDATA 0F302H; //FIFO控制寄存器
ISR XDATA 0F302H; //
LCR XDATA 0F303H; //串行口控制寄存器
MCR XDATA 0F304H; //MODEM控制寄存器
LSR XDATA 0F305H; //串行口状态寄存器
DLL XDATA 0F300H; //波特率除数锁存器低位
DLM XDATA 0F301H; //波特率除数锁存器高位
PUBLIC START_8250
EXTRN CODE(ALARM)
TL8250_CODE SEGMENT CODE
RSEG TL8250_CODE
;自发自收测试,需要短接CZ2的2、3脚
START_8250:
ACALL INIT8250
MOV R5,#6 ;发送6个数
MOV DPTR,#TDATA_TAB ;发送的数在表中
SEND_NEXT:
CLR A
MOVC A,@A+DPTR
INC DPTR
ACALL SEND_BYTE
JC WARNING1
ACALL RECEIVE_B
JC WARNING1
CJNE A,02H,WARNING1
DJNZ R5,SEND_NEXT
CLR C ;正确返回0
RET
WARNING1:
SETB C ;错误返回1
RET
TDATA_TAB:
DB 55H,0AAH,01H,80H,0FFH,00H
;发送一个字节子程序,发送A中的数,失败置1CY
SEND_BYTE:
PUSH DPL
PUSH DPH
MOV R2,A ;SAVE A
ACALL READ_LSR
MOV R6,#0
MOV R7,#10
REP11:ACALL READ_LSR
JB ACC.5,OUTPORT1
DJNZ R6,REP11
DJNZ R7,REP11
SETB C
SJMP EXIT8250
OUTPORT1:
MOV A,R2
MOV DPTR,#RHR
MOVX @DPTR,A
EXIT8250:
POP DPH
POP DPL
CLR C
RET
;***********
;接收一个字节子程序,接收字节在A中,接收失败置1CY
RECEIVE_B:
PUSH DPL
PUSH DPH
MOV R6,#0
MOV R7,#10
REP12:
MOV DPTR,#LSR
MOVX A,@DPTR
JB ACC.0,INPORT1
DJNZ R6,REP12
DJNZ R7,REP12
SETB C
POP DPH
POP DPL
RET
INPORT1:
MOV DPTR,#RHR
MOVX A,@DPTR
CLR C
POP DPH
POP DPL
RET
;***********
READ_LSR:
MOV DPTR,#LSR
MOVX A,@DPTR
RET
INIT8250:
MOV DPTR,#ISR
MOV A,#06H
MOVX @DPTR,A
MOV DPTR,#LCR
MOV A,#83H ;通讯控制寄存器,使DLAB=1,允许访问波特率因子寄存器
MOVX @DPTR,A
MOV DPTR,#DLL
MOV A,#010 ;//除数低位寄存器,波特率设为19200
MOVX @DPTR,A
MOV DPTR,#DLM
MOV A,#00H ;//00H送高字节寄存器,见16C550手册
MOVX @DPTR,A
MOV DPTR,#LCR
MOV A,#1BH ;//使DLAB=0,不允许访问波特率因子寄存器,数据格式为8数据位,1停止位,无奇偶验校
MOVX @DPTR,A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -