⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pc.asm

📁 PC计算机钢琴程序子程序: 包括以下资料 软件:提取音乐代码的软件工具(自己用VB写的) 资料:所有与按键和PC Sound有关资料 唱歌:包括歌曲有 聚萍、同一首歌、月亮代表我的心、美丽的神
💻 ASM
字号:
;/*---------------------------*/
;PC蜂鸣器高低音测试
;编译器为MASM5.0测试通过
;/*---------------------------*/


;/*---------------------------*/
;数据段定义
data 	segment								;数据定义段
	assume		ds:data						;建立数据段寄存器寻址

note_t	dw  	131,147,165,175,196,220,247				;超低音
	dw  	262,294,330,349,392,440,494				;低音
        dw  	523,587,659,698,784,880,988				;中音
        dw  	1046,1175,1318,1397,1568,1760,1975			;高音

data	ends								;数据定义段结束
;/*---------------------------*/



;/*---------------------------*/
;代码段定义
code    segment				;代码定义段
        assume		cs:code		;建立代码段寄存器寻址
;/*---------------------------*/



;/*---------------------------*/
;主函数
main	proc		far		;主函数过程定义
	mov 		ax,data		;取数据段地址
	mov 		ds,ax		;装载数据段寄存器ds,使之指向当前数据段
	mov		bx,0		;设定查表数组下标初值
;/*---------------------------*/



;/*---------------------------*/
;检测输入
key_scan:  
	mov 		ah,0bh		;调用中断21,0bh检测有无键盘输入
	int 		21h
	cmp		al,00h		;有输入al=ffh,无输入al=00h
	jnz		exit		;有输入就退出				

next:
	add		bx,2
	push		bx
	mov		cx,note_t[bx]	;取得对应数组下标值的频率值
	mov		dx,0012h
	mov		ax,34dch
	div		cx		;ax为所得分频值
	call		beep	
	pop		bx	
	cmp		bx,48
	ja		key_scan1
	jmp		key_scan	;否则继续


key_scan1:
	mov 		ah,0bh		;调用中断21,0bh检测有无键盘输入
	int 		21h
	cmp		al,00h		;有输入al=ffh,无输入al=00h
	jnz		exit		;有输入就退出	

next1:
	sub		bx,2
	push		bx
	mov		cx,note_t[bx]	;取得对应数组下标值的频率值
	mov		dx,0012h
	mov		ax,34dch
	div		cx		;ax为所得分频值
	call		beep	
	pop		bx
	cmp		bx,0
	je		key_scan
	jmp		key_scan1	;否则继续
;/*---------------------------*/	



;/*---------------------------*/
;退出
exit:
        mov 		ah,4ch		;调用中断21,4ch退出系统
        int 		21h
;/*---------------------------*/



;/*---------------------------*/
main	endp				;主函数过程结束
;/*---------------------------*/



;/*---------------------------*/
;固定频率响
beep    proc		near
	
	push		bx
	out		42h,al		;输出频率值,低8位
	mov		al,ah
	out		42h,al		;输出频率值,高8位

	in		al,61h		;开启定时器
	or		al,03h		
	out		61h,al
	
	mov		ah,00h		;取时钟计数值
	int		1ah
	mov		al,6		;9.1次为0.5秒
	cbw                          	;al值转为16位ax
	add		ax,dx		;加上当前时钟计数值,得到计数终值
	mov		bx,ax		;计数终值置入bx
delay:	mov		ah,00h
	int		1ah		;取时钟计数值
	cmp		bx,dx		;到终值吗?
	jnz		delay		;未到,继续延时

	in		al,61h		;关闭定时器
	and		al,0fch
	out		61h,al			
	pop		bx
	ret
beep    endp
;/*---------------------------*/



;/*---------------------------*/
code	ends				;代码段结束
	end		main		;主程序结束
;/*---------------------------*/



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -