📄 pc8251.asm
字号:
;FILENAME: PC8251.asm
;内容:8251串行通信
DATA SEGMENT
TEXT DB 'THE QUICK BROWN FOX JUMPS OVER LAZY DOG', 0DH, 0AH
LENS EQU $-TEXT
ERROR DB 0DH,0AH,'8251 BAD ! $ '
OLD0A DD ?
C_8251 EQU 211H ;8251控制口地址
D_8251 EQU 210H ;8251数据口地址
C_8253 EQU 20BH ;8253控制口地址
D_8253 EQU 20AH ;8253_2号计数器口地址
DATA ENDS
CODE SEGMENT
FLAG DB ?
ASSUME CS: CODE, DS: DATA
BEG: MOV AX, DATA
MOV DS, AX
CLI
CALL I8253 ;8253初始化
CALL I8251 ;8251初始化
CALL I8259 ;开放用户中断
CALL RW0A ;置换0AH型中断向量
STI
LAST1: MOV BX, OFFSET TEXT
MOV CX,LENS ;电文长度→CX
TSCAN: MOV AH, 1
INT 16H ;有键入?
JNZ RETURN ;有,转恢复0AH中断向量
MOV DX,C_8251
IN AL,DX ;8251状态字→AL
TEST AL,01H ;TXRDY位=1 ?
JZ TSCAN ;否,转键盘输入检测
MOV DX, D_8251
MOV AL, [BX] ;取字符→A
OUT DX,AL ;发送数据
MOV CS: FLAG, 0 ;接收标志置0
MOV SI,100 ;设置外循环计数次数
LLL: MOV DI,0 ;设置内循环计数次数
LAST2: CMP CS: FLAG, -1 ;收到?
JE NEXT ;是,转电文记数
DEC DI ;内循环计数
JNZ LAST2
DEC SI ;外循环计数
JNZ LLL
JMP ERR ;超时,转出错处理
NEXT: INC BX
LOOP TSCAN ;电文计数
JMP LAST1
ERR: MOV AH, 9
MOV DX, OFFSET ERROR
INT 21H ;显示错误信息
RETURN:
CALL RESET ;恢复0AH型中断向量
MOV AH, 4CH
INT 21H
RECEIVE PROC
PUSH AX ;保护现场
PUSH DX ;保护现场
MOV DX,D_8251 ;从数据口
IN AL,DX ;读取数据→AL
MOV AH,0EH
INT 10H ;AL→屏幕显示
MOV AL,20H ;中断结束命令
OUT 20H,AL ;送主8259
MOV CS:FLAG, -1 ;设置接收标志
POP DX ;恢复现场
POP AX ;恢复现场
IRET ;中断返回
RECEIVE ENDP
I8253 PROC ;2号计数器初始化
MOV DX,C_8253
MOV AL,96H ;控制字
OUT DX,AL ;送控制寄存器
MOV DX, D_8253
MOV AL,104 ;计数初值104
OUT DX,AL ;波特率1200
RET
I8253 ENDP
I8251 PROC ;8251初始化
MOV CX, 3
MOV AL, 0
MOV DX,C_8251
AGA: OUT DX,AL ;向控制口写入3个0
LOOP AGA
MOV AL,40H
OUT DX,AL ;写入复位命令字
CALL DELAY ;延时
MOV DX, C_8251
MOV AL,01001110B ;写入方式选择命令字
OUT DX,AL ;选择波特率系数为16
MOV AL, 00010101B
OUT DX,AL ;写入工作命令字
RET
I8251 ENDP
DELAY PROC ;延时10us
MOV AH, 86H
MOV CX, 0
MOV DX, 10
INT 15H
RET
DELAY ENDP
I8259 PROC
IN AL,21H
AND AL, 11111011B
OUT 21H,AL ;开放从8259中断
IN AL, 0A1H
AND AL,11111101B
OUT 0A1H,AL ;开放用户中断
RET
I8259 ENDP
RW0A PROC ;置换0AH型中断向量
MOV AX,350AH
INT 21H
MOV WORD PTR OLD0A, BX
MOV WORD PTR OLD0A + 2, ES
PUSH DS
MOV AX, CODE
MOV DS, AX
MOV DX, OFFSET RECEIVE
MOV AX,250AH
INT 21H
POP DS
RET
RW0A ENDP
RESET PROC ;恢复0AH型中断向量
MOV DX, WORD PTR OLD0A
MOV DS, WORD PTR OLD0A + 2
MOV AX,250AH
INT 21H
RET
RESET ENDP
CODE ENDS
END BEG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -