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

📄 s_1.asm

📁 这是我在很多网站上辛苦搜集的所有有关计算机钢琴的程序以及大量报告
💻 ASM
字号:
;2.	编写一个声音程序, 用键盘的1-7键发出乐音, 以便可以自己演奏;
;按键		字符		ASCII码
;shift+1	!		21h
;shift+2	@		40h
;shift+3	#		23h
;shift+4	$		24h
;shift+5	%		25h
;shift+6	^		5Eh
;shift+7	&		26h
;shift+8	*		2Ah

data	segment	para
	;Table_L dw	262,294,330,349,392,440,494,523 	;低音1-7的频率
	Table_M	dw	523,587,659,698,784,880,988,1046 	;中音1-7的频率
	Table_L	dw	1046,1175,1318,1396,1567,1760,1975,2100 ;高音1-7的频率
	shift_1	equ	21h
	shift_2	equ	40h
	shift_3	equ	23h
	shift_4	equ	24h
	shift_5	equ	25h
	shift_6	equ	5Eh
	shift_7	equ	26h
	shift_8	equ	2Ah
data	ends
ss_seg	segment	stack
	db	256	dup(?)
ss_seg	ends
code	segment
	assume	cs:code,ds:data,ss:ss_seg
	main	proc	far
			push		ds		;将psp+0h处的段地址和偏移量压入堆栈以便返回操作系统
			xor		ax, ax
			push		ax
			mov		ax, data	;装载数据段寄存器ds,使之指向当前数据段
			mov		ds, ax
	main_1:		mov		ah, 0		;利用bios的16号中断,扫描键盘按键
			int		16h		;AL中返回按键的ASCII码,AH中返回按键的扫描码
			cmp		al, 0dh		;判断是否为回车键,是回车键就退出
			jz		main_exit
			cmp		al, '1'
			jb		main_2
			cmp		al, '8'
			ja		main_2
			and		ax, 000fh	;说明按下的是低音1-7,与操作将ASCII码转换到数字1-8
			dec		al		;将数值转换成以0开始的数字,以便从表中查找频率值
			shl		al, 1		;将数值乘以2,因为每个频率值是字型变量,这样才能查表准确
			lea		bx, Table_L	
	main_12:	mov		si, ax
			mov		di, [bx+si]	;从表中取频率值
			mov		bx, 5000	;发声时间
			call		GenSound
			jmp		main_1

	main_2:		cmp		al, shift_1	;判断是否按下shift+1键
			jnz		main_3
			mov		ax, 0
			jmp		main_11
	main_3:		cmp		al, shift_2	;判断是否按下shift+2键
			jnz		main_4
			mov		ax, 2
			jmp		main_11
	main_4:		cmp		al, shift_3	;判断是否按下shift+3键
			jnz		main_5
			mov		ax, 4
			jmp		main_11
	main_5:		cmp		al, shift_4	;判断是否按下shift+4键
			jnz		main_6
			mov		ax, 6
			jmp		main_11
	main_6:		cmp		al, shift_5	;判断是否按下shift+5键
			jnz		main_7
			mov		ax, 8
			jmp		main_11
	main_7:		cmp		al, shift_6	;判断是否按下shift+6键
			jnz		main_8
			mov		ax, 10
			jmp		main_11
	main_8:		cmp		al, shift_7	;判断是否按下shift+7键
			jnz		main_9
			mov		ax, 12
			jmp		main_11
	main_9:		cmp		al, shift_8	;判断是否按下shift+8键
			jnz		main_10
			mov		ax, 14
			jmp		main_11
	main_10:	jmp		main_1	
	main_11:	lea		bx, Table_M
			jmp		main_12
	main_exit:
			ret
	main	endp
	;发声程序
	;入口:di中存放的是定时器2的计数值
	;      bx中存放的是延时的时间
	;出口:无
	GenSound	proc
			push		ax		;保护现场
			push		bx
			push		cx
			push		dx
			push		si
			push		di
			mov		al, 0b6h	;写定时器模式
			out		43h, al
			mov		dx, 12h		;定时器分频1234dch
			mov		ax, 34dch	
			div		di		;1234dch/di给定频率
			out		42h, al		;写定时器2的低字节
			mov		al, ah
			out		42h, al		;写定时器2的高字节
			in		al, 61h		;得到当前61h端口的设置,并保存在ah中
			mov		ah, al		
			or		al, 03h		;打开扬声器发声
			out		61h, al
	GenSound_2:	
			mov		cx, 6000
	GenSound_1:
			nop		
			loop		GenSound_1
			dec		bx
			jnz		GenSound_2
			mov		al, ah		;关闭扬声器
			out		61h, al
			pop		di		;恢复现场
			pop		si
			pop		dx
			pop		cx
			pop		bx
			pop		ax
			ret
	GenSound	endp
code	ends
	end		main

⌨️ 快捷键说明

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