为什么我的这个程序只有模电的采样,求大神分析

qq_36715411 2017-05-29 07:55:42
IOY0 EQU 0C400H
IOY1 EQU 0C440H
IOY2 EQU 0C480H
IOY3 EQU 0C4C0H
M8255_A EQU IOY0
M8255_B EQU IOY0+01H*4
M8255_C EQU IOY0+02H*4
M8255_CTL EQU IOY0+03H*4
IO_B EQU IOY1
AD0809 EQU IOY2
M16550_0 EQU IOY3
M16550_1 EQU IOY3+01H*4
M16550_3 EQU IOY3+03H*4
M16550_4 EQU IOY3+04H*4
M16550_5 EQU IOY3+05H*4

DATA SEGMENT
TTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
W1 DB '===========================================================',0DH,0AH,'$'
W2 DB 'Please have a choice: 1.Local & Digital 2.Local & Analog 3.Remote & Digital 4.Remote & Analog',0DH,0AH,'$'
W3 DB '1.Local & Digital',0DH,0AH,'$'
W4 DB '2.Local & Analog',0DH,0AH,'$'
W5 DB '3.Remote & Digital',0DH,0AH,'$'
W6 DB '4.Remote & Analog',0DH,0AH,'$'
DATA ENDS

STACK1 SEGMENT STACK 'STACK'
STT DB 200 DUP(?)
TOP EQU LENGTH STT
STACK1 ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
MAIN PROC FAR
START: MOV AX,STACK1
MOV SS,AX
MOV SP,TOP
MOV AX,DATA
MOV DS,AX

MOV DX,M8255_CTL ;初始化8255,方式0,A口、B口输出,C口低4位输入
MOV AL,81H
OUT DX,AL
CALL DALLY

MOV DX,MY16550_3 ;设置16550线路控制寄存器
MOV AL,80H
OUT DX,AL
CALL DALLY

MOV DX,MY16550_0 ;设置除数寄存器低字节0CH
MOV AL,0CH
OUT DX,AL
CALL DALLY

MOV DX,MY16550_1 ;设置除数寄存器高字节00H
MOV AL,00H
OUT DX,AL
CALL DALLY

MOV DX,MY16550_3 ;设置线路控制寄存器,初始化数据格式
MOV AL,1BH
OUT DX,AL
CALL DALLY

MOV DX,MY16550_4 ;设置MODEM控制寄存器
MOV AL,03H
OUT DX,AL
CALL DALLY

MOV DX,MY16550_1 ;设置中断允许寄存器
MOV AL,00H ;中断不打开
OUT DX,AL
CALL DALLY

M1: MOV DX,OFFSET W1
MOV AH,9
INT 21H
MOV DX,OFFSET W2
MOV AH,9
INT 21H
MOV DX,OFFSET W1
MOV AH,9
INT 21H
CALL SCAN
CALL DALLY
CALL DALLY

MOV AH,1
INT 16H
JZ M1
QUIT: MOV AH,4CH
INT 21H
RET
MAIN ENDP

SCAN PROC NEAR ;键盘扫描子程序
PUSH AX
PUSH DX
PUSH CX
S1: MOV AL,00H
MOV DX,M8255_A
OUT DX,AL

MOV DX,M8255_C
IN AL,DX
AND AL,0FH

CMP AL,0FH
JE S1
MOV CX,16EAH
S2: LOOP S2
IN AL,DX
AND AL,0FH
CMP AL,0FH
JZ S1
MOV AL,0
;MOV CL,0
S3: MOV DX,M8255_A
OUT DX,AL
MOV DX,M8255_C
IN AL,DX
AND AL,0FH

; CALL OUT1
CMP AL,0EH
JE S4
CMP AL,0DH
JE S5
CMP AL,0BH
JE S6
CMP AL,07H
JE S7
S4: MOV AL,01H
MOV DX,OFFSET W3
CALL out1
CALL DALLY
CALL LD
JMP Q1
S5: MOV AL,02H
MOV DX,OFFSET W4
CALL out1
CALL DALLY
CALL LA
JMP Q1
S6: MOV AL,03H
MOV DX,OFFSET W5
CALL out1
CALL DALLY
CALL RD
JMP Q1
S7: MOV AL,04H
MOV DX,OFFSET W6
CALL out1
CALL DALLY
CALL RA
Q1: POP CX
POP DX
POP AX
RET
SCAN ENDP

OUT0 PROC NEAR
MOV AH,9
INT 21H
RET
OUT0 ENDP


LD PROC NEAR ;本地数字采样子程序
PUSH DX
PUSH CX
PUSH BX
PUSH AX
L1: CALL DALLY
MOV DX,IO_B
IN AL,DX
CALL OUT1
MOV AH,1
INT 16H
JZ L1
POP AX
POP BX
POP CX
POP DX
RET
LD ENDP

