按键说明:
1、不输入任何数字,直接按回车键,可结束程序,返回 *** 作系统
2、每次最多能够输入N(本程序,N=8)个数字(1~8)
3、不足8位数字的,按回车结束输入
本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
CR EQU 000DH
LF EQU 000AH
-------------------------------------
功能:显示指定地址(Str_Addr)的字符串
入口:
Str_Addr=字符串地址(要求在数据段)
用法: Output Str_Addr
用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
-------------------------------------
功能:输出一个字符
入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
-------------------------------------
功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
-------------------------------------
Subroutine 延时指定的时钟嘀嗒数
入口:
Didas=时钟嘀嗒数(1秒钟约嘀嗒18.2次,10秒钟嘀嗒182次。若延时不是秒的10数次倍,误差稍微大点)
Delay Proc Near
push dx
push cx
xor ax,ax
int 1ah
mov Times,dx
mov Times[2],cx
Read_Time: xor ax,ax
int 1ah
sub dx,Times
sbb cx,Times[2]
cmp dx,Didas
jb Read_Time
pop cx
pop dx
ret
Times dw 0,0
Delay EndP
-----------------------------------------
功能:从键盘输入N位数字
入口:N=数字位数;di=保存输入的数字首地址
出口:cx=实际接收的数字位数
Input_Digit Proc Near
cld
mov cx,N
@@Input: mov ah,1
int 21h
cmp al,CR
jz @@Return
cmp al,'1'
jb @@Input
cmp al,'8'
ja @@Input
stosb
loop @@Input
@@Return: mov ax,N
sub ax,cx
xchg ax,cx
ret
Input_Digit EndP
-----------------------------------------
入口参数
SI=声音频率地址
CX=时间
Music Proc Near
in al,61h
push ax
or al,3
out 61h,al 接通扬声器
push cx
push dx
push si
mov al,0b6h
out 43h,al
mov dx,12h
mov ax,348ch
div word ptr [si]
out 42h,al
mov al,ah
out 42h,al
in al,61h
mov ah,al
or al,3
out 61h,al
mov cx,3314
push ax
@@Waitf1: in al,61h
and al,10h
cmp al,ah
jz @@Waitf1
mov ah,al
loop @@Waitf1
pop ax
call Delay 延时
mov al,ah
out 61h,al 关闭扬声器
pop si
pop dx
pop cx
pop ax
out 61h,al
ret
Music EndP
-----------------------------------------
Didas equ 18 延时(时钟嘀嗒次数)
frequency dw 262,294,330,349,392,440,492,524 频率值
dw 441,495,556,589,661,742,833 从其它音乐程序抄来的频率值
dw 882,990,1112,1178,1322,1484,1655 同上行
N equ 8
PromptStr db 'Please Enter ',N or 30h,' digitals(1-8): $'
Number db N dup(?)
Press_Key dbCR,LF,CR,LF,'Press any key to exit...$'
-----------------------------------------
Start:push cs
pop ds
push cs
pop es 使数据段、附加段与代码段同段
Input_Str: Output PromptStr 提示输入N位数字
lea di,Number 数字保存地址
call Input_Digit 从键盘接收数字
call Output_CTLF 输出一个回车、换行
call Output_CTLF 输出一个回车、换行
jcxz Exit_Proc
lea bx,Number 数字保存地址
Sound: push cx
push bx
mov dl,[bx] 读入一个数字
call Output_Chr 屏幕显示这个数字
and dl,0fh
dec dl
shl dl,1
mov bl,dl
mov dl,0eh
call Output_Chr 显示一个音乐符号
mov dl,20h
call Output_Chr 显示一个空格
lea si,frequency[bx] 对应的频率值地址
call Music 激活扬声器,使之发出指定频率、指定时长的声音
pop bx
inc bx 增1,处理下一个音符
pop cx
loop Sound
call Output_CTLF 输出一个回车、换行
call Output_CTLF 输出一个回车、换行
jmp Input_Str
-------------------------------------
Exit_Proc: Output Press_Key 提示 *** 作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch 结束程序
int 21h
Score_Table: 学生成绩存储区
Code ENDS
END Start 编译到此结束
如果是蜂鸣器的话,那么加一个电平信号就可以发声了。\x0d\x0aFMQ EQU P1.0\x0d\x0aORG 0000H\x0d\x0aLJMP MAIN\x0d\x0aORG 0030H\x0d\x0aMAIN:\x0d\x0aCPL FMQ\x0d\x0aLCALL DELAY\x0d\x0aSJMP MAIN\x0d\x0aDELAY:\x0d\x0aMOV R2,#200\x0d\x0aDLY:\x0d\x0aMOV R3,#250\x0d\x0aDJNZ R3,$\x0d\x0aDJNZ R2,DLY\x0d\x0aRET\x0d\x0aEND相信楼上说的“发音朗读”与楼主说的不是一回事对61h端口的I/O控制可以控制早期的PC喇叭方波声音发生器,它不是用来控制声卡的,由于只能控制声音频率,它只能发出比较单调的音乐,不能进行音幅控制、谐波处理、声音合成等,更无从谈语音合成了
你的电脑播放没问题指的是声卡没问题,现在的许多电脑已经废除了原来的PC喇叭,或者喇叭线有但是没有正常接到主板上,你可以打开检查一下;
另外,由于这类汇编程序直接控制硬件端口,一般只能在实模式的DOS环境下才能正确运行,在XP等的虚拟DOS环境下相当于空 *** 作,不能发出声音
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)