电子琴微机课程设计.doc_第1页
电子琴微机课程设计.doc_第2页
电子琴微机课程设计.doc_第3页
电子琴微机课程设计.doc_第4页
电子琴微机课程设计.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

武汉理工大学微机原理与接口技术课程设计说明书音乐演奏程序设计1设计任务使用汇编语言设计一个在计算机上运行的音乐演奏程序,屏幕显示钢琴图像,按“A”键唱乐曲,按“X”鍵退出。2任务扩展实现以下附加功能之一:(1)按“B”键,播放暂停;(2)按“C”键,实现重复播放;(3)按“D”键,加快播放速度;(4)按“E”键,降低播放速度;(5)按“F”键,直接跳转到下首歌。我选择的附加功能是按“F”键,直接跳转到下一首歌。3程序设计3.1程序设计思路画钢琴界面时,先画出一个钢琴键,然后再用循环画出其余的钢琴键。画单个钢琴键时,先画出下面的长方形,然后画出上面的平行四边形,然后画出右边的短横线,短横线也是用循环的方法画出那么多来的。画完所有的钢琴键后,再单独画出最后一个键右边的平行四边形阴影。实现下一首功能是通过改变FLAG的值,让FLAG自动加一,然后比较FLAG里面的值,按顺序跳到相应的地址,播放相应的音乐。当FLAG的值为3后,自动将FLAG值改为零,此时再按下“F”,FLAG的值就会加一,变为“1”,然后又开始播放第一首歌。任何时刻按下“X”,就会退出程序。3.2程序流程图 单个钢琴键的绘制程序的流程图如下:清频设置起始点的坐标调用宏DRAW_REGTANGLE绘制键根部分键根绘制完毕?绘制下一个键NY图 3.1:单键绘制流程图 整个钢琴键盘绘制程序的流程图如下:设置CX=12绘制单键,并改变起始坐标绘制键间横线,并改变起始坐标CX=0绘制最后一个键绘制右侧阴影进入音乐播放模块NY图3-2:钢琴键盘绘制流程图 音乐播放程序的流程图如下:操作提示界面读取音乐段首地址,设置FLAG值按下X?按下A?从第一个频率地址开始播放音乐调用宏ADDRESS读取下一个频率地址按下了X?按下了F?继续播放音乐直到检测到-1,播放结束退出DOS操作界面FLAG值变了,比较跳到对应的地址播放音乐按下其他键?错误提示YNNYYNYNNY图3-3:音乐播放程序的流程图3.3程序清单 汇编程序的所有源代码如下:;画横线DRAW_LINEX MACRO START_X,START_Y,END_X,COLOR LOCAL PAINT PUSH AX PUSH BX PUSH CX PUSH DX MOV CX,START_X MOV DX,START_Y ;设置起始坐标 MOV AH,0CH ;写像素MOV AL,COLOR ;颜色设置MOV BX,0 ;在当前页操作PAINT: INT 10H ;调用中断进行画一个像素点INC CX ;每画一个像素点,横坐标加一CMP CX,END_X ;判断是否画完JNZ PAINT ;未画完,就继续画下一个像素POP DX POP CX POP BX POP AX ENDM ; 画竖线DRAW_LINEY MACRO START_X,START_Y,END_Y,COLORLOCAL PAINT1PUSH AXPUSH BXPUSH CXPUSH DX MOV CX,START_XMOV DX,START_YMOV AH,0CHMOV AL,COLORMOV BX,0PAINT1:INT 10HDEC DX ;没画完一个像素点,纵坐标减一CMP DX,END_Y ;判断是否画完JNE PAINT1 ;未画完,继续画下一个像素点POP DXPOP CXPOP BXPOP AXENDM;画矩形 DRAW_REGTANGLE MACRO START_X,START_Y,END_X,END_Y,COLOR LOCAL DRAW_NEXTPUSH AXPUSH BXPUSH CXPUSH DXMOV AH,0CHMOV AL,COLORMOV BH,0MOV CX,START_XMOV DX,START_YDRAW_NEXT:INT 10HINC CXCMP CX,END_X ;判断一行是否画完JNE DRAW_NEXT ;未画完继续MOV CX,START_X ;回到起始横坐标DEC DX ;每画完一行,列坐标减一CMP DX,END_Y ;判断矩形是否画完JNE DRAW_NEXT ;未完继续画下一行POP DXPOP CXPOP BXPOP AXENDM ;画右斜平行四边形DRAW_PARALLELOGRAMX MACRO START_X,START_Y,END_X,END_Y,COLORLOCAL DRAWPX PUSH DS PUSH SS MOV SI,START_X MOV DI,START_Y;设置起始坐标 MOV BP,END_XDRAWPX: DRAW_LINEX SI,DI,BP,COLOR ;调用画横线宏 INC SI ;每画完一行,横坐标起始点加一 INC BP ;横坐标终点加一 DEC DI ;纵坐标起始点减一 CMP DI,END_Y ;判断是否画完 JNE DRAWPX ;未画完,继续画下一行POP DSPOP SS ENDM ; 画阴影四边形DRAW_PARALLELOGRAMY MACRO START_X,START_Y,END_X,END_Y,COLORLOCAL DRAWPY PUSH DS PUSH SS MOV SI,START_X MOV DI,START_Y MOV BP,END_YDRAWPY: DRAW_LINEY SI,DI,BP,COLOR ;调用画竖线宏 INC SI ;每画完一列,横坐标起始点加一 DEC BP ;纵坐标终点减一 DEC DI ;纵坐标起始点减一 CMP SI,END_X ;判断是否画完 JNE DRAWPY ;未画完,继续画下一列POP SSPOP DS ENDM ;画间隙中的横线(侧边部分)DRAW_PARALINE1 MACRO START_X,START_Y,END_Y1,COLOR LOCAL NEXT_LINE1 PUSH AXPUSH BXPUSH CXPUSH DXPUSHFPUSH DSMOV CX,START_X MOV DX,START_YMOV SI,START_XADD SI,2 ;横线长度为2MOV AH,0CH MOV AL,COLOR MOV BX,0 NEXT_LINE1:INT 10HINC CX CMP CX,SIJNE NEXT_LINE1 MOV CX,START_X SUB DX,2 ;横线间间隙为2CMP DX,END_Y1JAE NEXT_LINE1POP DSPOPF POP DX POP CX POP BX POP AX ENDM ;画间键身间隙间的横线(键体部分)DRAW_PARALINE2 MACRO START_X,START_Y,END_Y2,COLOR LOCAL NEXT_LINE2,GO_ONPUSH AXPUSH BXPUSH CXPUSH DXPUSHFPUSH DSPUSH SSMOV SI,START_XMOV DI,START_YMOV BP,START_XADD BP,2 ;横线长度为2MOV AH,0CH MOV AL,COLOR MOV BX,0 GO_ON:ADD SI,2 ;每画完一条,起始横坐标加2SUB DI,2 ;纵坐标减2ADD BP,2 ;终点横坐标加2MOV CX,SIMOV DX,DI ;重新设置起始点坐标NEXT_LINE2:INT 10HINC CX ;画完一个像素点,横坐标加一CMP CX,BP ;判断一条横线是否画完JNE NEXT_LINE2 ;未画完,继续画CMP DX,END_Y2 ;判断是否全部画完JA GO_ON ;未完,继续POP DSPOP SSPOPF POP DX POP CX POP BX POP AX ENDM DATA SEGMENT WHITE DB 0FFH BLACK DB 0 YELLOW DB 88H GRAY DB 8 ;键盘颜色定义STARTX DW 100 ;起始横坐标STARTY DW 300 ;起始纵坐标ENDXDW 130ENDY DW 280LASTX DW ?LASTY DW 200FLAG DB 1RATEDW ? ;播放速度变量INFO1 DB 0DH,0AH,Welcome to this interface!$INFO2 DB 0DH,0AH,Please enter A to start!$INFO3 DB 0DH,0AH,OPTIONS:$INFO4 DB 0DH,0AH,WRONG ORDER!$INFO5 DB 0DH,0AH,INPUT AGAIN!$INFO6 DB 0DH,0AH,GO TO NEXT MUSIC!$MUSLIST DB 0DH,0AH,A: START DB 0DH,0AH,F: NEXT MUSIC DB 0DH,0AH,X: ESC DB 0DH,0AH,$ ;提示语;音乐一-MUS_FREG1 DW 330,294,262,294,3 DUP (330) DW 3 DUP (294),330,392,392 DW 330,294,262,294,4 DUP (330) DW 294,294,330,294,262,-1MUS_TIME1 DW 6 DUP (25),50 DW 2 DUP (25,25,50) DW 12 DUP (25),100;音乐二-MUS_FREG2 DW 330,392,330,294,330,392,330,294,330 DW 330,392,330,294,262,294,330,392,294 DW 262,262,220,196,196,220,262,294,332,262,-1MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100 DW 2 DUP(50,50,25,25),100 DW 3 DUP(50,25,25),100;音乐三-MUS_FREG3 DW 262,262,294,262,349 DW 330,262,262,294,262 DW 392,349,262,262,523 DW 440,349,262,262,466 DW 466,440,262,392,349,-1MUS_TIME3 DW 50,50,100,100,100 DW 100,100,50,50,100,100 DW 100,100,100,50,50,100 DW 100,100,100,100,100,50 DW 50,100,100,100,100,100 ;音乐段DATA ENDSSTACK SEGMENT DB 400 DUP (STACK)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: ;主程序MOV AX,DATAMOV DS,AXCALL PIANOCALL MUSIC_PLAY; 音乐播放子程序MUSIC_PLAY PROCSHOW MACRO b ;定义一个宏显示字符串 LEA DX,b MOV AH,9 INT 21H ENDMADDRESS MACRO A,B ;音乐地址宏LEA SI,ALEA BP,DS:BENDM SHOW INFO1 SHOW INFO2 SHOW INFO3 SHOW MUSLIST ;提示语INPUT: MOV AH,01H INT 21H CMP AL,X JZ RETU ;按下为X则退出dos CMP AL,A ;按下为A则播放音乐 JZ A0 ;是则跳到A0 SHOW INFO4 SHOW INFO5 JMP INPUT ;否则提示输入错误,重新开始A0: ADDRESS MUS_FREG1,MUS_TIME1MOV RATE,7500 ;设置正常播放速度 CALL MUSIC JMP AGAINF0: CMP AL,FJNZ EXIT NEXT:SHOW INFO6ADD FLAG,1NUM1: CMP FLAG,1 JNZ NUM2ADDRESS MUS_FREG1,MUS_TIME1 CALL MUSICJMP AGAINNUM2: CMP FLAG,2JNZ NUM3ADDRESS MUS_FREG2,MUS_TIME2 CALL MUSICJMP AGAINNUM3: MOV FLAG,0ADDRESS MUS_FREG3,MUS_TIME3 CALL MUSICJMP AGAINRETU:MOV AH,4CHINT 21HAGAIN: SHOW INFO5 JMP INPUTEXIT: SHOW INFO4 ;按键错误,重新选择 SHOW INFO5 JMP INPUTRETMUSIC_PLAY ENDP;发声GENSOUND PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL,0B6H ;开扬声器 OUT 43H,AL MOV DX,12H MOV AX,348CH DIV DI OUT 42H,AL MOV AL,AH OUT 42H,AL IN AL,61H MOV AH,AL OR AL,3 OUT 61H,ALWAIT1: MOV CX,RATE ;设置播放速度 CALL WAITFDELAY1: DEC BX JNZ WAIT1 MOV AL,AH OUT 61H,AL POP DI POP DX POP CX POP BX POP AXRETGENSOUND ENDPWAITF PROC NEAR PUSH AXWAITF1: IN AL,61H AND AL,10H CMP AL,AH JE WAITF1 MOV AH,AL LOOP WAITF1 POP AX RETWAITF ENDPMUSIC PROC NEAR PUSH DS SUB AX,AX PUSH AXFREG: MOV DI,SI ;获取频率值 CMP DI,-1 ;音乐播放结束判断 JE END_MUS MOV BX,DS:BP CALL GENSOUND ;播放一个频率 ADD SI,2 ADD BP,2 ;获取下一频率值,及其播放时间MOV AH,0BH ;判断键盘是否有键按下INT 21HCMP AL,0FFHJE INT9 ;有键按下则转去执行该指令 JMP FREG ;无键按下则继续读取下一个频率值END_MUS: RETINT9:PUSHFPUSH AXPUSH DS PUSH ESPUSH CSPOP DSPUSH CSPOP ES IN AL,60H ;从键盘获取该键值ASCII码MOV AH,0INT 16H ;读取并保存到AL中CMP AL,X ;若为X则退出dos操作界面JZ X0CMP AL,F ;若为F则跳到下一首JZ NEXT1INT9_QUIT:POP ESPOP DSPOP AXPOPF JMP FREGX0:POP ESPOP DSPOP AXPOPFJMP RETUNEXT1: POP ESPOP DSPOP AXPOPFJMP NEXTMUSIC ENDP; 键盘绘图PIANO PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXMOV AH,0 ; 设置屏幕显示图形方式:每屏幕字符数8025, 16色MOV AL,12H INT 10H ; 调用10H的0号功能中断; 键盘绘制主程序MOV CX,12DRAWING:CALL PIANO_DRAWCALL LINE_DRAWLOOP DRAWINGCALL PIANO_DRAWADD STARTX,30PUSH DXMOV DX,STARTXMOV LASTX,DXADD LASTX,80POP DXADD ENDX,30DRAW_PARALLELOGRAMY STARTX,STARTY,LASTX,ENDY,GRAYDRAW_LINEX 100,300,STARTX,GRAYPOP DXPOP CXPOP BXPOP AXRETPIANO ENDPPIANO_DRAW PROCDRAW_REGTANGLE STARTX,STARTY,ENDX,ENDY,WHITE DRAW_LINEX STARTX,ENDY,ENDX,GRAY DRAW_PARALLELOGRAMX STARTX,ENDY,ENDX,LASTY,WHITE RET PIANO_DRAW ENDP LINE_DRAW PROCDRAW_PARALINE1 ENDX,STARTY,ENDY,YELLOWDRAW_PARALINE2 ENDX,ENDY,LASTY,YELLOWADD STARTX,32ADD ENDX,32RETLINE_DRAW ENDPCODE ENDSEND START4程序运行与调试4.1运行程序 把编好的源程序命名保存为YINYUE.asm,在MF2KP集成环境中进行调试,首先点运行选项中的调试,如果编译成功,就选择运行选项中的生成exe文件,这样就产生了一个可运行程序,然后点击运行,就会看到与题目要求相符的界面.程序运行截图:开始界面:图4-1:开始界面 运行开始后显示钢琴界面,并显示提示语言。播放界面:图4-2:播放界面 输入“A”后,开始正常播放音乐。下一首界面:图4-3:下一首界面 正常播放时再按下“F”,就跳到下一首进行播放。输入错误界面:图4-4:输入错误界面开始时如果输入的不是“A”,则提示输入错误,要求重新输入。另外,在任何时候按下“X”,立刻退出程序。4.2调试程序编好源程序后,需要对它进行修改和完善,具体做法是:把源程序放在MF2KP集成环境中进行编译,如果源程序中有错误,编译时系统就会给出提示,根据系统提示我们可以找到是哪一行出现了问题,对其进行分析并修改,重新编译,直到编译时系统对那一行没有给出提示为止。如果系统提示源程序中存在多条错误,就按照上述方法逐条进行修改,直到系统提示编译成功。此时运行程序,就可以得到与任务书中要求的音乐播放功能。在调试过程中,出现了很多问题,刚开始对源程序进行编译时,画钢琴界面的那一块程序错误比较多,查阅资料后才知道,是我在编写程序的时候,把INT 10H的调用功能记错了,经过修改,把这些问题都解决了。在调试过程中,故障是不可避免的,产生故障的原因很多,情况也很复杂,有的是一种原因引起的简单故障,有的上多种原因相互作用引起的复杂故障,因此需要掌握故障的一般诊断方法,故障诊断过程就是以故障现象出发,通过反复测试,做出分析判断,逐步找出故障的过程。经过反复修改,最终得到了正确的源程序,即调试成功!5心得体会经过两周努力和不断的调试,我的微机原理与接口技术课程设计终于要完成了,回想起这两周的课程设计,颇有一些感慨。此次课程设计的题目对我来说并不简单,由于汇编知识

温馨提示

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

评论

0/150

提交评论