LA PROC NEAR ;本地模拟采样子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
L2: MOV DX,AD0809 ;启动A/D转换
OUT DX,AL
CALL DALLY
MOV DX,AD0809
IN AL,DX
CALL OUT1
MOV AH,1
INT 16H
JZ L2
POP DX
POP CX
POP BX
POP AX
RET
LA ENDP
RD PROC NEAR ;远程数字采样子程序
PUSH DX
PUSH CX
PUSH BX
PUSH AX
L1: CALL DALLY
MOV DX,IO_B
IN AL,DX
CALL SEND
MOV AH,1
INT 16H
JZ L1
POP AX
POP BX
POP CX
POP DX
RET
RD ENDP


RA PROC NEAR ;远程模拟采样子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
L2: MOV DX,AD0809 ;启动A/D转换
OUT DX,AL
CALL DALLY
MOV DX,AD0809
IN AL,DX
CALL SEND
MOV AH,1
INT 16H
JZ L2
POP DX
POP CX
POP BX
POP AX
RET
RA ENDP

OUT1 PROC NEAR ;本地数码管显示子程序
MOV CH,AL
;AND AL,0F0H
MOV CL,4
SHR AL,CL
MOV BX,OFFSET TTABLE
AND AX,000FH
ADD BX,AX
MOV AL,[BX]
PUSH AX
MOV DX,M8255_A
MOV AL,0FEH ;LED低电平选通
OUT DX,AL
POP AX
MOV DX,M8255_B
OUT DX,AL
CALL DALLY

MOV AL,CH
MOV BX,OFFSET TTABLE
AND AX,000FH
ADD BX,AX
MOV AL,[BX]
PUSH AX
;PUSH DX
MOV DX,M8255_A
MOV AL,0FDH
OUT DX,AL

;POP DX
POP AX
MOV DX,M8255_B
OUT DX,AL
CALL DALLY
RET
OUT1 ENDP

SEND PROC NEAR
MOV CH,AL
AND AL,0F0H
MOV CL,04H
SHR AL,CL
CMP AL,09H
JG A1

ADD AL,30H
JMP A2
A1: ADD AL,37H
A2: MOV DX,MY16550_0
MOV AL,AA
OUT DX,AL
CALL DALLY

MOV AL,CH
AND AL,0FH
CMP AL,09H
JG A3

ADD AL,30H
JMP A4
A3: ADD AL,37H
A4: MOV DX,MY16550_0
MOV AL,AA
OUT DX,AL
CALL DALLY
RET
SEND ENDP

DALLY PROC NEAR ;延时子程序
PUSH CX
PUSH AX
MOV CX,0300H
D1: MOV AX,3000H
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY ENDP

CODE ENDS
END START



II、远程接收端
;############根据CHECK配置##########
INTR_IVADD EQU 01CCH
INTR_OCW1 EQU 0A1H
INTR_OCW2 EQU 0A0H
INTR_IM EQU 0F7H
PCI_INTCSR EQU 9438H
IOY0 EQU 9C00H
;#####################################
MY16550_0 EQU IOY0+00H*4
MY16550_1 EQU IOY0+01H*4
MY16550_3 EQU IOY0+03H*4
MY16550_4 EQU IOY0+04H*4

STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS

DATA SEGMENT
CS_BAK DW ?
IP_BAK DW ?
IM_BAK DB ?
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA
MOV DS,AX
CLI

MOV DX,PCI_INTCSR
SUB DX,19H
IN AL,DX
MOV DX,PCI_INTCSR ;初始化PCI卡中断控制寄存器
MOV AX,1F00H
OUT DX,AX
ADD DX,2
MOV AX,003FH
OUT DX,AX

MOV AX,0000H ;替换INTR的中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,ES:[DI]
MOV IP_BAK,AX
MOV AX,OFFSET MYISR
MOV ES:[DI],AX
ADD DI,2
MOV AX,ES:[DI]
MOV CS_BAK,AX
MOV AX,SEG MYISR
MOV ES:[DI],AX

MOV DX,INTR_OCW1 ;设置中断屏蔽寄存器,打开INTR的屏蔽位
IN AL,DX
MOV IM_BAK,AL
AND AL,INTR_IM
OUT DX,AL

MOV DX,MY16550_3 ;设置16550线路控制寄存器
MOV AL,80H
OUT DX,AL
CALL DALLY

MOV DX,MY16550_0
MOV AL,0CH
OUT DX,AL
CALL DALLY

MOV DX,MY16550_1
MOV AL,00H
OUT DX,AL
CALL DALLY

MOV DX,MY16550_3 ;设置线路控制寄存器,初始化数据格式
MOV AL,1BH
OUT DX,AL
CALL DALLY

MOV DX,MY16550_4 ;设置MODEM控制寄存器
MOV AL,03H
OUT DX,AL
CALL DALLY

