📄 intead.asm
字号:
;*------------------------------------------------------*/
;* InteAD.asm(查询方式A/D转换器接口实验) */
;* 查询方式A/D转换数据采集程序 Source File */
;* Copyright (c) 2001 by HUST */
;* Modify Date 2005.4.10 */
;*------------------------------------------------------*/
sseg segment para stack 'stack'
dw 200 dup (?)
sseg ends
dseg segment para public 'data'
flag dw(?)
int0a_off dw(?)
int0a_seg dw(?)
message db 'If you want to quit A/D convert,please press ''ESC'''
db 0dh,0ah,'$'
input_message db 'input number of A/D channel'
db 0dh,0ah,'$'
error_message db 'input incorrect A/D channel!',0dh,0ah
db 'please input number of A/D channel again:'
db '$'
temp db (?)
dseg ends
cseg segment para public 'code'
assume ss:sseg,cs:cseg,ds:dseg
a_dir proc far
start: mov ax,sseg
mov ss,ax
mov ax,dseg
mov ds,ax
mov ah,9 ;显示提示信息
mov dx,seg message
mov ds,dx
mov dx,offset message
int 21h
mov ah,9 ;提示输入通道号
mov dx,seg input_message
mov ds,dx
mov dx, offset input_message
int 21h
input: mov ah,8 ;检查输入通道号是否有错
int 21h
cmp al,'0'
jb error
cmp al,'7'
ja error
sub al,30h
mov temp,al ;若无错,则保存通道号
jmp begin
error: mov ah,9 ;显示出错信息
mov dx,seg error_message
mov ds,dx
mov dx, offset error_message
int 21h
jmp input
begin: mov dx,303h ;初始化8255状态字,A口输出
mov al,88h
out dx,al
mov dx,300h ;送通道号至A口
mov al,temp
out dx,al
mov dx,303h
mov al,3h
out dx,al ;PC1置1进行地址锁存
mov ax,3572h ;获取原中断向量
int 21h
mov int0a_off,bx ;保存原中断向量
mov bx,es
mov int0a_seg,bx
cli ;关中断
mov ax,2572h ; 设置新中断向量
mov dx,seg new_int
push ds
mov ds,dx
lea dx, new_int
int 21h
pop ds
sti ;开中断
in al,0a1h ;打开IRQ10(OCW1)
and al,0fbh
out 0a1h,al
in al,021h ;打开IRQ2
and al,0fbh
out 021h,al
mov dx,303h
mov al,98h
out dx,al ;重写8255方式字,A口输入,C口低四位输出,C口高四位输入
next0: mov dx,303h ;使PC0置高发启动信号
mov al,1h
out dx,al
mov cx,0f00h ;delay
lop1: loop lop1
mov dx,303h
mov al,0h
out dx,al
cmp flag,1
jnz check
read: mov dx,303h
mov al,5h
out dx,al
mov dx,300h
in al,dx
push ax
show: and al,0f0h ;显示高4位
shr al,4
cmp al,9
ja hex
add al,30h
jmp next
hex: add al,37h
next: mov dl,al
mov ah,2
int 21H
pop ax
and al,0fh ;显示低4位
cmp al,9
ja hex1
add al,30h
jmp next1
hex1: add al,37h
next1: mov dl,al
mov ah,2
int 21h
mov dl,13 ;向屏幕送回车符
mov ah,2
int 21h
mov dl,10 ;向屏幕送换行符
mov ah,2
int 21h
check: mov ah,0bh ;检测是否有ESC键按下
int 21h
inc al
jnz next0 ;若无键按下,则继续采集
quit: mov ax,2572h ;恢复原中断向量
mov dx,int0a_seg
push ds
mov ds,dx
mov dx,int0a_off
int 21h
pop ds
in al,0a1h ;屏蔽IRQ10
or al,04h
out 0a1h,al
in al,21h ;屏蔽IRQ2
or al,04h
out 21h,al
mov ax,4C00h ;程序退出
int 21h
a_dir endp
new_int proc far ;中断服务程序
cli ;关中断
push ax
mov flag,1
mov al,062h ;发中断结束命令(OCW2)
out 0a0h,al;
mov al,020h
out 020h,al ;向主片8259发EOI命令
pop ax
sti ;开中断
iret
new_int endp
cseg ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -