要求
运用微机系统串行口知识,进行微机系统串行偶的测试;完成硬件测试环境,编写程序对微机系统的串口进行自发自收外环测试;数据发送从键盘输入,接收数据在屏幕显示。
硬件
实验前,首先要进行串口的连接以实现外环自发自收。
代码
.586
DATA SEGMENT USE16
OLD0B DD ?
FLAG DB 0
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE ,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
CLI ;关中断
CALL I8250 ;辅串口初始化
CALL I8259 ;开发8259辅串口中断
CALL RD0B ;读中断向量
CALL WR0B ;写中断向量
STI ;开中断
SCANT: CMP FLAG ,-1 ;测试是否收到结束字符
JE RETURN ;接收到ESC则结束程序
MOV DX,2FDH ;读取通信线状态寄存器
IN AL,DX ;读取通信状态字
TEST AL,20H ;查询D5位——发送保持寄存器空闲标志位
JZ SCANT ; D5为1则空闲,D5为0则不空,接着跳转继续查询
MOV AH,1
INT 16H
JZ SCANT
MOV AH,0 ;因为进行串性口的自发自收测试,使用BIOS 0号子功能调用 不回显输入
INT 16H
AND AL,7FH ;屏蔽最高位,使用AND指令满足ASCII7位的要求
MOV DX,2F8H
OUT DX,AL
CMP AL,1BH ;判断是否是ESC 结束字符
JNE SCANT
TWAIT: MOV DX,2FDH ;读取通信线状态寄存器
IN AL,DX ;读取通信状态字
TEST AL,40H ;D6位为发送移位寄存器空闲标志位 为1则空闲 测试一帧数据是否发送完成
JZ TWAIT
RETURN:CALL RESET
MOV AH,4CH
RECEIVE PROC ;中断方式进行接收
PUSH AX ;保护现场
PUSH DX
PUSH DS
MOV AX,DATA
MOV DS,AX
MOV DX,2F8H ;接收缓冲寄存器
IN AL,DX ;读取接收缓冲区的内容
AND AL,7FH ;屏蔽最高位
CMP AL,1BH ;判断是否为结束字符
JE NEXT ;相等则跳转next
MOV AH,2 ;调用dos2号子功能
MOV DL,AL
INT 21H ;显示接收到的字符串
JMP EXIT
NEXT: MOV FLAG ,-1 ;将flag置为-1
EXIT: MOV AL,20H
OUT 20H,AL
POP DS
POP DX
POP AX
IRET
RECEIVE ENDP
I8250 PROC
MOV DX,2FBH
MOV AL,80H
OUT DX,AL ;寻址地址为1
MOV DX,2F9H
MOV AL,0
OUT DX,AL ;写除数寄存器高8位
MOV DX,2F8H
MOV AL,60H
OUT DX,AL ;写除数寄存器低8位
MOV DX,2FBH
MOV AL,03H
OUT DX,AL ;写数据帧格式
MOV DX,2F9H
MOV AL,01H
OUT DX,AL ;允许8250内部提出接收中断
MOV DX,2FCH
MOV AL,08H
OUT DX,AL ;8250正常收发并允许送出中断请求
RET
I8250 ENDP
I8259 PROC
IN AL,21H
AND AL,11110111B ;将辅串口置为0
OUT 21H,AL ;写中断命令字
RET
I8259 ENDP
RD0B PROC
MOV AX,350BH
INT 21H
MOV WORD PTR OLD0B ,BX
MOV WORD PTR OLD0B+2 ,ES
RET
RD0B ENDP
WR0B PROC
PUSH DS
MOV AX,CODE
MOV DS,AX
MOV DX,OFFSET RECEIVE
MOV AX,250BH
INT 21H
POP DS
RET
WR0B ENDP
RESET PROC
IN AL,21H
OR AL,00001000B
OUT 21H,AL
MOV AX,250BH
MOV DX, WORD PTR OLD0B
MOV DS, WORD PTR OLD0B+2
INT 21H
RET
RESET ENDP
CODE ENDS
END BEG