MOV DX,MY16550_1 ;设置中断允许寄存器
MOV AL,01H
OUT DX,AL
CALL DALLY

STI
WAIT1: MOV AH,1
INT 16H
JZ WAIT1

QUIT: CLI
MOV DX,PCI_INTCSR
MOV AX,0000H
OUT DX,AX

MOV AX,0000H
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,IP_BAK
MOV ES:[DI],AX
ADD DI,2
MOV AX,CS_BAK
MOV ES:[DI],AX

MOV DX,INTR_OCW1
MOV AL,IM_BAK
OUT DX,AL
STI

MOV AX,4C00H
INT 21H

MYISR PROC NEAR ;中断子程序
MOV DX,MY16550_0
IN AL,DX
MOV DL,AL
MOV AH,02H
INT 21H
MOV DX,MY16550_0
IN AL,DX
MOV DL,AL
MOV AH,02H
INT 21H
MOV DL,0DH ;回车,置光标到行首
MOV AH,02H
INT 21H

OVER: MOV DX,PCI_INTCSR
SUB DX,19H
IN AL,DX
MOV DX,PCI_INTCSR
ADD DX,2
MOV AX,003FH
OUT DX,AX

MOV DX,INTR_OCW2
MOV AL,20H
OUT DX,AL
MOV AL,20H
OUT 20H,AL
IRET
MYISR ENDP

DALLY PROC NEAR ;延时子程序
PUSH CX
PUSH AX
MOV CX,0100H
D1: MOV AX,2000H
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY ENDP

CODE ENDS
END START
...全文
692 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
李伯特 2017-08-19
  • 打赏
  • 举报
回复
LD PROC NEAR ;本地数字采样子程序 开始 近跳转 子程序内部跳转 PUSH DX ;保存上下文 PUSH CX PUSH BX PUSH AX L1: MOV DX,IO_B ;读取IO_B端口地址 OUT DX,AL ;复位端口电平 CALL DALLY ;延时 MOV DX,IO_B ;读取IO_B端口地址 IN AL,DX ;读取端口电平 CALL OUT1 ;输出结果 MOV AH,1 INT 16H ;等待键盘输入一个字符 JZ L1 ;如果没有输入 跳转至L1 继续等待 POP AX ;恢复上下文 POP BX POP CX POP DX RET ;子程序返回 LD ENDP ;本地数字采样子程序 结束 LA PROC NEAR ;本地模拟采样子程序 开始 近跳转 子程序内部跳转 PUSH AX ;保存上下文 PUSH BX PUSH CX PUSH DX L2: MOV DX,AD0809 ;读取与AD0809相连的端口地址 OUT DX,AL ;复位端口电平 CALL DALLY ;延时 等待电路反应 MOV DX,AD0809 ;读取与AD0809相连的端口地址 IN AL,DX ;读取端口电平 CALL OUT1 ;输出结果 MOV AH,1 INT 16H ;等待键盘输入一个字符 JZ L2 ;如果没有输入 跳转至L2 继续等待 POP DX ;恢复上下文 POP CX POP BX POP AX RET ;子程序返回 LA ENDP ;本地模拟采样子程序 结束 RD PROC NEAR ;远程数字采样子程序 开始 近跳转 子程序内部跳转 PUSH DX ;保存上下文 PUSH CX PUSH BX PUSH AX L1: MOV DX,IO_B ;读取IO_B端口地址 OUT DX,AL ;复位端口电平 CALL DALLY ;延时 MOV DX,IO_B ;读取IO_B端口地址 IN AL,DX ;读取端口电平 CALL SEND ;调用子程序SEND 发送数据到远端 MOV AH,1 INT 16H ;等待键盘输入一个字符 JZ L1 ;如果没有输入 跳转至L1 继续等待 POP AX ;恢复上下文 POP BX POP CX POP DX RET ;子程序返回 RD ENDP ;远程数字采样子程序 结束 RA PROC NEAR ;远程模拟采样子程序 开始 近跳转 子程序内部跳转 PUSH AX ;保存上下文 PUSH BX PUSH CX PUSH DX L2: MOV DX,AD0809 ;读取与AD0809相连的端口地址 OUT DX,AL ;复位端口电平 CALL DALLY ;延时 MOV DX,AD0809 ;读取与AD0809相连的端口地址 IN AL,DX ;读取端口电平 CALL SEND ;调用子程序SEND 发送数据到远端 MOV AH,1 INT 16H ;等待键盘输入一个字符 JZ L2 ;如果没有输入 跳转至L2 继续等待 POP DX ;恢复上下文 POP CX POP BX POP AX RET ;子程序返回 RA ENDP ;远程模拟采样子程序 结束
李伯特 2017-08-19
  • 打赏
  • 举报
回复
把你的电路图发过来

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