📄 8251re.asm
字号:
;从键盘输入数据在LED上显示
DATAIN BIT P1.0
DCLK BIT P1.1
D8251 XDATA 8000H ;数据口
S8251 XDATA 8001H ;状态口
A8253 XDATA 9000H
B8253 XDATA 9001H
C8253 XDATA 9002H
D8253 XDATA 9003H
ORG 0000H
AJMP START
ORG 0030H
START: MOV SP,#50H
MOV DPTR,#D8253
MOV A,#00110110B ;定时器0,先读写低字节后高字节,方式3,二进制计数
MOVX @DPTR,A
MOV DPTR,#A8253
MOV A,#2FH ;002FH,输入时钟为3.686MHZ,输出为76.8KHZ
MOVX @DPTR,A ;初值=(3686K/76.8K)
CLR A
MOVX @DPTR,A
MOV DPTR,#S8251
MOV A,#01001110B ;异步1个停止位,无奇偶校验,8位字符,波特率为=发送(接收)时钟/16
MOVX @DPTR,A
MOV A,#00110111B ;不搜索,不内复位,请求发送,错误标志复位
MOVX @DPTR,A ;正常通信,允许接收,数据准备好,允许发送
AGAIN: MOV DPTR,#S8251
WAIT: MOVX A,@DPTR
ANL A,#02H ;判断接收是否准备好
JZ WAIT
MOV DPTR,#D8251
MOVX A,@DPTR
CALL DISP
NOP
AJMP AGAIN
DISP: CJNE A,#40H,DISP1
DISP1: JNC ZF ;判断是字母还是数字
CLR C
SUBB A,#30H
AJMP DISP3
ZF: CLR C
SUBB A,#37H
DISP3: MOV DPTR,#SGTB1
MOVC A,@A+DPTR ;取字符
MOV R1,A
CALL SEND ;发送字符
MOV A,R1
CALL SEND
CALL DELAY
CALL DELAY
CALL DELAY
RET
;*****************************************************************************
; /*发送子程序*/
;*****************************************************************************
SEND: MOV R0,#8 ;发送8位
SEND1: CLR DCLK
RLC A
MOV DATAIN,C
SETB DCLK
NOP
DJNZ R0,SEND1
SETB DATAIN
RET
;*****************************************************************************
; /*延时子程序*/
;*****************************************************************************
DELAY: MOV R6,#250 ;延时
DELAY1: MOV R7,#250
DJNZ R7,$
DJNZ R6,DELAY1
RET
;*****************************************************************************
; /*字符编码*/
;*****************************************************************************
SGTB1: DB 0C0H ;0
DB 0F9H ;1
DB 0A4H ;2
DB 0B0H ;3
DB 99H ;4
DB 92H ;5
DB 82H ;6
DB 0F8H ;7
DB 80H ;8
DB 90H ;9
DB 88H ;A
DB 83H ;B
DB 0C6H ;C
DB 0A1H ;D
DB 86H ;E
DB 8EH ;F
DB 00H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -