📄 pc8251-1.asm
字号:
DATA51 EQU 208H ;8251A DATA PORT
CTRL51 EQU 209H ;8251A COMMOND PORT
TIMER2 EQU 202H ;8253 COUNT2
TIMCTL EQU 203H ;8253 CTRL PORT
CLK00 EQU 250 ;8251A CLK 250KHZ
BPS00 EQU 1200 ;BPS=1200
FACTOR EQU 16 ;8251A BPS FACTOR=16
DATA SEGMENT
MES1 DB 'NOW YOU CAN PLAY A KEY ON THE CPU_KEYBORD',0AH,0DH
DB 'IT WILL DISPLAY ON THE TERMINAL_SCREEN!!' ,0AH,0DH
DB 'END WITH !',0AH,0DH,0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS :CODE ,DS:DATA
INIT51 PROC NEAR ;INIT 8251A
MOV DX,CTRL51
XOR AX,AX
MOV CX,03
LL: CALL CHAROUT
LOOP LL
MOV AL,40H ;RESET 8251A
CALL CHAROUT
mov al,4eh ;DATA 8 BIT,STOP 1 BIT,FACTOR=16
call charout
MOV AL,27H ;ENABLE INPUT AND OUTPUT
CALL CHAROUT
RET
CHAROUT: ;OUTPUT A BYTE
OUT DX,AL
PUSH CX
MOV CX,02
GG: LOOP GG
POP CX
RET
INIT51 ENDP
SET_BPS PROC NEAR ;T/R CLOCK FROM TIMER2
MOV DX,0
MOV AX,CLK00
MOV BX,1000 ;COUNT2=CLK00*1000/FACTOR/BPS00
MUL BX
MOV BX,BPS00
DIV BX
MOV DX,00
MOV BX,FACTOR
DIV BX
MOV BX,AX
MOV DX,TIMCTL ;TIMER2 IN MODE3
MOV AL,0B6H
OUT DX,AL
MOV DX,TIMER2
MOV AX,BX
OUT DX,AL
MOV AL,AH
OUT DX,AL
RET
SET_BPS ENDP
MAIN PROC FAR
START:
CALL SET_BPS
CALL INIT51
MOV AX,DATA ;DISPLAY MES1
MOV DS,AX
LEA DX,MES1
MOV AH,09
INT 21H
M0:
MOV AH,01 ;INPUT A CHAR FROM CPU_KEYBORD
INT 21H
MOV BL,AL
MOV DX,CTRL51
M1:IN AL,DX ;IF TXRAY=1 IN 8251A?
TEST AL,01
JZ M1
MOV DX,DATA51
MOV AL,BL
INC AL
OUT DX,AL ;CPU OUTPUT THE CHAR TO 8251A
MOV CX,0FH
S51:LOOP S51
NEXT:
MOV DX,CTRL51 ;IF RXRAY=1 IN 8251A?
IN AL ,DX
TEST AL,02
JZ NEXT
MOV DX,DATA51 ;CPU GET A CHAR FROM 8251A
IN AL,DX
MOV DL,AL ;CPU PUT THE CHAR ON THE SCREEN
MOV AH,02
INT 21H
DEC DL
CMP DL,'!' ;CHAR='!' ,END THE PROGRAM
JNZ M0
OVER:
MOV AX,4C00H
INT 21H
MAIN ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -