小鸟动画程序课程设计.docx_第1页
小鸟动画程序课程设计.docx_第2页
小鸟动画程序课程设计.docx_第3页
小鸟动画程序课程设计.docx_第4页
小鸟动画程序课程设计.docx_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

武汉理工大学微机原理与接口技术课程设计说明书课程设计任务书学生姓名: 梅浪奇 专业班级: 自动化1002 指导教师: 张素文 工作单位: 自动化学院 题 目: 小鸟动画程序 初始条件:在屏幕显示一小鸟,按S飞翔,按B鸣叫,按P暂停,按Q退出程序。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1) 设计任务及要求分析(2) 方案比较及认证说明(3) 系统原理阐述(4) 硬件设计课题需要说明:硬件原理,电路图,采用器件的功能说明(5) 软件设计课题需要说明:软件思想,流程图,源程序及程序注释(6) 调试记录及结果分析(7) 总结(8) 参考资料(9) 附录:芯片资料或程序清单,软件演示屏幕拷贝图或硬件实物图时间安排:1月2日1月3日:收集资料,方案选择1月4日1月7日:整体流程,程序细节1月8日1月10日:调试程序,报告撰写1月10:交设计报告,程序演示,答辩指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日摘要随着计算机的快速发展,用汇编语言来实现动画更简单,直接和便捷,它的目标代码简短,占用内存较少,执行速度较快,是高效的程序设计语言。本文主要对小鸟动画进行程序设计,并通过masm软件进行运行。通过输入不同的字符对程序的控制,采用调用子程序的方法来实现,使用了堆栈技术和中断技术,来实现按下字符S,小鸟飞过,按B,小鸟鸣叫,按P暂停,按C继续,按下Q,则退出程序等功能。文中对程序设计的思路进行了详细的解析,并给出其流程图和程序代码,同时也对此程序设计的不同方案进行了比较选择。本程序可在windows 2000,windows xp上运行。所需要的工具软件为MASM2.0及以上版本,先生成.asm文件,再生成.exe的文件,然后运行。关键词:小鸟动画,masm软件,中断,子程序调用目 录课程设计任务书I摘要II小鸟动画程序11设计任务及要求分析12程序整体设计及方案选择22.1整体设计思路阐述22.2基本模块方案选择32.2.1小鸟图案显示方案选择32.2.2小鸟发声鸣叫方案选择43程序各模块设计73.1主程序设计73.1.1主程序设计思路73.1.2主程序流程图设计73.1.3主程序代码设计83.2小鸟飞翔子程序设计103.2.1小鸟飞翔子程序设计思路103.2.2小鸟飞翔子程序流程图设计103.2.3小鸟飞翔子程序代码设计113.3小鸟鸣叫子程序设计123.3.1小鸟鸣叫子程序设计思路123.3.2小鸟鸣叫子程序流程图设计133.3.3小鸟鸣叫子程序代码设计143.4小鸟飞翔并鸣叫子程序设计153.4.1小鸟飞翔并鸣叫子程序设计思路153.4.2小鸟飞翔并鸣叫子程序流程图设计153.4.3小鸟飞翔并鸣叫子程序代码设计163.5暂停子程序设计173.5.1暂停子程序设计思路173.5.2暂停子程序流程图设计183.5.3暂停子程序代码设计193.6小鸟显示子程序设计203.6.1小鸟显示子程序设计思路203.6.2小鸟显示子程序流程图设计203.6.3小鸟显示子程序代码设计214调试记录及结果分析234.1调试记录及结果分析234.2调试中出现的问题及解决方案255.小鸟动画程序的优化275.1小鸟动画优化275.2小鸟动画背景颜色优化276心得与体会287参考文献29附录1:小鸟动画程序30附录2:本科生课程设计成绩评定表4647小鸟动画程序1设计任务及要求分析设计任务要求在屏幕显示一小鸟,按S飞翔,按B鸣叫,按P暂停,按Q退出程序。而为了满足更人性化的要求,本文另增加功能键C,以在按P暂停时,还能回到原状态。基于以上考虑,现将设计要求总结如下:程序运行后,在无输入情况下,屏幕上显示小鸟图案;程序运行后,按下S键,小鸟飞翔;按下B键,小鸟鸣叫;按下P键,程序暂停;按下Q键,程序结束;在飞翔状态下,按B键,小鸟同时鸣叫;按P键,程序暂停;按下Q键,程序结束;在鸣叫状态下,按S键,小鸟同时飞翔;按P键,程序暂停;按下Q键,程序结束;在同时飞翔和鸣叫状态下,按B键,小鸟只鸣叫,回到功能4;按S键,小鸟只飞翔,回到功能3;按P键,程序暂停;按下Q键,程序结束;在暂停状态下,按C键,程序回到暂停前状态继续运行;按下Q键,程序结束;任何情况下,当输入无效键时,程序循环等待下一次输入。下面将以以上要求为指导,进行程序设计和仿真调试,完成小鸟动画程序2程序整体设计及方案选择2.1整体设计思路阐述跟据第一节对设计任务的分析,此程序将通过子程序的调用来实现。在主程序中显示小鸟,且循环检测键盘输入,并执行相应子程序。当按键为Q时,调用结束子程序;当按键为P时,调用暂停子程序;当按键为S时,调用小鸟飞翔子程序;当按键为B时,调用小鸟鸣叫子程序;当无按键输入或按键为其它时,循环显示小鸟并检测键盘输入。在小鸟飞翔子程序中,当按键为Q时,调用结束子程序;当按键为P时,调用暂停子程序;当按键为B时,调用小鸟飞翔并鸣叫子程序;当无按键输入或按键为其它时,循环显示小鸟并检测键盘输入。在小鸟鸣叫子程序中,当按键为Q时,调用结束子程序;当按键为P时,调用暂停子程序;当按键为S时,调用小鸟飞翔并鸣叫子程序;当无按键输入或按键为其它时,循环显示小鸟并检测键盘输入。在小鸟飞翔并鸣叫子程序中,当按键为Q时,调用结束子程序;当按键为P时,调用暂停子程序;当按键为S时,调用小鸟飞翔子程序;当按键为B时,调用小鸟鸣叫子程序;当无按键输入或按键为其它时,循环显示小鸟并检测键盘输入。在暂停子程序中,当按键位Q时,调用结束子程序;当按键为C时,返回暂停前程序;当无按键输入或为其它时,循环子程序,保持暂停状态并持续检测键盘输入。可以发现,只要实现了上述程序设计即可满足设计要求。下面给出主程序的粗略流程图如图1所示,至于主程序及各子程序的具体实现将在第3节详细讨论。图1 主程序流程图2.2基本模块方案选择此程序的基本模块是小鸟的图案显示和发声鸣叫,其飞翔及飞翔时鸣叫均是基于此模块。鉴于此,下面首先对小鸟的图案显示和发声鸣叫做出具体的方案比较及选择。2.2.1小鸟图案显示方案选择通过查阅资料,形成小鸟图像有两种方法:一种是字符形成小鸟图像(即文本方式);另一种是像素点形成小鸟图像(即图形方式)。方案一:用字符形成小鸟图像,主要是利用BIOS中的INT 10H中断,即显示器中断,INT 10H中的09H号功能是在光标制定位置处写字符和属性。程序结构图大致如下:MOV AH,09H ;置光标MOV AL,字符 ;字符ASCII码MOV BL,7 ;字符属性MOV BH,0 ;第0页MOV CX,数量值 ;字符重复个数INT 10H方案二:用图形方式形成小鸟图像,是利用像素来产生彩色图案,它也是利用BIOS中的INT 10H的功能00H来设置图形方式。程序结构大致如下面所示:MOV AH,00H ;请求设置方式MOV AL,0CH ;彩色图形INT 10H ;调用中断服务在显示小鸟图像的两个方案中,方案一具有数据量少,操作简单的特点,但显示的图形与实际物体有偏差;方案二中显示的图像形象逼真,但它的数据量极其大,操作起来有点困难。鉴于以上的比较,在小鸟显示图像这个环节决定采用方案一,以减小操作量。在小鸟显示时,为了实现简单且达到较好的视觉效果,将小鸟图案设置为三幅图案组合而成的动态拍翅图案。这三幅图案分别表示小鸟收翅,展翅,拍翅三个画面,并循环显示以达到较好的视觉效果。至于其具体实现过程在第3.6节做详细叙述。2.2.2小鸟发声鸣叫方案选择小鸟发声程序也是一个比较重要的环节,中间涉及到扬声器发声部分。而在关于扬声器发声时,主要有两种方式,分别是以位触发和定时器控制。下面就这两种不同的方式确定两个不同的设计方案。 方案一:发声采用位触发方式。程序直接控制PPI(8255可编程序外围接口芯片)的输出控制寄存器(I/O端口为61H)的第一位,使该位按所需的频率进行1和0的交替变化,从而产生一串脉冲控制波形,这些脉冲经过放大后驱动扬声器发出声音。 可以利用软件延时来控制所产生的脉冲波形的长度和脉宽,就可以实现产生不同频率和不同音长的声音。软件实现的程序如下: IN AL,61H MOV AH,AL AND AL,0FCH ;关断定时器通道2的门控 SOUND:XOR AL,2 ;触发61H端口第1位 OUT 61H,AL MOV CX,DX ;(DX)=控制脉冲的计数值 WAIT: LOOP WAIT ;延时循环 DEC BX ;(BX)=脉冲持续的时间 JNZ SOUND MOV AL,AH OUT 61H,AL ;恢复61H端口 在本方案中,通过程序的方法来控制PB1,使其在1和0之间按一定的频率变,从而产生一串脉冲。控制脉冲宽度的计数值的算法如下: 计数值=2801*100/音频 (1)如果音频为f,则脉冲周期1/f一个半波的时间为1/2f秒,而1/2f秒的延时可简单地通过LOOP指令的循环来取得,由于2801次LOOP指令循环执行所需时间是10MS,所以一秒钟时间约执行2801*100次LOOP指令。控制脉冲宽度的计数值的实现程序如下:MOV BX,100WAIT: MOV CX,2801 DELAY: LOOP DELAYDEC BX JNZ WAIT 算出了脉冲宽度,再通过高低电平的不断变换,就可实现不同频率的脉冲方波。把此方波经滤波放大即可驱动扬声器发声了。 方案二:利用定时器发声。这里是通过硬件即8253定时器产生声音。 CPU通过对定时器的通道2进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低位控制通道2门控的开断,以产生特殊的音响。当定时器接收的计数值为533H时,能产生896Hz的声音,因此产生其他频率的计数值就可由下式计算:计数值=533H896 f=1234DCH f 在送出频率计数值之前,还要给方式寄存器送一个方式值,该数决定对哪一个通道编程,采用什么模式,送入通道的计数值是一字节还是两字节,是二进制码还是BCD码。其位组合的格式如下: 当通道2用于发声时,采用的是模式3,在模式3下,输出线为“1”和为“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。 产生指定频率声音的程序段如下:PUSH AX;保存ax的值MOV AL,0B6H ;给2号定时器的43端口送入一个特定的数0B6HOUT 43H,ALMOV AX,34DCHDIV BXOUT 42H,AL ;给42H端口装入一个16位的计时常数(533H*896/频率)MOV AL,AHOUT 42H,ALIN AL,61H;获取61h端口的当前值ORAL,03H;把61h端口低二位置1,即打开蜂鸣器OUT61H,AL;输出数据到61h端口POPAX;恢复ax的值对于小鸟发声区别在于以不同的方式来驱动扬声器发声。经对比可知,两种方案都各有优缺点。在方案1中,其优点是电路简单,所用的器件芯片少,主要芯片只有需一片8255,产生方波是通过软件来实现的,易于修改和维护。然而它也存在一定的缺点,就是系统不断地通过软件来产生方波,系统资源被占用,无法再做其它事。与方案1相比,方案2增加了一个8253芯片和一个与门,虽然电路比方案1复杂,但通过定时器产生方波,实现起来比较简单,而且也不会出现系统资源被全部占用的情况。 所以经过分析,小鸟发声程序选择方案二进行设计。3程序各模块设计3.1主程序设计3.1.1主程序设计思路在主程序中主要完成小鸟显示功能和键盘检测功能。小鸟显示功能可以通过调用小鸟显示子程序实现,小鸟显示子程序将在第3.6节详细介绍。每调用一次可以也只能显示一幅小鸟图案,这里因为要显示由三幅小鸟图案组合而成的动态图案,所以需调用三次小鸟显示子程序。每一次调用前还需将要显示的图案的变量地址传送给寄存器DI。要注意的是,在调用小鸟显示子程序之前还必须设置屏幕的显示方式。显示方式的设置可以通过调用BIOS的10H号中断的0号功能来实现,这里将显示方式设置为80*25黑白图形方式。键盘检测功能可以通过调用BIOS的16H号中断实现。BIOS的16H号中断用于键盘I/O中断调用,为了实现有无字符输入检测,这里使用其1号功能。当无字符输入时,标志位ZF置1;当有字符输入时,ZF清零。通过标志位的判断,即可执行不同的选择。当有按键按下时,输入字符的ASCII码就传送给了寄存器AL,通过将AL的内容与对应字符的ASCII码进行比较就执行不同的选择。每一次有字符输入后,无论是执行何种操作,在比较判断之后一定要将键盘缓存区清空,以保证下一次的键盘字符检测能顺利执行。键盘缓存区的清空可以通过调用BIOS的16H号中断的0号功能实现。为了便于人机交流,在主程序开始时还设计提示语句显示功能,这可以通过调用DOS的21H号中断功能实现。3.1.2主程序流程图设计通过以上主程序设计思路分析,可设计其详细流程图如图2所示。 图2 主程序流程图(详)3.1.3主程序代码设计MAIN PROC mov ah,0 ;设置显示方式为80*25黑白图形方式 mov al,2 int 10hlea dx,info1 ;在显示器上显示字符串提示信息 mov ah,9 int 21hlea dx,info2 ;在显示器上显示字符串提示信息 mov ah,9 int 21hDISP0:LEA DI,BIRD1 ;显示小鸟CALL DISPLAY0LEA DI,BIRD2CALL DISPLAY0 LEA DI,BIRD3 CALL DISPLAY0 mov ah,1 ;从键盘读取字符到AL寄存器 int 16h JZ DISP0 ;若无输入则循环显示小鸟 CMP AL,Q JNZ A0CALL FAR PTR QUIT ;若输入Q则结束,退出程序 A0: CMP AL,P JNZ B0MOV COUNT0,0 CALL PAUSE ;若输入P则暂停B0:CMP AL,SJNZ C0 CALL FLY ;若输入S则小鸟飞翔C0: CMP AL,BJNZ D0CALL FAR PTR BLEAT ;若输入B则小鸟鸣叫 D0: mov ah,0 ;清空键盘缓存区 int 16h JMP DISP0 ;若输入其它字符仍循环显示小鸟 RETMAIN ENDP3.2小鸟飞翔子程序设计3.2.1小鸟飞翔子程序设计思路因本程序中小鸟显示图案是向前移动的动画图案,由于小鸟显示子程序中已包含清屏和延时操作,故只需在每一次动态图案后将光标位置前移一格,并循环显示即可让动态的小鸟图案向前移动。在小鸟飞翔子程序中同样需要检测键盘操作,其功能在第一节已作叙述,对应的实现方法也与主程序类似,这里不再详述。为了使小鸟在从飞翔子程序跳到鸣叫子程序或其他子程序中再回来时不改变位置,这里在内存中定义一个变量,设为DXF用于跟踪小鸟飞翔的位置。具体做法是在小鸟跳出飞翔子程序前,将DX的值传送给DXF,而在调回飞翔子程序后,则又将DXF的值传送给DX。通过以上步骤,就能实现对小鸟飞翔位置的跟踪。3.2.2小鸟飞翔子程序流程图设计通过以上飞翔子程序设计思路分析,可设计其详细流程图如图3所示。其中小鸟动画图案显示在主程序中已作论述,这里不再详述图3 小鸟飞翔子程序流程图3.2.3小鸟飞翔子程序代码设计FLY PROC DISP1:LEA DI,BIRD1 ;显示小鸟CALL DISPLAY0LEA DI,BIRD2CALL DISPLAY0 LEA DI,BIRD3CALL DISPLAY0PUSH AX ;保护AX寄存器 MOV AX,DXFINC AL MOV DXF,AX ;小鸟向前移动1格 POP AX mov ah,1 ;从键盘读取字符到AL寄存器 int 16h JZ DISP1 ;若无输入则循环显示小鸟 CMP AL,Q JNZ A1 CALL FAR PTR QUIT ;若输入Q则结束,退出程序 A1: CMP AL,P JNZ B1MOV COUNT1,0CALL PAUSE ;若输入P则暂停 B1: CMP AL,BJNZ C1 mov ah,0 ;清空键盘缓存 int 16h CALL FAR PTR FLY_BLEAT ;若输入B则小鸟同时鸣叫 C1: mov ah,0 ;清空键盘缓存 int 16h JMP DISP1 ;若输入其它键则持续飞翔等待 RETFLY ENDP3.3小鸟鸣叫子程序设计3.3.1小鸟鸣叫子程序设计思路实现小鸟发声程序的原理:利用8253定时器来驱动扬声器,PC机中有三种不同的定时器。0号定时器用来作为日常通用的时钟,它每秒约发出18次中断一修正时间;1号定时器用于DMA(直接存储器存取)传送数据,连接到扬声器上的是2号定时器,它实际上是一个振荡电路,此电路向扬声器发送指定频率的脉冲,当输出端口61H控制扬声器为接通状态时,就发出了一定频率的声音。在小鸟飞翔子程序中同样需要显示小鸟动画图案并检测键盘操作,对应的实现方法与主程序类似,这里不再详述。3.3.2小鸟鸣叫子程序流程图设计通过以上小鸟鸣叫子程序设计思路分析,可设计其详细流程图如图4所示。其中通用发声子程序只在附录1中给出其程序代码,其具体含义可参考其他书籍,这里不加详述。图4 小鸟鸣叫子程序流程图3.3.3小鸟鸣叫子程序代码设计BLEAT PROC FARFREG: LEA SI,MUS_FREGLEA BP,DS:MUS_TIMEPUSH BXMOV DI,SIMOV DX,DS:BPMOV BX,1400CALL GENSOUND ;调用发声子程序POP BXLEA DI,BIRD1 ;显示小鸟CALL DISPLAY0 LEA DI,BIRD2CALL DISPLAY0LEA DI,BIRD3CALL DISPLAY0 mov ah,1 ;从键盘读取字符到AL寄存器 int 16h JZ FREG ;若无输入则持续鸣叫等待 CMP AL,Q JNZ A2 CALL FAR PTR QUIT ;若输入Q则结束,退出程序 A2: CMP AL,P JNZ B2 MOV COUNT2,0 CALL PAUSE ;若输入P则暂停B2: CMP AL,SJNZ C2mov ah,0 ;清空键盘缓存 int 16h CALL FLY_BLEAT ;若输入S则同时飞翔 C2: mov ah,0 ;清空键盘缓存 int 16h JMP FREG ;若输入其它则持续鸣叫等待 RETBLEAT ENDP3.4小鸟飞翔并鸣叫子程序设计3.4.1小鸟飞翔并鸣叫子程序设计思路此模块的一个简单的设计思路就是在小鸟飞翔子程序中加入带发声功能的延时子程序,这样就能实现小鸟同时飞翔并鸣叫功能。但是如果只是这样,必将使小鸟飞翔的速度变慢,与之前只飞翔的状态衔接不协调。基于此,这里另外设计一个不带延时的小鸟显示子程序,并用它代替原先的小鸟显示子程序,这样处理后在满足小鸟同时飞翔并鸣叫的基础上,又使小鸟在按B前后的飞翔速度相协调,达到满意的效果。由于小鸟鸣叫子程序中已带有延时功能,故只要将其稍加变化即可得到所需的发声延时子程序。这里同样不对发声延时子程序加以详述,只在最后的附录中给出其程序代码。3.4.2小鸟飞翔并鸣叫子程序流程图设计通过以上小鸟飞翔并鸣叫子程序设计思路分析,可设计其详细流程图如图5所示。图5 小鸟飞翔并鸣叫子程序流程图3.4.3小鸟飞翔并鸣叫子程序代码设计FLY_BLEAT PROC DISP2:LEA DI,BIRD1 ;显示小鸟CALL DISPLAY1CALL BLEAT_DLY LEA DI,BIRD2CALL DISPLAY0 LEA DI,BIRD3 CALL DISPLAY0PUSH AXMOV AX,DXFINC AL ;小鸟向前移动1格 MOV DXF,AX POP AX mov ah,1 ;从键盘读取字符到AL寄存器 int 16h JZ DISP2 ;若无输入则持续飞翔等待 CMP AL,Q JNZ A3 CALL FAR PTR QUIT ;若输入Q则结束,退出程序 A3:CMP AL,PJNZ B3MOV COUNT3,0CALL PAUSE ;若输入P则暂停B3:CMP AL,BJNZ C3CALL BLEAT ;若输入B则小鸟只是鸣叫 C3: CMP AL,SJNZ D3CALL FLY ;若输入S则小鸟只是飞翔 D3: mov ah,0 ;清空键盘缓存 int 16h JMP DISP2 ;若输入其它则持续飞翔鸣叫等待 RETFLY_BLEAT ENDP3.5暂停子程序设计3.5.1暂停子程序设计思路在此模块中可以通过调用BIOS的16号中断来实现。若调用前键盘输入缓存区为空,调用后,系统将等待键盘输入以实行后续操作。故只要在调用BIOS的16号中断前将键盘缓存区清空就可实现暂停功能。由于在暂停后还要求能通过按键C使程序能继续往下运行,而每次暂停前的位置不可能完全相同,特别是在不同的子程序中调用暂停操作时,故还需对按下C键后实现分支选择。这里另外在数据段中定义4个变量,分别对应主程序,小鸟飞翔子程序,小鸟鸣叫子程序和小鸟飞翔并鸣叫子程序,并初始化为1。当在各个子程序中调用暂停子程序时,同时将对应的变量置0。到了暂停子程序并按下C键后,首先对各个变量进行检测,并执行变量为0的分支操作,并在返回前又将变量置1,这样就使程序能正确地回的暂停停位置。3.5.2暂停子程序流程图设计通过以上暂停子程序设计思路分析,可设计其详细流程图如图6所示。图6 暂停子程序流程图3.5.3暂停子程序代码设计PAUSE PROC mov ah,0 ;清空键盘缓存 int 16h CMP AL,Q JNZ E0 CALL FAR PTR QUIT ;若输入Q则结束,退出程序 E0: CMP AL,C JZ F0 ;若输入C则继续显示小鸟 JMP PAUSE ;若输入其它字符则保持暂停状态 F0: CMP COUNT0,0 JZ G0 ;若count0为0,则返回主程序 CMP COUNT1,0 JZ G1 ;若count1为0,则返回飞翔子程序 CMP COUNT2,0 JZ G2 ;若count2为0,则返回鸣叫子程序 CMP COUNT3,0 JZ G3 ;若count3为0,则返回飞翔并鸣叫子程序 G0: MOV COUNT0,1 JMP FAR PTR DISP0G1: MOV COUNT1,1 JMP FAR PTR DISP1G2: MOV COUNT2,1 JMP FAR PTR FREGG3: MOV COUNT3,1 JMP FAR PTR DISP2 RETPAUSE ENDP 3.6小鸟显示子程序设计3.6.1小鸟显示子程序设计思路小鸟显示的原理在2.2.1小节已作了详细介绍,这里仅给出本程序中小鸟的显示步骤。首先对屏幕进行清屏,之后将DI指向所要显示的图案,并将光标位置指向小鸟图案的参考位置,然后调用BIOS的10H中断的9号功能显示小鸟图案第一个字符。再将DI加4指向下一个字符,重复上述步骤,直至所有字符显示完毕结束。最后再调用一个延时程序即可显示并看到所有显示的小鸟图案。3.6.2小鸟显示子程序流程图设计通过以上暂停子程序设计思路分析,可设计其详细流程图如图7所示。图7 小鸟显示子程序流程图去掉延时子程序即可得到不带延时的小鸟显示图案子程序DISPLAY1。3.6.3小鸟显示子程序代码设计FLY_BLEAT PROC DISP2:LEA DI,BIRD1 ;显示小鸟CALL DISPLAY1CALL BLEAT_DLY LEA DI,BIRD2CALL DISPLAY0 LEA DI,BIRD3 CALL DISPLAY0PUSH AXMOV AX,DXFINC AL ;小鸟向前移动1格 MOV DXF,AX POP AX mov ah,1 ;从键盘读取字符到AL寄存器 int 16h JZ DISP2 ;若无输入则持续飞翔等待 CMP AL,Q JNZ A3CALL FAR PTR QUIT ;若输入Q则结束,退出程序 A3: CMP AL,PJNZ B3MOV COUNT3,0CALL PAUSE ;若输入P则暂停B3:CMP AL,BJNZ C3CALL BLEAT ;若输入B则小鸟只是鸣叫 C3: CMP AL,SJNZ D3CALL FLY ;若输入S则小鸟只是飞翔 D3: mov ah,0 ;清空键盘缓存 int 16h JMP DISP2 ;若输入其它则持续飞翔鸣叫等待 RETFLY_BLEAT ENDP4调试记录及结果分析4.1调试记录及结果分析1)运行MF2KP汇编软件,在里面编辑源程序,编辑完成之后,生成.ASM文件,保存该该文件;2)接着仍用上面的软件进行编译,连接,运行生成.EXE文件;3)运行所生成的EXE文件即可产生所需要的结果。程序正常运行后按第一节所提出的要求分别对本程序的各项功能进行验证,并将调试结果记录如图8至图13所示。图8 小鸟图案显示1图9 小鸟图案显示2图10 小鸟图案显示3图11 小鸟飞翔显示1图12 小鸟飞翔显示2图13 小鸟飞翔显示3运行后当无字符输入时,屏幕上显示小鸟动态图案;当按下P键,程序暂停,屏幕上只剩下光标;按C键后继续。此时若按下S键,小鸟开始飞翔。在飞翔时按下P键,小鸟暂停,按C继续;按下B键则小鸟在飞翔的同时还能鸣叫。若按下B键,小鸟鸣叫。在鸣叫时按下P键,小鸟暂停,按C继续;按下S键则小鸟在鸣叫的同时还能飞翔。在小鸟飞翔并鸣叫时,按下P键,小鸟暂停,按C继续;按下S键后,小鸟只飞翔;按下B键后,小鸟只鸣叫。在程序运行的任何时候,按下Q键,程序立刻结束。通过以上调试结果可以发现,所设计的程序完全满足设计任务要求,程序设计成功。4.2调试中出现的问题及解决方案 在编程过程中,由于基础知识掌握不牢,出现了诸多问题,下面将选取其中部分做出详细记录并给出详细解决方案。运行主程序后,当没有字符输入时,屏幕上只有光标而没有小鸟图案。出现此问题时,主程序键盘检测中使用的是BIOS中断16H的0号功能。此功能在键盘缓存区为空时,系统将等待键盘输入以进行后续指令操作。而程序刚运行时,键盘缓存区为空,这时在没有字符输入时,系统就不能进行后续操作,也就不能循环显示小鸟图案。后来通过查阅资料,用16H中断的1号功能代替了0号功能,上述问题就得到了完美的解决。在16H的1号功能中,当键盘缓存区为空时,标志位ZF为1,反之则为0。在设计时可通过判断ZF来实现分支选择,进行后续指令操作。在调试程序过程中,当有无效按键输入时,程序的功能就被打乱。造成此问题的原因还是由于16H中断掌握不牢所致。通过问题1的分析,我们很容易发现这是因为缓存区不为空而影响了下一次字符判断。所以在每一次无效输入后必须对缓存区进行清空。由于BIOS的16号中断在每读取键盘缓存区中的一个字符时,此字符将会从缓存队列中被移除。故此处我们可以采用这种办法对键盘缓存区进行清空,即:mov ah,0 int 16h 小鸟飞翔时,按下B键小鸟能鸣叫,但回到了起始位置这是由于原先在各子程序的开始都对光标的位置进行了初始化,使小鸟从飞翔状态跳到另一个状态时,光标位置发生了变化,出现不希望的结果。为了解决上述问题,在数据段定义了两个变量,用于记录光标位置,跟踪小鸟飞翔状态,使上述问题得到了解决。5.小鸟动画程序的优化5.1小鸟动画优化为了使小鸟动画更贴近实际小鸟,下面首先对小鸟的飞翔速度和鸣叫声音进行适当的修改。这里首先对小鸟展翅以及飞翔的速度进行调整,这里采用修改延时子程序中DX的值来实现对小鸟展翅以及飞翔的速度的修改。通过不断的调试比较,最后选定DX的值为30000,此时小鸟展翅以及飞翔的速度协调。小鸟鸣叫声音的优化包含音调优化和频率优化两个方面。音调的优化主要通过调节参数MUS_FREG和MUS_TIME实现,其中MUS_FREG是主要调节的对象,其值越大,音调越高。由于小鸟鸣叫的音调较高,这里对MUS_FREG的值适当增大。通过不断调试比较,选择MUS_FREG的值为4000,MUS_TIME的值为2000,能达到较好的效果。小鸟频率的优化主要是调节两次鸣叫之间的间隔时间。由于实际中小鸟两声鸣叫间有一定的间隔,且时间较长,这里在小鸟鸣叫子程序中调用通用发声子程序后调用两次延时子程序,经调试能达到比较好的效果。5.2小鸟动画背景颜色优化为了便于打印和文档阅读,这里特将背景修改为白色。具体实现是在设置了屏幕显示方式后调用一次清屏子程序,在清屏子程序中设置BH为0f0H,以白底黑字填充屏幕,即可达到修改屏幕背景的目的。与此对应,将屏幕显示方式也修改为黑白文档形式,写字符时也采用黑白方式,将10H号中断的9号功能调用均改为10号功能调用。经调试后能达到预期效果。6心得与体会这次课程设计对我来说,确实是一项不简单的任务。经过几天的努力,不断地翻书查资料,向老师同学请教,对汇编语言也有了进一步的认识和掌握,进一步理解了各个指令的功能,特别是转向指令和中断指令,也熟悉了子程序的定义和调用。在程序设计过程中我也遇到了许多问题,例于对BIOS的10H中断的调用。由于对CPU对中断响应的原理及过程的不够理解,在调用时没有考虑到10H中断对键盘输入缓存区的影响,以致设计出来的程序不能正确读取键盘输入的数据,无法实现预期的功能。在调用子程序时也由于没能对子程序中使用的寄存器进行及时的保护,导致子程序调用结束后,系统功能紊乱。 通过这次亲自动手认真做课程设计,我进一步熟悉了汇编语音的结构和使用方法,以前学习时不太懂的地方,有了更深刻的认识,基本达到了能读懂汇编语言理解其功能的水平。这次课程设计也让我获得了宝贵的经验,为以后的毕业设计打下了良好的基础,培养了自己选用参考书,查阅文献资料的能力,提高独立思考,深入研究,分析问题解决问题的能力,知道了理论和实践相结合的重要性。学习就是不断地发现问题解决问题的过程,在这期间我们会学会很多东西,要注意多动脑子勤思考,不懂得地方要向老师请教,才能有更大的提升。7参考文献1 朱定华著.微机原理、汇编与接口技术M.北京:清华大学出版社.2007年2 马春燕.微机原理接口技术实验与学习辅导M.北京:电子工业出版社.2007年3 周佩玲、彭虎、傅忠谦编著.微机原理与接口技术M. 北京:电子工业出版社.2007年4 沈美明、温冬婵著.IBM-PC汇编语言程序设计M.北京:电子科技大学出版社.2006年5 张雪兰、谭毓安、李元章著.汇编语言程序设计从DOS到WINDOWSM.北京:清华大学出版社.2006年 6 余朝琨著.IBM-PC机汇编语言程序设计M.厦门:厦门大学出版社.2001年 附录1:小鸟动画程序;-;程序:小鸟动画程序;功能:;程序运行后,在无输入情况下,屏幕上显示小鸟图案;;程序运行后,按下S键,小鸟飞翔;按下B键,小鸟鸣叫;按下P键,程序暂停;按下Q键,程序结束;;在飞翔状态下,按B键,小鸟同时鸣叫;按P键,程序暂停;按下Q键,程序结束;;在鸣叫状态下,按S键,小鸟同时飞翔;按P键,程序暂停;按下Q键,程序结束;;在同时飞翔和鸣叫状态下,按B键,小鸟只鸣叫,回到功能4;按S键,小鸟只飞翔,回到功能3;按P键,程序暂停;按下Q键,程序结束;;在暂停状态下,按C键,程序回到暂停前状态继续运行;按下Q键,程序结束;;任何情况下,当输入无效键时,程序循环等待下一次输入。;作者:梅浪奇;第六次修改-小鸟图案更形象 ;时间:2013/1/12;第一次修改时间:2013/1/6 基本功能实现 ;第二次修改时间:2013/1/8 背景白色 ;第三次修改时间:2013/1/9 鸣叫声为乐曲 ;第四次修改时间:2013/1/10 小鸟叫声更形象 ;第五次修改时间:2013/1/12 小鸟图案换成多字符 ;-DATA SEGMENTINFO1 DB 0DH,0AH,INPUT B,C,P, OR Q $INFO2 DB 0DH,0AH,0AH,B-bleat,C-coutinue,P-pause,S-fly,Q-quit $MUS_FREG DW 4000MUS_TIME DW 2000DXF DW 0E06HCOUNT0 DB 1COUNT1 DB 1COUNT2 DB 1COUNT3 DB 1BIRD1 DB 17 ;小鸟的字符图形表(收翅) DB 42,0F0H,0,-4 DB 42,0F0H,0,-3 DB 42,0F0H,0,-2 DB 42,0F0H,0,-1 DB 42,0F0H,0,0 DB 42,0F0H,0,1 DB 42,0F0H,0,2 DB 42,0F0H,-6,-3 DB 42,0F0H,-5,-3 DB 42,0F0H,-4,-2 DB 4

温馨提示

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

评论

0/150

提交评论