📄 rece3.asm
字号:
;***********************************************************************************;
; 本程序负责接收 两路数字信号 并分别在指示灯和LED上显示 并将两路信号分别返回 ;
; cs0<->cs273,D0~D7依次接LED1~LED8*;
; 模数转换,前端数码管显示,后端在屏幕上显示 ;
;1: allowio 0xdc80 0xdc82 0xdc84 0xdc86 0xdc88 0xdc8A 0xdc8C 0xdc90 0xdc92 0xdcA0 0xdcb0 0xdcb2
;2: receive23.exe
;***********************************************************************************;
;------数据段---------------------
DATA SEGMENT
IOPORT EQU 0DC00H
DAT8279 EQU IOPORT+090H ;8279
CON8279 EQU IOPORT+092H
LS273 EQU IOPORT+0A0H ;273
IO0832L EQU IOPORT+0B0H ;LATCH DATA ADDRESS
IO0832S EQU IOPORT+0B2H ;START TRANSLATE ADDRESS
ADDR1 EQU IOPORT+80H ;8250
ADDR2 EQU IOPORT+82H ;interrupt enable register/ LOW BYTE OF DIVI
INTFR EQU IOPORT+84H ;interrupt flag register
LCR EQU IOPORT+86H ;line control register
MCR EQU IOPORT+88H ;modem control register
LSR EQU IOPORT+8AH ;line status register
MSR EQU IOPORT+8CH ;modem status register
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H,0FFH
DATA ENDS
;---------代码段-----------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV DX,LCR
MOV AX,80H
OUT DX,AX ;SET THE DLAB,ACCESS THE DIVI REGISTER
MOV DX,ADDR1
MOV AX,0CH
OUT DX,AX ;9600,SET divisor gene
MOV DX,ADDR2
MOV AX,0H
OUT DX,AX ;no interupt
MOV DX,LCR
MOV AX,07H ;no pe,8 bit, 1 stop
OUT DX,AX
MOV DX,ADDR2
MOV AX,0
OUT DX,AX ;no interupt
MOV DX,MCR
MOV AX,03H
OUT DX,AX ;双机通讯
MOV DX,LSR
IN AX,DX
MOV DX,ADDR1
IN AX,DX
MOV AX,0012H ;设屏幕显示方式为VGA 640X480模示///////
INT 10H ;////////////////////////
START1:
MOV AX,0600H
INT 10H ;清屏
AND CX,0 ;cx为横坐标
PUSH CX
AGAINX:
MOV DX,400
MOV AL,07H
MOV AH,0CH ;画点
INT 10H
CMP CX,639 ;一行是否满
JE START2 ;是则转start1
INC CX ;继续画点
JMP AGAINX
START2:;CALL DELAY
MOV DX,0
AGAINY: MOV CX,0
MOV AL,07H
MOV AH,0CH
INT 10H
INC DX
CMP DX,400
JE START3
JMP AGAINY
START3:
;CALL DELAY
POP CX
DRAW: CALL RECVE ;接收到的开关量存入AX
CALL DISP0
PUSH AX
CALL RECVE ;接收到的模拟数字量存入AX
CALL DISP3
MOV BL,AL
POP AX ;将接收到的开关量输出到指示灯
MOV DX,LS273 ;从2A8H输出其ASCII码
OUT DX,AL
neg ax ;将接收到的数字量取反,准备发送
dec ax
call DISP4
CALL SEND ;将数字量发送
MOV AL,BL
CALL SEND ;将模拟量发送
AND AH,0
MOV DX,400 ;dx为纵坐标
SUB DX,AX
MOV AL,05H ;设置颜色
MOV AH,0CH ;画点
INT 10H
CALL DELAY
CMP CX,639 ;一行是否满
JZ START1 ;是则转start1
INC CX ;继续画点
PUSH DX
MOV AH,06H ;是否有键按下
MOV DL,0FFH
INT 21H
POP DX
JE DRAW ;无,则继续画点
MOV AX,0003 ;有恢复屏幕为字符方式
INT 10H
EXIT: MOV AX,4C00H
INT 21H
;-----------输出子程序--------------
DISP0 PROC
PUSH BX
PUSH CX
PUSH AX
MOV DX,0128H ;设定光标位置和显示方式
MOV AH,02H
INT 10H
POP AX
MOV BX,AX ;输出AX中的量到屏幕
MOV CL,4
SHR AL,CL
CMP AL,9
JLE DISP1
ADD AL,37H
MOV DL,AL
MOV AH,02H
INT 21H
JMP JS0
DISP1: ADD AL,30H
MOV AH,02H
MOV DL,AL
INT 21H
JS0: MOV AX,BX
AND AL,0FH
CMP AL,9
JLE DISP2
ADD AL,37H
MOV AH,02H
MOV DL,AL
INT 21H
JMP JS1
DISP2: ADD AL,30H
MOV AH,02H
MOV DL,AL
INT 21H
JS1: MOV AX,BX
POP CX
POP BX
RET
DISP0 ENDP
;-----------输出子程序--------------
DISP3 PROC
PUSH BX
PUSH CX
PUSH AX
MOV DX,0228H ;设定光标位置
MOV AH,02H
INT 10H
POP AX
MOV BX,AX ;输出AX中接收到的数据到屏幕
MOV CL,4
SHR AL,CL
CMP AL,9
JLE DISP13
ADD AL,37H
MOV DL,AL
MOV AH,02H
INT 21H
JMP JS3
DISP13: ADD AL,30H
MOV AH,02H
MOV DL,AL
INT 21H
JS3: MOV AX,BX
AND AL,0FH
CMP AL,9
JLE DISP23
ADD AL,37H
MOV AH,02H
MOV DL,AL
INT 21H
JMP JS13
DISP23: ADD AL,30H
MOV AH,02H
MOV DL,AL
INT 21H
JS13: MOV AX,BX
POP CX
POP BX
RET
DISP3 ENDP
;----------------显示子程序---------------------
DISP4 PROC
PUSH BX
PUSH CX
PUSH AX
MOV DX,0328H
MOV AH,02H
INT 10H
POP AX
MOV BX,AX
MOV CL,4
SHR AL,CL
CMP AL,9
JLE DISP14
ADD AL,37H
MOV DL,AL
MOV AH,02H
INT 21H
JMP JS04
DISP14: ADD AL,30H
MOV AH,02H
MOV DL,AL
INT 21H
JS04: MOV AX,BX
AND AL,0FH
CMP AL,9
JLE DISP24
ADD AL,37H
MOV AH,02H
MOV DL,AL
INT 21H
JMP JS14
DISP24: ADD AL,30H
MOV AH,02H
MOV DL,AL
INT 21H
JS14: MOV AX,BX
POP CX
POP BX
RET
DISP4 ENDP
;-----------发送子程序-----------------------------
SEND PROC
PUSH BX
MOV BX,AX ;将待发送值存到BX中
PUSH AX
PUSH DX
SEND1: MOV DX,LSR
IN AX,DX
TEST AX,20H
JNZ SEND2
JMP SEND1
SEND2: MOV AL,BL
MOV DX,ADDR1
OUT DX,AL
POP DX
POP AX
POP BX
RET
SEND ENDP
;--------接收子程序--------------------------
RECVE PROC
MOV DX,LSR
IN AX,DX
TEST AX,01H ;TEST THE FLAG OF RECIEVE
JNZ RECV1
JMP RECVE
RECV1: MOV DX,ADDR1
IN AL,DX
RET
RECVE ENDP
;-------延时----------------------------------
DELAY PROC NEAR
;PUSH AX
PUSH CX
;MOV AX,50H
DELAY1: MOV CX,60000
LOOP1: LOOP LOOP1
;DEC AX
;JNZ DELAY1
POP CX
;POP AX
RET
DELAY ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -