程序:
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