77范文网 - 专业文章范例文档资料分享平台

乐曲程序的设计与实现(3)

来源:网络收集 时间:2019-02-15 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

武汉理工大学《汇编语言程序设计》课程设计

2: MUSIC2 – TAIHU 3: MUSIC3 -- LITTLE BEE

4: PLAY BY KEYBOARD 5: PRESS 5 TO QUIT 6: CLEAR THE SCREEN

通过选择不同的选项进入其子界面来实现不同的功能。

3.3 关键代码设计实现及分析

3.3.1 程序段说明

1) DATAS为数据段,其中存放在程序中所要显示的提示选择信息,还有乐曲的频率表和节拍表,和键盘控制发声对应的音符表。

2) CODES为代码段,由于在整个程序中各个子程序都定义为NEAR,所以只需要有一个代码段,各个子程序的定义及实现都放在其中。

3.3.2 PLAY_MUSIC 乐曲演奏程序的实现及分析

“PLAY_MUSIC”为播放音乐的子程序,完成的功能是通过SI(频率表的偏移地址) BP(节拍表的偏移地址)(通过主程序传递过来的参数)找到对应的频率(DI)、节拍(BX),再以DI、BX为参数调用SOUNDF子程序来发出声音。 关键代码:

FREQ:

MOV DI, [SI] CMP DI, 0 JE END_MUSIC MOV BX, DS:[BP]

CALL SOUNDF ; 以DI(频率) BX(节拍)为参数,调用SOUNDF ADD SI, 2 ADD BP, 2

JMP FREQ

8

武汉理工大学《汇编语言程序设计》课程设计

SI, BP是频率表和节拍表的偏移地址,通过寄存器间接寻址方式找到数据段中定义 数据,传递给BX和DI,然后调用SOUNDF发出一个频率为DI,节拍数为BX的声音注意: 在频率表中应该设置一个结束标志,“CMP DI, 0”,在这里以0作为结束标志。

3.3.3 SOUNDF通用发声程序的实现及分析

SOUNDF”为以传递过来的频率和节拍数,发出一个音符的频率的子程序。 关键代码分析:

MOV AL, 0B6H

OUT 43H, AL

置43H端口为0B6H,选择计数器2,读/写LSB, MSB , 模式3,计数值为二进制数。

MOV DX, 12H MOV AX, 348CH

DIV DI

按照公式,计数值=12348CH÷ f ,商存放在AX中。

OUT 42H, AL MOV AL, AH OUT 42H, AL

8253\\54的数据总线为8位,而计数值为16位,所以应该分两次传递计数值。

IN AL, 61H MOV AH, AL

OR AL, 3 OUT 61H, AL

将61H的后两位置1,打开扬声器,使其发声。

WAIT1:

CALL WAITF DEC BX

9

武汉理工大学《汇编语言程序设计》课程设计

JNZ WAIT1

用WAITF产生一个10ms的延时,BX是节拍(10ms的倍数)。

MOV AL, AH OUT 61H, AL

恢复寄存器状态

3.3.4 WAITF延迟程序的实现及分析

“WAITF”为通过监控端口61H的PB4固定不变的触发时间来产生延迟时间的子程序。 关键代码分析: MOV CX, 663

WAITF1:

IN AL, 61H

AND AL, 10H ; 查看61H寄存器的第四位(PB4) CMP AL, AH

JE WAITF ; PB4每15.08秒触发一次 MOV AH, AL ; LOOP WAITF1

10ms / 15.08us = 663,所以先置CX为663,每次通过调用WAITF都会产生一个 10ms的延迟。

3.3.5 KEYBOARD键盘发声程序的实现及分析

“KEYBOARD”子程序,通过按不同的按键(1 ~ 8)来产生不同频率的音符。 关键代码分析:

PLAY_BY_KB: MOV AH, 7 INT 21H CMP AL, 0DH

JE QT

10

武汉理工大学《汇编语言程序设计》课程设计

MOV BX, OFFSET TABLE CMP AL, '1' JB PLAY_BY_KB CMP AL, '8'

JA PLAY_BY_KB

输入按键,回车退出,如果不是1 ~ 8的话跳转到开始重新输入。

AND AX, 0FH ; 清空AH SHL AX, 1

SUB AX, 2

找到索引地址,是DW型的,所以需要乘2,而且是从0开始,应该减去2

MOV SI, AX MOV DI, [BX][SI] MOV BX, 10

CALL SOUNDF

通过索引从符号表里面找到对应的频率,调用SOUNDF发出声音。

4、 调试过程及实验结果分析

4.1调试过程

1: 在刚开始显示字符串的时候,应该加上0DH,0AH换行,而且在字符串的最后应该以\来结尾,然后调用DOS调用 INT 21H,来显示字符串。调试中发现,如果一个字符串末尾不加\的话,DOS调用会直接把之后定义的字符串也同时显示出来,直到遇到\为止。这是由内存的分配模式所决定的,同时定义的变量在内存中会处于相邻位置。 2: 在调试子程序KEYBOARD的时候,发现管输入‘0’程序不会返回,是因为在程序中直接 CMP AL, 0。而从键盘输入的是ASC码,‘0’对应的ASC码为30H,所以修改语句如下: CMP AL, '0'。

3: 在调试KEYBOARD的时候,发现输入1 ~ 8 只有7会发出声音,检查后发现由于在TABLE表中定义的是DW字,而在程序中直接将输入符号作为索引值,应该将输入数字减一乘二才能得到正确的索引值。

4: 在调用CLEAR的时候,发现每次显示的列表都会向下移动。在清除前应该将光标

11

武汉理工大学《汇编语言程序设计》课程设计

位置移动到第0行,第0列。

5: 在输入字符较多的情况下,界面显得较为凌乱,所以在程序中添加了一个清屏子程序,每次在返回选择界面的情况下清屏,但是在调试过程中,每当调用CLEAR的时候就出现错误: “C:\\WINDDOWS\\system32\\cmd.exe NTVDM CPU 遇到无效的指令 CS:01e7 IP:018b OP:db fe 06 cd 02”,查阅资料,发现是软件兼容问题。最后查阅书本,发现如果要实现清屏功能的话应该先把光标的位置定位到界面的开始位置(行、列号都为0),然后参照书本P330的例9.11来实现清屏功能。

6: 刚开始时候,直接把延迟时间(15.08us)通过CX寄存器传递给子程序WAITF,这样会导致每次传递的时候都应该计算。所以之后在WAITF中直接将CX初始化为663(10ms/15.08us = 663),每次调用WAITF就能产生10ms的延迟,但要特别注意的是,如果WAITF中用到CX,首先应该将CX压栈(PUSH CX),返回之前出栈(POP CX)。

7: 结果显示界面显得比较单调,为了增加程序美观性,定义了一个利用BIOS功能调用来设置显示方式和背景色。但要特别注意的是调用的时机,应该在每次刷新并且显示选择列表之前调用。

4.2实验结果

这是进入程序页面后的屏幕显示,通过y和n来播放音乐或者结束

图表 1 播放音乐界面

程序正在播放歌曲。

12

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库乐曲程序的设计与实现(3)在线全文阅读。

乐曲程序的设计与实现(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/471506.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: