📄 rece2.asm
字号:
;***********************************************************************************;
; 本程序负责接收 两路数字信号 并分别在指示灯和LED上显示 并将两路信号分别返回 ;
; cs0<->cs273,D0~D7依次接LED1~LED8*;
; 模数转换,前端数码管显示,后端在屏幕上显示 ;
;1: allowio 0xdc80 0xdc82 0xdc84 0xdc86 0xdc88 0xdc8A 0xdc8C 0xdc90 0xdc92 0xdcA0
;2: receive23.exe
;***********************************************************************************;
;------数据段---------------------
DATA SEGMENT
IOPORT EQU 0DC00H
DAT8279 EQU IOPORT+090H ;8279
CON8279 EQU IOPORT+092H
LS273 EQU IOPORT+0A0H ;273
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
;---------8279初始化--------------------
MOV DI,OFFSET LED
MOV AX,08H ;work mode 16bit ,left in
START1: MOV DX,CON8279
OUT DX,AX
CALL BLACK
MOV BX,80H ;set the fisrt led
DISP: MOV AX,BX
MOV DX,CON8279 ;write command of display ram,address inc
OUT DX,AX
MOV DX,DAT8279
CALL RECVE ;接收到的开关量存入AX
CALL DISP0
PUSH AX
CALL RECVE ;接收到的模拟数字量存入AX
CALL DISP0
MOV CX,AX ;将接收到的模拟信号数字量输出到LED,此时模拟数字量已存入CX
PUSH CX
AND AX,0F0H
MOV CL,4
SAR AX,CL
POP CX
MOV DI,AX
MOV AX,DS:[DI]
MOV DX,DAT8279
OUT DX,AX
CALL ADDRESS_INC
MOV AX,CX
AND AX,0FH
MOV DI,AX
MOV AX,DS:[DI]
OUT DX,AX
POP AX ;将接收到的开关量输出到指示灯
PUSH CX
MOV DX,LS273 ;从2A8H输出其ASCII码
OUT DX,AL
CALL DELAY ;调用延时子程序
CALL SEND ;将数字量发送
CALL DELAY
POP CX ;将模拟数字量弹出,准备发送
MOV AX,CX
CALL SEND ;将模拟量发送
MOV AH,06H ;判断是否有键按下
MOV DL,0FFH
INT 21H
JE START1
; JMP START1
EXIT: MOV AX,4C00H
INT 21H
;-----------输出子程序--------------
DISP0 PROC
PUSH BX
PUSH CX
MOV BX,AX
MOV CL,4
SHR AL,CL
CMP AL,9
JLE DISP1
ADD AL,37H
MOV DL,AL
MOV AH,02H
INT 21H
JMP JS
DISP1: ADD AL,30H
MOV AH,02H
MOV DL,AL
INT 21H
JS: 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
;----负责将8279RAM清零-------------------------------
BLACK PROC
B1: MOV DX,CON8279
MOV AX,0D1H
OUT DX,AX ;显示RAM全部清零
WAITE2: IN AL,DX
AND AL,80H
JNZ WAITE2 ;waite for clear command
RET
BLACK ENDP
;----------负责数码管地址修改----------
ADDRESS_INC PROC
PUSH AX
PUSH DX
INC BX
MOV AX,BX
MOV DX,CON8279 ;write command of display ram,address inc
OUT DX,AX
POP DX
POP AX
RET
ADDRESS_INC 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,0500H
DELAY1:
MOV CX,50000
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 + -