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

📄 pc_1.asm

📁 PC计算机钢琴程序子程序: 包括以下资料 软件:提取音乐代码的软件工具(自己用VB写的) 资料:所有与按键和PC Sound有关资料 唱歌:包括歌曲有 聚萍、同一首歌、月亮代表我的心、美丽的神
💻 ASM
字号:
;/*---------------------------*/
;数据段定义
data 	segment								;数据定义段
	assume		ds:data						;建立数据段寄存器寻址

msg_1   db	'I love you ''ASM'' from the bottom of my heart! $',0dh,0ah	;定义字节
msg_2	db	0dh,0ah,'In this OS. I''l use lookup table to display number''s music$'
msg_3	db	0dh,0ah,' $'

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			;高音

key_t	db	'q','w','e','r','t','y','u'				;超低音				
	db	'a','s','d','f','g','h','j'				;低音
	db	'z','x','c','v','b','n','m'				;中音
	db	'1','2','3','4','5','6','7'				;高音

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



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



;/*---------------------------*/
;字符显示
show	macro 		str		;宏定义,输入参数:字符串str
        lea		dx,str		;装入str的有效地址
        mov 		ah,09h		;调用中断21,09h显示字符串
        int 		21h	
        endm				;宏定义结束
;/*---------------------------*/



;/*---------------------------*/
;主函数
main	proc		far		;主函数过程定义
	mov 		ax,data		;取数据段地址
	mov 		ds,ax		;装载数据段寄存器ds,使之指向当前数据段
	;call		set_video	;设置显示模式(这个与硬件有关)
	show		msg_1		;调用宏,显示字符串
	show		msg_2
	show		msg_3
	mov		bx,0		;设定查表数组下标初值
;/*---------------------------*/




;/*---------------------------*/
;按键扫描
key_scan:
	mov		ah, 00h		;利用bios的16号中断,扫描键盘按键
	int		16h		;AL中返回按键的ASCII码,AH中返回按键的扫描码
	cmp		al, 0dh		;判断是否为Enter键
	jz		exit		;是回车键就退出

	cmp		al, 1bh		;判断是否为Esc键
	jz		exit		;是退出键就退出
	
	mov		bx,0000h	;初始化指针	
lookup:
	cmp		key_t[bx],al	;取出对应频率值
	je		next
	inc		bx		;指针+1			
	jmp		lookup
	
next:
	shl		bx,1		;指针×2,计算频率表指针
	mov		cx,note_t[bx]	;取得对应数组下标值的频率值
	mov		dx,0012h
	mov		ax,34dch
	div		cx		;ax为所得分频值
	call		beep			
	jmp		key_scan	;否则继续扫描
;/*---------------------------*/	



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



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



;/*---------------------------*/
;固定频率响
beep    proc		near
	
	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			

	ret
beep    endp
;/*---------------------------*/



;/*---------------------------*/
;设置显示模式
;set video mode  Text mode 40x25, 16 colors, 8 pages.
set_video  proc		near
        mov 		ah,00                ;320*200彩色屏幕
        mov 		al,04
        int 		10h
        mov 		ah,0bh               ;背景色              
        mov 		bh,00
        mov 		bl,1
        int 		10h
	ret
set_video  endp
;/*---------------------------*/



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



⌨️ 快捷键说明

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