键盘钢琴汇编语言课程设计_第1页
键盘钢琴汇编语言课程设计_第2页
键盘钢琴汇编语言课程设计_第3页
键盘钢琴汇编语言课程设计_第4页
键盘钢琴汇编语言课程设计_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前 言 汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接 控制硬件的语言。汇编语言,作为一门语言,对应于高级语言的编译器,需要一个“汇 编器”来把汇编语言原文件汇编成机器可执行的代码。 高级的汇编器如 MASM,TASM 等等为我们写汇编程序提供了很多类似于高级语言的特 征,比如结构化、抽象等。在这样的环境中编写的汇编程序,有很大一部分是面向汇编 器的伪指令,已经类同于高级语言。而此次的微机原理与接口技术(基于 16 位机) 的课程设计正是利用这个学期所学的汇编语言来设计一个键盘钢琴的应用程序,要求该 汇编语言程序能实现键盘钢琴的功能,就是在键盘上按下自定义的按键之后,可以从主 板的蜂鸣器上发出一定频率的音调,而这些音调的频率都是相应音阶的特征频率,故发 出的声正好就是音乐的各个音阶声调。 通过这个应用程序,按照音乐的谱子连续地按下相应按键,就可以像钢琴那样发出 音乐来,但是局限于扬声器的原因,所发出的音乐没有真正的钢琴那样美妙。但是现在 的一些键盘钢琴的软件已经能驱动声卡,来获得更好更逼真的钢琴音乐效果了。 中文摘要中文摘要 采用16 位微处理器 8086 CPU 以及86 系列微型计算机的指令系统; 软件设计平台为多功能微型计算机实验软件MFS 中的微机原理实验集成环境MF2KP, 仿真设计平台为Proteus 软件。 设计汇编语言程序,实现键盘钢琴功能,具体功能要求如下: (1)在键盘上自定义若干键对应钢琴键; (2)单击钢琴键,计算机发出相应音阶,发声时间自定义; (3)单击”ESC”键退出程序。 关键字: 16位微处理器 集成环境 汇编语言 键盘钢琴 目目 录录 1 1 设计意义及要求设计意义及要求.1 1.11.1 设计意义设计意义 .1 1.21.2 设计要求设计要求 .1 2 2 总体方案论证总体方案论证 .2 2.12.1 按键与音调频率值的对应按键与音调频率值的对应.2 2.22.2 扬声器的驱动分析扬声器的驱动分析.4 2.32.3 发声时间发声时间.5 3 程序设计程序设计.6 3.1 主程序设计及其流程图主程序设计及其流程图.6 3.2 子程序设计及其流程图子程序设计及其流程图.7 3.2.1 计算频率值的子程序计算频率值的子程序FIFRE.7 3.2.2 发声子程序发声子程序SOUND.8 3.2.3延时子程序DELAY.9 4 结果分析结果分析.10 4.14.1 程序调试与改进程序调试与改进.10 4.24.2 结果记录及分析结果记录及分析.11 心得与体会心得与体会.12 参考文献参考文献.13 致致 谢谢.14 附录附录 程序代码程序代码.15 3 2 1 1 1 设计意义及要求设计意义及要求 1.11.1 设计意义设计意义 键盘钢琴,电脑键盘代替钢琴键演奏钢琴乐曲。最原始、也是最流行的版本,音符 以 ABCDEGF 为编排。让不懂音乐的网友可以快速上手,其体积小,简单方便、易传播, 因此在网上普及率最高。 键盘钢琴让人可以在闲暇时刻,可以小小地娱乐一下,增加生活的乐趣。由于一架 钢琴过于昂贵,对于一般的普通工薪阶层的人来说,还是很难接触到钢琴的,而键盘钢 琴的出现正好让那些业余爱好者,既满足的对钢琴音乐艺术的追求,也更廉价和便捷。 对于初学音乐的人来说,这样的键盘钢琴软件更是训练的好助手,可以帮助你迅速熟悉 各音阶音调和旋律节奏。因此,这样的软件也很多版本,有专业版,也有简单的 Flash 版,当然也有此次课设要求设计的简陋版。专业版能提供多种乐器音色、录放功能、音 符显示。不太好的地方是键盘要按下去才发音,没有延时,弹起来不太就手。Flash 版音 色也比较好,提供了多键位,也可以自定义键位。 1.21.2 设计要求设计要求 设计汇编语言程序,实现键盘钢琴功能,具体要完成的设计任务如下: (1) 在键盘上自定义若干键对应着钢琴键; (2) 单击钢琴键,计算机发出相应的音阶,发声时间自定义; (3) 单击“ESC”键退出程序 音阶与频率的对应关系如下所示: 音符45671234567 频率/Hz175196220247262294330349392440494523587659 2 2 总体方案论证总体方案论证 2.12.1 按键与音调频率值的对应按键与音调频率值的对应 设计此汇编语言程序,要实现键盘钢琴,首先是按键的自定义设计,因为题中要求 设计的按键音调音阶有十四个,但是从网上查资料得知,各音阶与其相应频率有如表 1-1 所示的关系。 表 1-1 音阶与频率的对应关系 单位:Hz 从表中可知:高低音之间有着大约两倍的关系,这样就很方便数据的储存了,只需 要将其中一个音度的频率值存储下了,再进行二倍关系的换算即可得到倍低音、低音、 中音、高音、倍高音五种音度的音调频率值。 因为题目中主要是对低、中、高音的要求,在这里就以低音为基准存储数据值和换算 其他音调频率值,由表 1-1 中得知低音音符 1 2 3 4 5 6 7 的音调频率分别为 131、147、165、175、196、220、247。其中,中音各音调的频率是相应低音音调频率的 两倍, 高音各音调频率是低音的四倍的。又因为低音的频率值最大为 247,正好小于一 个无符字节数值的最大值 255,因此,只需要在程序的数据区内安排七个字节来存放频率 数据,即: FREQ DB 131,147,165,175,196,220,247 这样,不仅节省了存储空间,而且降低了存储数据的复杂程度。 考虑到字母键盘一共也只用 26 个,就不对所有音调都进行字母键盘的按键定义了, 只补齐题目中所缺的高音和低音,共 21 个音阶。则可以按如下表 1-2 中的对应关系,设 置 21 个按键分别对应着低、中、高三种音度的各音调的频率值。由于字母所对应的 ASCII 码并不是连续的,因此在这里就将其的 ASCII 码存储到数据区,然后根据变址寻址 A11022044088017603520 B12324749498819753950 C131262523104620934186 D147294587117523494698 E165330659131826375277 F175349698139727945587 G196392784156831366271 的方式 表 1-2 音阶频率与自定义按键的对应表 对字母按键的 ASCII 码进行地址编码,可以将字母的 ASCII 码的按表 1-2 的顺序存放,即: KEYS DB QWERTYU , ASDFGHJ , ZXCVBNM 这样看来,就是将这些 ASCII 码值分出三类,分别为低音类、中音类、高音类。 根据输入 KEY 的 ASCII 码值利用一个 21 次的 LOOP 循环就可以找到对应的偏移地 址,再将所得的偏移地址减去首地址的偏移地址得到该 KEY 的地址相对值,再把该相对 值与 6 和 13 大小判断偏移地址的所属类别(小于等于 6 为低音类,大于 6 小于等于 13 为中音类,大于 13 为高音类) 。 知道 KEY 的所属类别,就知道基准频率值应该乘以多大的倍数才是该 KEY 的真正 的频率值,低音类倍数为 1,中音类倍数为 2,高音类倍数为 4。 接下来还要确定是哪个基准频率值,由于已经知道所属类别,如果是低音类则就是 地址相对值,如果是中音类,则地址相对值要减去 7,显然高音类则减去 14,就得到了 一个 0 至 6 的编码,再由换码指令 XLAT 对频率数据 FREQ 进行换码,可以很快得到该 KEY 的对应的基准频率值。 最后是将得到的基准频率值乘以得到的类别倍数,就得到最后想要的输入 KEY 的音 调频率值。举例如下: 输入按键 KEY 的 ASCII 码值为“D” ,其 ASCII 码是 44H,在一个 21 次的 LOOP 循环下, 可以得到数据位 44H 的偏移地址 DI,在将该偏移地址 DI-首地址的偏移地址 KEYS=偏移地 址的相对值 9。 因为 6913 属于中音类,基准频率值的倍数为 2。因为属于中音类 KEY“D”编码为 9-7=2,在换码可以知道, “D”对应的基准频率值为 165,故最后得到“D”的频率值为 165*2=330Hz。 因此,用此算法得到各个按键的频率值是可行的。不仅节省了存储空间,而且降低 音度音名1234567 131147165175196220247低音频率/Hz 自定义按键QWERTYU 131*2147*2165*2175*2196*2220*2247*2中音频率/Hz 自定义按键ASDFGHJ 131*4147*4165*4175*4196*4220*4247*4高音频率/Hz 自定义按键ZXCVBNM 了存储数据的复杂程度,在程序编写上可以将这一段写成子程序,更加使得程序简洁明 了。 2.22.2 扬声器的驱动分析扬声器的驱动分析 该程序主要是驱动电脑主板上的扬声器,根据音阶音调不同的频率值,来是扬声器 发出不同的声音,从而产生想弹钢琴一样的感觉,当然音质是不能相提并论的。 (在这里 需要说明的是,现在大多数笔记本主板上已没有这个扬声器,但是台式机大多还是有的, 在台式机上的效果更好点。 ) 在电路上如下图 2-1 所示: 图 2-1 8253 的电路连接图 在 PC/XT/AT 家族中,计时器芯片的 3 个通道都用其专门的功能,通道 2 是用来控制 计算机的扬声器的声音频率的。通道 2 用于产生频率信号,故工作方式在方式 3,计数值 为 6A4H=1190,方波输出频率为 1.19MHz/1190=1KHz,此信号决定了扬声器的声调,而通 道 2 的控制字则为 0B6H,1.19M 约等于十六进制 12348CH。 由图 1-1 可知 8253 的通道 2 计数由 8255A 的 PB0 控制,当 PB0 输出为高电平的时 候,是门 GATE2 为高电平。此时,8253 的通道 2 允许计数,故通道 2 的输出方波受 PB0 控制,从而控制扬声器的音调高低。通道 2 的输出能否对扬声器产生持续控制还取决于 8255A 的 PB1。当 PB1 为“0”时,OUT2 不能通过“与门” ;反之则可通过“与门”控制 扬声器。所以,扬声器发音时间的长短取决于 8255A 的 PB1 信号。另外,CPU 通过 8255A 的 C 口,得知 5283 通道 2 的状态和扬声器驱动器的状态。 8255(PB1) 由上可知,需要扬声器正常发声,需要 8253 和 8255A 的协同工作,而 8253 的控制 字在网上查的为 43H,则同过下面的程序来初始化 8253 MOV AL,0B6H OUT 43H,AL 而通道 2 的端口地址为 42H,由于 N 值一般计算得出都大于 255,故需要一个字的写入, 而又因为 8253 只有八位数据线,故字的写入需要两次,一般将 N 值直接给 AX 然后通过 下面的程序即可完成。 OUT 42H,AL MOV AL,AH OUT 42H,AL 而 8255A 能控制 8253 和扬声器,但是只要 PB0 和 PB1 同时为高调平,扬声器就为 开,则对 8255A 的控制就是在对扬声器的控制,在网上得知 8255A 的 B 口地址为 61H, 则可以通过下面的程序实现扬声器的开与关。 IN AL,61H OR AL,3 ;可以保证 PB0 和 PB1 同时为高调平 OUT 61H,AL ;打开扬声器 MOV AL,AH AND AL,0FCH ;可以保证 PB0 和 PB1 同时为低调平 OUT 61H,AL ;关闭扬声器 2.32.3 发声时间发声时间 因为只要通过 8255A 将扬声器打开而不关闭,那么只要 8253 正常工作,扬声器就会 一直发声,需要发声时间多长,只需要写一个延时子程序即可,利用 LOOP 和跳转指令 就可以得到一个双循环程序,在根据指令时间依次乘以 LOOP 循环的次和跳转指令的跳 转次数就可以得到想要的延时时间。子程序循环完毕在将扬声器关闭即可。延时子程序 时间的长短就是发声时间的长短。 3 程序设计程序设计 3.1 主程序设计及其流程图主程序设计及其流程图 开始 数据初始化(输入 KEYS,音符频率 FREQ 等) 显示提示信息 输入按键 KEY 显示请输入正确 key 发声子程序 SOUND 判断输入:KEY 是否为 ESC ? 否 结束提示语 KEYS 首地址给 BX 返回 DOS 循环次数 CX=21 结束 计算 KEY 所对应频率值的子程序 FIFRE 判断 KEY 和BX 是否相等 ? 否 BX=BX+1 否 LOOP 判断 CX 是否为零 ? 是 图 3-1 主程序的流程图 如图 3-1,主程序的主要任务: 1) 如果输入的 KEY 为“ESC”时,直接跳转至退出 EXIT 处; 2) 找出输入按键 KEY 的偏移地址,若不是正确按键,则显示提醒语句并重新输入 KEY; 3) 将得到的 KEY 偏移地址送入子程序 FIFRE 计算得出频率值,接着再将频率值给子程 序 SOUND 并发出音调,完成之后,跳转至输入口 INPUT。 3.2 子程序设计及其流程图子程序设计及其流程图 3.2.1 计算频率值的子程序计算频率值的子程序 FIFRE 开始 设置倍数标志 DL=1 计算 DI 相对于 KEYS 的值并给 DI 小于等于 将 DI 与 6 相比 大于 DI=DI-7 且 DL=DL+1 将 DI 与 6 小于等于 相比 DI=DI-7 且 DL=DL+2 将 DI 给 AX 后进行换码,相乘 DL 得到 AX 值给 BX 图 3-2 子程序 FIFER 流程图 结束 计算输入值所对应频率值的子程序 FIFRE 的主要任务: 将偏移地址 DI 减去首地址的偏移地址 KEYS 得到该 KEY 的地址相对值,再把该相 对值与 6 和 13 大小判断偏移地址的所属类别,小于等于 6 为低音类,基准值倍数 DL=1,大于 6 小于等于 13 为中音类,基准值倍数 DL=2,大于 13 为高音类,基准值倍 数 DL 为 4。 最后的 DL 为基准频率值赋给 AL,与基准值倍数 DL 相乘,得到频率值 AX,再将 AX 最 后赋给 BX。最后子程序 FIFER 结束时,BX 即为输入 KEY 的音调频率值。 3.2.2 发声子程序发声子程序 SOUND 开始 向 8253 的 43H 写入控制字 0B6H 给 DX、AX 分别赋值 12H、348CH DIV BX 得到计数初值 AX=N 分两次向通道 2 端口 42H 写入计数初值 N 打开扬声器 延时子程序 DELAY 关闭扬声器 结束 图 3-3 子程序 SOUND 流程图 子程序 FIFER 流程图如图 3-3 所示,其主要任务是完成发声,在该子程序中,分两 次向通道 2 端口 42H 写入计数初值 N 的程序语句为: OUT 42H,AL MOV AL,AH OUT 42H,AL 打开和关闭扬声器的程序为: IN AL,61H OR AL,3 ;可以保证 PB0 和 PB1 同时为高调平 OUT 61H,AL ;打开扬声器 MOV AL,AH AND AL,0FCH ;可以保证 PB0 和 PB1 同时为低调平 OUT 61H,AL ;关闭扬声器 开始 3.2.3 延时子程序 DELAY BX=4000 CX=0FFFH 否 CX=0? 是 BX=BX-1 BX=0? 恢复 BX 和 CX 图 3-4 延时子程序 DELAY 结束 入栈保护 BX 和 CX 4 结果分析结果分析 4.14.1 程序调试与改进程序调试与改进 按上面的思路和流程图写好程序后,对程序进行调试: 1)一开始在输入显示这里,使用的是 DOS 的 1 号单字符输入,会产生“回显” ,但 对 于键盘钢琴来说,这一点没有必要,于是改进后使用 7 号无“回显”的单字符输入。之 前,一直想把音符也显示出来,按的什么显示相应的音符,成功实现之后,在进行第一 次答辩时,研究生学长认为此举没有很大的必要性,可以不显示相应的音符,经过思考 之后也表示赞同,如图 4-1 和 4-2 是不同程序的界面显示,调试后看起来更简洁明了; 图 4-1 改进之前的程序界面 图 4-2 改进之后的程序界面 2)在第一次答辩时,由于对题目认识得不够深入,只对任务书中要求的音符进行了, 编写,在答辩时,在学长的指导下,回来查资料后知道了音符与频率的一般规律,于是 改进方案,将高、低音补齐,得到更多的音调选择; 3)在算法上的改进,之前是算法是只根据数据区地址的关系进行推算所有频率值的 地址,这样既浪费存储空间,又不能很好实现算法,没有可变性,在得知音符的 2 倍关 系之后,再次思考得出上面的新算法,新算法较之前的,不但减少了存储空间,算法也 变得简单易懂。 4.24.2 结果记录及分析结果记录及分析 调试之后,运行结果和课题的设计要求完全相符合。 1) 开始运行程序,能看到如下图 4-3 所示的“Welcome to Piano of Keyboard” 程序运行开始提示语,紧接着出现的是如图 4-4 所示的操作提示语, 图 4-3 程序运行开始提示语 图 4-4 程序操作提示语 2)分别按键盘上的按键 Q、W、E、R、T、Y、U 得到低音声的各音调, 分别按键盘上的按键 A 、S、D、F、G、H、J 得到中音声的各音调; 分别按键盘上的按键 Z、X、C、V、B、N、M 得到高音声的各音调。 3)单击“ESC”可以退出程序,并显示退出提示语,如图 4-5 所示; 图 4-5 程序退出时显示提示语 心得与体会心得与体会 经过一周的汇编课程设计,我在其中经历了很大的困难,可是也感受到了巨大的幸 福。当我面对一个难题,从一筹莫展到逐渐清晰明朗,到最后成功的完成任务。只要亲 身经历过,才能感受其中的泪水和快乐。更重要的是我们对汇编有了进一步的理解。有 了实际运用的体会,只是更加的融会贯通了,不管是从知识上还是从思维逻辑方式上, 我们都有了很大的进步。 还有就是深切感受到了课本以外的世界独立接受新知识,独立面对新问题的能力, 面对挑战不气馁,积极的去面对,战胜它。让自己变得充实起来。以及感谢老师给我们 这次课程设计的机会,知识来源于实践,应用于实践。 总之这次的课程设计使我受益匪浅。在以后的日子里我们要本着一切从应用出发的 度 去学习。同样要珍惜以后的实践学习。 参考文献参考文献 1 周佩玲,彭虎,傅忠谦.微机原理与接口技术(基于 16 位机).电子工业出版社, 2005. 2 周佩玲,吴耿峰,万炳奎编.十六位微型计算机原理接口及其应用.中国科学技术大 学出版社,1995. 3 周明德.微型计算机系统原理及应用(第四版)习题集与实验指导书.清华大学出版 社,2002. 4 戴梅萼.微型计算机技术及应用(第三版).清华大学出版社,2003. 5 孙德文.微型计算机技术.高等教育出版社,2001. 6 王爽.汇编语言.清华大学出版社(第二版),2008 致 谢 一周的汇编语言课程设计结束了,我的收获很大。通过课程设计的编程和对编程过 程中遇到的问题的思考,有效的提高了我对汇编的认识和理解,切实的提高了我的编程 能力,补全了我的不足。通过这次课程设计,我巩固所了学过的知识,能用汇编语言熟 练地运用顺序、选择、循环三大结构,进一步掌握了各个指令的功能,特别是转向指令, 掌握了子程序的定义及调用,以及正确地运用 DEBUG 指令。在整个程序的编写中,调试 占了很大部分的时间。要想写好汇编语言的程序,必须认真对待代码的每一个细节,还 必须熟练的掌握 debug 命令,这对程序的调试是非常重要的。通过这次实际动手能力的培 养,我进一 步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试 另外,就是我对这门课内容的学习感受。要学好这门课,我认为应该做到以下三点: 1) 课本上应该记住的东西一定要记住,记不住就没法做题, (例如指令,寻址方式等等) 若记住你做题就会做,看程序也就能看懂,记不住见了它就会对它不知所措,一脸茫然。 2)预习很重要,这一点不仅适用于这一科的学习,确切的说它适用于任何一科,有的同学 这一点作的不好,上课只知道竖着两个耳朵傻傻的听老师讲课,也不注意动动脑子随时 思考,延续以前填鸭式的学习方式,想让老师讲给所有的东西,殊不知很多东西还要自 己从书本获得。这就难免出现听不懂的情况,这好比让一个不懂外语的人听外语录音, 在他的心里,听外语就像听天书一般,所以说你要学一点新东西,前提是你对它要有一 点了解,不然的话你所作的一切只不过是在浪费时间,浪费金钱,浪费生命。 3)理论与实践相结合,不懂的地方应勤问老师勤问同学,直到把它搞懂为止。 附录附录 程序代码程序代码 DATA SEGMENT KEYS DB QWERTYU,ASDFGHJ,ZXCVBNM FREQ DB 131,147,165,175,196,220,247 WELC DB Welcome to Piano of Keyboard,0DH,0AH,0DH,0AH, EXPL DB Explanation:, 0DH,0AH,Key:QWERTYU-Low Notes 1 2 3 4 5 6 7, 0DH,0AH,Key:ASDFGHJ-Middle Notes 1 2 3 4 5 6 7, 0DH,0AH,Key:ZXCVBNM-High Notes 1 2 3 4 5 6 7, 0DH,0AH, Please Note Your Caps Lock Truned On, 0DH,0AH ESCQ DB 0DH,0AH,Please play:,0DH,0AH,(You can Type ESC to exit), 0DH,0AH,0DH,0AH,$ LAST DB 0DH,0AH,Welcome again!,$ REMI DB Reminder:Please play the Key:QWERTYU-ASDFGHJ-ZXCVBNM, 0DH,0AH,$ DATA ENDS CODE SEGMENT ASSUME CS:CODE DS:DATA START: MOV AX,DATA MOV DS,AX ;初始化数据区 LEA DX,WELC MOV AH,9 INT 21H ;显示提示语句 INPUT: MOV AH,7 INT 21H ;不回显输入键盘的 KEY CMP AL,1BH ;判断输入 KEY 是否为“ESC” JZ EXIT ;若输入 KEY 为“ESC”则跳转到退出 EXIT LEA DI,KEYS MOV CX,21 FIND: CMP AL,DI JZ SING ;找到 KEY 相对应的偏移地址 DI 则跳转至 SING INC DI LOOP FIND ;根据输入 KEY 的 ASCII 码找到相对应的偏移地址 LEA DX,REMI MOV AH,9 INT 21H ;输入的 KEY 不正确,显示提醒请输入正确的 KEY JMP INPUT ;不是正确的输入 KEY,则跳转至 INPUT SING: CALL FIFRE ;进入计算 KEY 所对应频率值的子程序 CALL SOUND ;进入根据频率值发出音调的子程序 JMP I NPUT ;发声完毕后跳转至 INPUT EXIT: LEA DX,LAST MOV AH,9 INT 21H ;显示退出时的字幕 MOV AX,4C00H INT 21H ;返回 DOS FIFRE PROC ;计算 KEY 所对应频率值的子程序 MOV DL,1 ;标记频率基准值的倍数值 LEA BX,KEYS SUB DI,BX ;计算偏移地址相对与首地址的值 CMP DI,6 JNA SOU ;属于低音直接跳转至 SOU SUB DI,7 ;属于中音,将偏移地址减 7 ADD DL,1 ;标记倍数值加倍为 2 CMP DI,6 JNA SOU ;属于中音,跳转至 SOU SUB DI,7 ;属于高音,将偏移地址再减 7 ADD DL,2 ;标记倍数值再加倍为 4 SOU: MOV AX,DI ;将被换码给 AL LEA BX,FREQ XLAT MUL DL ;频率基准值乘以倍数得到 KEY 所对应的频率值 MOV BX,AX RET FIFRE ENDP SOUND PROC ;根据频率值发出音调的子程序 MOV AL,0B6H OUT 43H,AL ;向 8253 的 43H 写入控制字 MOV DX,12H MOV AX,348CH DIV BX ;计算计数初值 N OUT 42H,AL MOV AL,AH OUT 42H,AL ;向通道 2 端口 42H 写入计数初值 N IN AL,61H OR AL,3 OUT 61H,AL ;打开扬声器 CALL DELAY ;进入延时子程序 IN AL,61H AND AL,0FCH OUT 61H,AL ;关闭扬声器 RET SOUND ENDP DELAY PROC ;延时时间子程序 PUSH BX PUSH CX MOV BX,4000 DY1: MOV CX,0FFFH DY0: LOOP DY0 DEC BX JNZ DY1 ;利用 LOOP 循环和跳转指令进行双循环 POP CX POP BX RET DELAY ENDP CODE ENDS END START DATA SEGMENT KEYS DB QWERTYU,ASDFGHJ,ZXCVBNM FREQ DB 131,147,165,175,196,220,247 WELC DB Welcome to Piano of Keyboard,0DH,0AH,0DH,0AH, EXPL DB Explanation:, 0DH,0AH,Key:QWERTYU-Low Notes 1 2 3 4 5 6 7, 0DH,0AH,Key:ASDFGHJ-Middle Notes 1 2 3 4 5 6 7, 0DH,0AH,Key:ZXCVBNM-High Notes 1 2 3 4 5 6 7, 0DH,0AH, Please Note Your Caps Lock Truned On, 0DH,0AH ESCQ DB 0DH,0AH,Please play:,0DH,0AH,(You can Type ESC to exit), 0DH,0AH,0DH,0AH,$ LAST DB 0DH,0AH,Welcome again!,$ REMI DB Reminder:Please play the Key:QWERTYU-ASDFGHJ- ZXCVBNM, 0DH,0AH,$ DATA ENDS CODE SEGMENT ASSUME CS:CODE DS:DATA START: MOV AX,DATA MOV DS,AX ;初始化数据区初始化数据区 LEA DX,WELC MOV AH,9 INT 21H ;显示提示语句显示提示语句 INPUT: MOV AH,7 INT 21H ;不回显输入键盘的不回显输入键盘的 KEY CMP AL,1BH ;判断输入判断输入 KEY 是否为是否为“ESC” JZ EXIT ;若输入若输入 KEY 为为“ESC”则跳转到退出则跳转到退出 EXIT LEA DI,KEYS MOV CX,21 FIND: CMP AL,DI JZ SING ;找到找到 KEY 相对应的偏移地址相对应的偏移地址 DI 则跳则跳 转至转至 SING INC DI LOOP FIND ;根据输入根据输入 KEY 的的 ASCII 码找到相对应码找到相对应 的偏移地址的偏移地址 LEA DX,REMI M

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论