📄 ad.asm
字号:
DATA SEGMENT
PORTAD EQU 280H ;ADC0809端口
SAVE_0B DW 2 DUP(?) ;原中断向量
SAVE_INTR DB ? ;保存原有屏蔽标志位
DATA ENDS
STACKS SEGMENT STACK 'STACK'
DB 256 DUP(?)
STACKS ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKS
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
MOV ES,AX
CLI ;关中断
PUSH ES ;保护原中断
MOV AX,350BH
INT 21H
MOV SAVE_0B,BX
MOV SAVE_0B+2,ES
POP ES
PUSH DS ;设置新中断
MOV DX,OFFSET CLINT
MOV BX,SEG CLINT
MOV DS,BX
MOV AX,250BH
INT 21H
POP DS
IN AL,21H ;写中断屏蔽寄存器
MOV SAVE_INTR,AL
AND AL,11110111B
OUT 21H,AL
STI ;开中断
L0: MOV DX,PORTAD ;启动AD转换
MOV AL,0
OUT DX,AL
HLT
CALL DELAY ;延时
CALL DELAY
CALL DELAY
CALL DELAY
MOV AH,1 ;有按键则关中断
INT 16H
JNZ EXIT
JMP L0 ;循环执行
EXIT:CLI ;关中断
PUSH DS ;恢复原中断
push dx
MOV DX,SAVE_0B
MOV BX,SAVE_0B+2
MOV DS,BX
MOV AX,250BH
INT 21H
pop dx
POP DS
MOV AL,SAVE_INTR ;恢复原中断屏蔽标志位
OUT 21H,AL
MOV AH,4CH
INT 21H
MAIN ENDP
DELAY PROC NEAR ;延时子程序
PUSH CX
MOV CX,0FFFFH
L2:LOOP L2
POP CX
RET
DELAY ENDP
CLINT PROC FAR ;中断服务子程序
MOV DX,PORTAD ;读AD端口
IN AL,DX
MOV BL,AL
MOV CL,4
SHR AL,CL ;读高字节
CMP AL,9 ;转换成16进制数
JLE S1
ADD AL,7
S1: ADD AL,30H
mov dl,al ;显示高字节
mov ah,2
int 21h
MOV AL,BL
AND AL,0FH ;读低字节
CMP AL,9 ;转换成16进制数
JLE S0
ADD AL,7
S0: ADD AL,30H
mov dl,al
mov ah,2 ;显示低字节
int 21h
mov dl,20h
mov ah,2
int 21h
MOV AL,20H ;EOC
OUT 20H,AL
IRET
CLINT ENDP
CODE ENDS
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -