📄 zh3.asm
字号:
data segment
ioport equ 0c000h-280h
luport equ ioport+29ah ;录音口地址
fangport equ ioport+290h ;放音口地址
ioport1 equ ioport+283h
ioport2 equ ioport+280h
ioport3 equ ioport+28bh
ioport4 equ ioport+288h
data_qu db 60000 dup(?) ;录音数据存放数据区
news_1 db 'Press any key to record:',24h ;录音提示
news_2 db 0dh,0ah,' Playing:',24h ;放音提示
data ends
code segment
assume cs:code,ds:data,es:data
begin: mov ax,data ;初始化
mov ds,ax
mov es,ax
mov dx,offset news_1 ;显示录音提示
mov ah,09h
int 21h
test_1: mov ah,1 ;等待键盘输入
int 16h
jz test_1 ;若不是则循环等待
call lu ;调用录音子程序
mov dx,offset news_2 ;显示放音提示
mov ah,9
int 21h
fy: call fang ;调用放音子程序
mov ax,0c07h
int 21h
cmp al,20h
jz fy
mov ah,4ch ;返回DOS
int 21h
lu proc near ;录音子程序
mov di,offset data_qu ;置数据区首地址为DI
mov cx,60000 ;录60000个数据
cld
xunhuan:mov dx,luport ;启动A/D
out dx,al
call delay ;延时
in al,dx ;从A/D读数据到AL
stosb ;存入数据区,使DI加1
loop xunhuan ;循环
ret ;子程序返回
lu endp
fang proc near ;放音子程序
mov cx,60000 ;放60000个数据
mov si,offset data_qu ;置数据区首地址为SI
cld
fang_yin: mov dx,fangport
lodsb ;从数据区取出数据
sub al,30h
out dx,al ;放音
call delay ;延时
loop fang_yin ;循环
ret ;子程序返回
fang endp
delay proc near ;延时子程序
push dx
mov al,10h ;设8253通道0工作方式0
mov dx,ioport1
out dx,al
mov al,200 ;写入计数器初值200
mov dx,ioport2
out dx,al
mov dx,ioport3 ;设8255的A口为输入
mov al,9bh
out dx,al
mov dx,ioport4 ;从8255的A口输入
delay1: in al,dx
and al,1 ;判断PA0是否为1
jz delay1 ;若PA0不为1,转de_lay
pop dx
ret ;子程序返回
delay endp
code ends
end begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -