程序:
D8251 EQU 460H ;2号机改为464H
Z8251 EQU 462H ;2号机改为466H
DATA SEGMENT
MESS DB '按下!后返回DOS.',0DH,0AH,'$'
DATA ENDS
STACK SEGMENT
STA DW 32DUP(?)
TOP DW ?
STACK ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
NOP ;INIT 8251 START
LEA DX,MESS
MOV AH,09H
INT 21H
MOV CX,100
LOOP $
MOV DX,Z8251 ;送00
MOV AL,00H
OUT DX,AL
MOV CX,100
LOOP $
MOV DX,Z8251 ;送00
MOV AL,00H
OUT DX,AL
MOV CX,100
LOOP $
MOV DX,Z8251 ;送00
MOV AL,00H
OUT DX,AL
MOV CX,100
LOOP $
MOV DX,Z8251 ;初始化8251
MOV AL,40H
OUT DX,AL
MOV CX,100
LOOP $
MOV AL,0CEH ;设置为8个数据位,两个停止位波特率因子为16
OUT DX,AL ;无奇偶校验位
MOV CX,100
LOOP $
MOV AL,25H ;设为请求发送,允许发送,允许接收状态
OUT DX,AL
MOV CX,100
LOOP $
NOP ;INIT 8251 END
REC: MOV DX,Z8251
MOV AH,02H
WAIT9: IN AL,DX ;有数据送到吗?
AND AL,AH
JZ SEND ;没有数据送到则跳转至发送
MOV DX,D8251 ;有数据送到则从数据缓冲区读入
IN AL,DX
MOV DL,AL
MOV AH,02H ;显示在屏幕上
INT 21H
CMP AL,'!'
JE ED ;接收到结束符则返回DOS
JMP REC ;不是结束符则继续接收
ED: MOV AX,4C00H
INT 21H
SEND: MOV CX,10
LOOP $
MOV DX,Z8251
MOV AH,01H
WAIT8: IN AL,DX
AND AL,AH
JZ WAIT8 ;发送缓冲器不空则等待
MOV DL,0FFH
MOV AH,06H
INT 21H
JZ REC ;无键按下则跳回"接收"处
MOV DX,D8251 ;有键按下则发送相应字符
OUT DX,AL
CMP AL,'!' ;是结束字符则返回DOS
JE ED1
JMP REC ;不是结束字符则跳回"接收"处
ED1: MOV AX,4C00H
INT 21H
MAIN ENDP
CODE ENDS
END START