?? 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 + -