资源描述:
《微机原理与接口技术课程设计_动画程序设计(...》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、微机原理与接口技术课程设计设计课题:动画程序设计班级:学号:姓名:指导教师:2013年1月15日一、设计题目动画程序设计二、设计内容1、主要内容:利用BIOS系统功能调用,进行简单的动画设计。利用BIOS中断的10号、21号功能,进行简单的动画设计,并根据以下提示信息进行选择:(1)小鸟从屏幕飞过。(2)汽车按水平方向从屏幕上开过去。(3)退出。2、基本功能:(1)清屏宏定义观察程序流程图,在显示小鸟图形,汽车图形时,要先清屏,所以在编写程序使用到宏,因为宏定义只需在汇编语言原程序中定义一次,便可以多次反复调用
2、。调用时只需要一条宏指令即可。程序中的清屏定义为:CLEARMACROpch,pcl,pdh,pdl,pbhMOVAH,0MOVAL,02HINT10HMOVAL,0MOVCH,pchMOVCL,pclMOVDH,pdhMOVDL,pdlMOVBH,pbhINT10HENDM宏指令名为CLEAR,定义了五个形式参数,分别为:pch,pcl,pdh,pdl,pbh,把pch,pcl的值分别传给窗口左上角行号、列号,pdh,pdl的值分别传给窗口右下角行号、列号,pbh的值则传给窗口底部卷入行属性。利用已经定义好的
3、宏,清屏时可以宏调用。宏调用语句为:CLEAR0,0,24,79,7(2)子程序设计在接受键盘输入后,判断AL的值,如果是“1”就调用小鸟子程序,如果是“2”就调用汽车子程序,如果是“3”就结束退出。在小鸟子程序中又嵌套了延时子程序,在汽车子程序中又嵌套了多个子程序。(3)显示小鸟字符图形程序中利用BIOS系统功能中10H中断的09号功能进行小鸟字符图形的显示,程序段如下:MOVAH,9MOVAL,76HMOVBL,10INT10H要是小鸟字符图形显示的更清晰,则需要延时。循环指令LOOP,当CX不为零时,执行
4、循环转移分支;当CX为零时,退出循环。延时子程序为:DLYPROCNEARPUSHCXPUSHDXMOVDX,10000DL1:MOVCX,6801DL2:LOOPDL2DECDXJNZDL1POPDXPOPCXRETDLYENDP上述子程序用两层循环实现延时,内循环实现单位时间延时,外循环次数由寄存器DX决定。(4)显示汽车字符图形因为汽车是多字符显示,所以在子程序中还嵌套了显示汽车图形和清屏两个子程序。MOVCH,0MOVCL,[DI]INCDIMOVCHAR,CXMOVPOINTER,DIMOVLINE,
5、DHMOVCOL,DL此段程序把CH的值设为了0,又因为CL中存放字符的个数,所以CL=6,DI指向字符图形表中的第一个字符。三、设计原理及方案1、设计原理图:图3-1主程序图3-2小鸟子程序图3-3汽车子程序2、设计方案:在屏幕上显示动画的效果可以按以下五步进行:(1)在屏幕上显示图形ASCII码表,选择“V”来显示小鸟,“V”的ASCII码为76H,查表选择彩色文本模式下的IRGB组合成的通用颜色,选择亮绿色,色号为10。显示汽车时用多字符图形显示,用6个字符组合来显示汽车,ASCII码分别为52H、0B1
6、H、0DBH、0DBH、4FH、4FH,显示属性为白色,即色号为7。在设置字符显示位置时,是通过两两字符间的相对坐标来实现的。(2)延时一个时间周期,这样图形更清晰。这里要用到延时子程序及其调用。(3)消除图形在进行小鸟清屏时,可使用清屏宏调用,只需在程序前面进行清屏宏定义。而在进行汽车的清屏时,由于汽车是由对字符图形显示的,所以不采用清屏宏调用,而是通过修改字符显示属性来进行清屏。(4)改变图形的行、列坐标。因为要求小鸟从屏幕飞过,所以小鸟的飞行路径不是水平也不是垂直的,所以要同时改变字符的行、列坐标;而汽车
7、从左至右行驶,所以只需要改变汽车的列坐标。(5)返回第一步,重复上述过程。利用BIOS系统功能中10H中断的06号功能进行清屏,循环调用09号功能显示字符图形;延迟一段时间后,再循环调用09号功能,设置BL寄存器的值为0(黑底黑字显符图形),以达到擦除图形的效果;改变行、列坐标,调用02号功能设置光标位置,重复上述过程。利用DOS中断的01号和02号子功能来完成键盘接收,结果显示。四、汇编源程序代码DATASEGMENTINFO1DB0DH,0AH,'INPUT1,2,OR3:(1:bird,2:car,3:e
8、xit)$'BUFADB200DB?DB200DUP(0)BUFBDB200DUP(?)CARDB7;小汽车的字符图形表DB52H,7,0,0DB0B1H,7,0,1DB0DBH,7,0,1DB0DBH,7,0,1DB4FH,7,1,0DB4FH,7,0,-3CHARDW?POINTERDW?LINEDB?COLDB?DATAENDSSTACKSEGMENTSTACKDB200DUP(