资源预览内容
第1页 / 共25页
第2页 / 共25页
第3页 / 共25页
第4页 / 共25页
第5页 / 共25页
第6页 / 共25页
第7页 / 共25页
第8页 / 共25页
第9页 / 共25页
第10页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
目录1总体方案设计与论证21.1课程设计程序功能分析21.2 方案设计与论证22程序流程图设计42.1主程序流程图42.2暂停程序流程图52.3错误程序流程图53程序段落说明73.1初始化字符串输出73.2键盘输入与判断103.3暂停程序分支124程序调试说明、结果记录与分析144.1程序调试说明144.2程序调试、运行结果与分析145课程设计收获与心得体会166参考文献17附录:程序清单18键盘钢琴汇编语言程序设计1总体方案设计与论证1.1课程设计程序功能分析本次课设要求编写程序具体功能如下:(1)自定义钢琴键;(2)单击钢琴键,计算机发出相应音阶,发声时间自定义。(3)单击“ESC”键退出程序。通过分析程序功能要求并结合计算机内部8255、8253和扬声器的连接方 式可知为实现功能须对8255、8253对应接口赋予相应的值实现扬声器的开关。 除了要求的ESC完成退出程序外,我还设计了单击SPACE完成暂停功能,而这 些都可以通过条件转移指令实现。此外,我还要通过DOS功能调用实现彩色提 示字符的输出。1.2方案设计与论证根据前面分析可知,本程序主要是要实现字符串输出,字符输入及识别,发 声,暂停和退出程序的功能。其中,根据实现字符识别的不同方式有两种设计方 案,先阐释如下:方案一:字符串输出使用DOS功能调用,通过对行、列置入不同的字符实现 彩色提示字符的闪灭。字符输入使用单字符输入方式(1号)实现。为实现字符 识别,可通过多个条件转移指令,每次对一个字符进行判断,不是则转移到下一 个判断处。通过对8255、8253对应接口赋予相应的值实现发声功能。暂停和退 出功能也同样使用条件转移指令完成。由于进行字符识别时需要21个不同的条 件转移指令,使得程序变得极为臃长,不是最佳方案。方案二:字符串的输出,字符输入,发声,暂停和退出功能同方案一相同。 对于字符识别,则预先将与琴键对应得键位作为数据段的一部分保存,输入一个 字符后将其与之依次比较,实现识别功能。该方案使得程序变得简洁有效并增加 了可读性。根据上述分析,本次课程设计选用方案二。2程序流程图设计由于此次课设程序较为复杂,包含多个跳转和子程序。故在此使用将主程序 流程图和子程序流程图分开叙述的方法,叙述如下:2.1主程序流程图主程序运行后进入DOS界面,首先输出提示字符。接着用户通过键盘输入单 个字符,对其进行判断识别并作出相应处理:ESC时退出程序;SPACE时暂停程 序;除Q-U,A-J,Z-M时输出错误信息;是上述字符时对8255、8253进行初始化,保存音阶并发声并循环输入字符的操作。主程序流程图如图2-1所示:2.2暂停程序流程图当对输入字符判断为空格后,进入暂停子程序。换行后输出暂停信息,对 8255进行清零使得扬声器停止工作。随后对下个输入字符进行判断,若为ESC 则退出整个程序;若为空格则重新进入正常工作状态;若为其他字符则等待下个 字符的输入。流程图如图2.2所示。图2.2暂停程序流程图2.3错误程序流程图当对输入字符判断为空格、ESC、Q-U、A-J、Z-M以外的字符后,进入错误子程序。换行后输出错误信息。随后重新对输入字符进行判断。流程图如图2.3 所示。图2.3错误程序流程图3程序段落说明3.1初始化字符串输出程序开始后先将提示字符串输出。具体就是通过对行、列的赋值改变光标的 置入位置并在相应位置输出字符;通过将空格覆盖实现字符的亮灭;通过DOS 功能调用改变字体的颜色。结束后换行,等待用户输入字符。mov ax,datamov ds, axmov ah, 0mov al, 2int 10h;黑白文本mov cx, 0afffhZF:;输出 welcome to the pc piano!mov dh, 1;彳亍mov dl, 32;列mov ah,2mov bh, 0;页号为0int 10h;置光标位置lea dx,str1mov ah, 9int 21h;显示字符串mov dh,1mov dl,32mov ah,2mov bh,0int 10h;置光标位置lea dx,str2mov ah, 9int 21hsub cx, 1jnz ZF;不等于转移mov al, 3mov ah, 0int 10h;设置为16色文本mov dx,offset str3;输出输入ESC退出mov ah,9int 21hmov si,offset str4 ;输出q到u代表高音mov di, 0mov dl, 0kkk1:mov dh,1;dh行 dl列inc dlmov ah,2int 10h;置光标位置mov ah,09;9号功能inc dimov al,siinc simov bh,0;显示页mov bl,0ah;字体颜色mov cx,01;字符重复一次int 10hcmp di, 12hmov si,offsetstr5 ;输出a到j代表中音mov di, 0mov dl, 0kkk2:mov dh,3;dh行 dl列inc dlmov ah, 2int 10h;置光标位置mov ah, 09;9号功能inc dimov al,siinc simov bh,0;显示页mov bl,0eh;colormov cx, 01;字符重复一次int 10hcmp di, 13hjb kkk2mov si,offsetstr6 ;输出z到m代表低音mov di,0mov dl,0kkk3:mov dh,5;dh行 dl列inc dlmov ah,2int 10h;置光标位置mov ah,09;9号功能incdimoval,siincsimovbh, 0;显示页movbl,05h;colormovcx, 01;字符重复一次int10hcmpdi, 10hjb kkk3;输出结束movdl, 0ahmovah, 2int21h;换行movdl,0dhmovah,2int21h;回车3.2键盘输入与判断通过DOS功能调用将键盘输入的字符保存在al中,判断是否为ESC,是则 退出程序。随后判断是否为空格,是则进入暂停子程序,否则继续进行判断。若 为Q-U、A-J、Z-M则进入下一阶段,否则输出错误信息。input:mov ah,01h;键盘输入int 21hcmp al,1bhje quit1;检测是否是ESC按键,是则退出cmp al,20hjz zanting1;若是空格则暂停钢琴弹奏mov si, 0mov cx, 21loop1:;检测对应的SRcmp al,SR+sije soundinc siloop loop1jmp error1;跳转到error分支quit1:jmp quit2error1:;error 分支mov dl, 0ah;换行mov ah, 2int 21hmov dl, 0dh;回车mov ah,2int 21hlea dx,error;输出error提示信息mov ah , 09hint 21hjmp inputquit2:;程序退出mov ah, 4chint 21h3.3暂停程序分支如果将输入字符判断为空格则进入暂停分支,换行回车后输出暂停信息,随 后通过对8255清零实现发声器停止发声。然后再次对输入字符进行判断,若为 ESC则结束程序,若为空格则结束暂停继续程序,若为其它键则输出字符但扬声器不发声。;暂停分支zanting1:mov dl, 0dh;换行回车out 61h, al;8255的B口输出0h,使8253(GATE2=0)暂停工作,停止发声;8255的B口输出0h,使8253(GATE2=0)暂停工作,停止发声mov ah, 2int 21hmov dl,0ahmov ah,2int 21hlea dx,zanting ;输出暂停提示语mov ah , 09hint 21hmov al,0hmov cl, 10loop2:mov ah,01hint 21hcmp al, 1bhje quit1cmp al, 20hjz inputinc clloop loop23.4发声、延时程序分支进入发声程序分支后,首先将8255的B 口置为3并输出,实现8253和扬声 器的启动。随后将控制字输出到8253的控制端口实现初始化。将相应频率计算 成为对应N值后赋给8253的通道2进行计数、发声。通过延时程序控制发声的长短,即2800*10000*单位机器周期。sound:;发音分支push axmov ax, 2mul simov si, axmov al, 3hout 61h,al;8255 的B口输出 00000011hmov al,0b6h;初始化8253,选通8253通道2,16位读写,工作在方式3,二进制计数out 43h, almov dx,12h;8253主频1.1931817或 1234dcH MHzmov ax, 34dchdiv YJ+si;折换成音阶频率对应的N值。out 42h,al;8253通道2数据口赋初值mov al,ahout 42h, al pop axmov bx,10000;延时程序wait:mov cx, 2800 delay:loop delay dec bx jnz wait and al, 0 out 61h, aljmp input;跳转到i nput重新开始工作4程序调试说明、结果记录与分析4.1程序调试说明程序调试主要有两种方式;其一,直接编译连接运行程序,然后输入不同数 据测试程序是否具备预期功能。然后可以尝试违背程序操作规定,输入非法数据 已测试程序的健壮性。其二,当程序运行结果出错时,就进入调试界面,选取想 要跟踪的项目然后单步运行程序以查清程序出错原因。4.2程序调试、运行结果与分析(1)首次运行程序,出现错误提示语句relative jump out of range by 000Bh.经过验证,程序逻辑没有明显错误,为了找到出错原因,我打开MF2KP 进入调试界面,进行单步运行,发现是使用je跳转时跳跃距离过长导致错误, 因此我将程序进行了修改,使用了 je和jmp两次跳转的方法将问题解决。错误 信息如图4.1所示。所示(3)输入。-U、A-J、Z-M字符后程序正常运行,发出相应的声音,如图4.3图4.3正常输入字符(
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号