微机接口研究性教学专题三简单动画程序设计.docx
- 文档编号:5640715
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:23
- 大小:62.57KB
微机接口研究性教学专题三简单动画程序设计.docx
《微机接口研究性教学专题三简单动画程序设计.docx》由会员分享,可在线阅读,更多相关《微机接口研究性教学专题三简单动画程序设计.docx(23页珍藏版)》请在冰豆网上搜索。
微机接口研究性教学专题三简单动画程序设计
学号:
微机接口研究性教学专题三
题目名称(题目2)简单动画设计
学院电信学院
班级通信1111班
教师付文秀
一概述
1.课程设计的目的
对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
汇编语言程序设计课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。
因此,要求学生能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。
培养学生综合运用所学知识独立完成汇编程序课题的能力。
使学生能够较全面地巩固和应用课堂中所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。
提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
2.课程设计的要求
利用BIOS系统功能调用,进行简单的动画设计,并根据以下提示信息进行选择:
1――小鸟从屏幕飞过;
2――汽车按水平方向从屏幕上“开”过去;
3――退出
提高要求:
加入音乐播放。
二方案设计
1.主程序设计思想:
此动画程序要求结构化的显示两个动画效果:
小鸟飞过和小车开过。
程序要求能多次执行以上两种动画并有退出选项。
则我们可以设计三个选项以供用户选择:
1-小鸟、2-小车和q-退出程序。
三个选项分别可以用三个过程实现其功能。
动画的原理实质上是在屏幕上连续的间隔较小的地方显示相同的图案。
由于人眼具有视觉暂留的特性,我们就会看到“运动”的画面。
2.小鸟及汽车图案和加入音乐设计思想:
首先讨论小鸟图像形成及移动部分的方案。
我们通过查阅资料,决定以一组字符组合来形成小鸟图像(即文本方式),用字符形成小鸟图像,主要是利用BIOS中的INT10H中断,即显示器中断,INT10H中的09H号功能是在光标制定位置处写字符和属性。
程序结构图大致如下:
MOVAH,09H;置光标
MOVAL,‘字符’;字符ASCII码
MOVBL,7;字符属性
MOVBH,0;第0页
MOVCX,数量值;字符重复个数
INT10H
汽车图形由7个文本字符组成,从左到右,车体是由字母R(ASCII码为52H),1/2阴影符(ASCII码为B1H),和两个实心方块(ASCII码为DBH)组成,两个车轮是字母O(ASCII码为4FH),和笑脸符号(ASCII码为02H),以上七个文本字符都是以正常属性显示。
汽车各字符的相对位移量如图2.2:
图2.2汽车字符表
开始显示车体,R是显示的第一个字符,其相对位移量定为(0,0),第二个阴影符号在R的右边一列,所以相对R的位移量为(0,1),两个实心方块都是在前一个字符的同一行的右边一列,所以位移量都为(0,1)。
前轮比最后一个方块符号的行数加1,但仍在同一列上,所以它的位移量为(1,0),后轮相对前轮行数不变,但列数减了3,所以位移量应是(0,-3)。
最后显示出笑脸,是相对于后轮位移量是(-2,1)。
如汽车图形可定义变量定义如下:
CARDB7
DB52H,7,0,0;字符R的ASCII码,及字符属性值为7,相对位移量为0,0
DB0B1H,7,0,1;阴影符的ASCII码,及字符属性值为7,相对位移量为0,1
DB0DBH,7,0,1;实心方块的ASCII码,及字符属性值为7,相对位移量为0,1
DB0DBH,7,0,1;实心方块的ASCII码,及字符属性值为7,相对位移量为0,1
DB4FH,7,1,0;大写字母O的ASCII码,及字符属性值为7,相对位移量为1,0
DB4FH,7,0,-3;大写字母O的ASCII码,及字符属性值为7,相对位移量为0,-3
DB02H,7,-2,1
加入音乐程序也是一个比较重要的环节,我们尝试了好听的音乐,未成功,所以这里采用了产生指定频率声音,中间涉及到扬声器发声部分。
我们采用了定时器控制。
产生指定频率声音的程序段如下:
PUSHAX;保存ax的值
MOVAL,0B6H;给2号定时器的43端口送入一个特定的数0B6H
OUT43H,AL
MOVAX,34DCH
DIVBX
OUT42H,AL;给42H端口装入一个16位的计时常数(533H*896/频率)
MOVAL,AH
OUT42H,AL
INAL,61H;获取61h端口的当前值
ORAL,03H;把61h端口低二位置1,即打开蜂鸣器
OUT61H,AL;输出数据到61h端口
POPAX;恢复ax的值
主程序:
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAH,0
MOVAL,4;设置显示方式为320*200彩色图形方式
INT10H
LEADX,STRING
MOVAH,9;在显示器上显示字符串提示信息
INT21H
MOVAH,1
INT21H;从键盘读取字符到AL寄存器
CMPAL,‘1’;比较AL是否等于1
JNEA;不相等则转移到A
CALLxiao;相等则调用xiao子程序
A:
CMPAL,32H;比较AL是否等于2
JNEB;不相等则转移到B
CALLqiche;相等则调用qiche子程序
B:
CMPAL,’q’;比较AL是否等于q
JNESTART;不相等则转移到START,重新输入字符
MOVAH,4CH;相等则终止当前程序。
INT21H
主程序主要实现与用户的交互,首先程序会提示用户想要进行什么操作。
是显示小鸟动画、汽车动画还是退出。
这里对应的给用户提供的选项是“1”、“2”和“q”。
当用户输入他们的选项之后,主程序要判断用户的输入调用相应的功能模块来满足用户的要求。
我们假设用户输入字符为X,那么首先我们将X与“1”比较。
如果相同则程序调用小鸟动画模块为用户显示动画。
若不为“1”则要继续与“2”想比较。
相等则调用汽车动画,不等则继续与“q”想比较。
相等则正常退出,不等则说明用户输入非法字符主程序返回到选择界面用户可以继续选择。
特别说明:
汇编语言的选择结构不同于C语言的选择结构,程序设计过程中要特别小心。
避免将造成潜在的BUG.
2)清屏宏定义
CLEAR MACROpch,pcl,pdh,pdl,pbh;清屏宏定义
MOVAH,0
MOVAL,4
INT10H
MOVAH,6 ;调用6号功能
MOVAL,0 ;设置整个屏幕为空白
MOVCH,pch
MOVCL,pcl ;窗口左上角(0行,0列)
MOVDH,pdh
MOVDL,pdl ;窗口右下角(24行,79列)
MOVBH,pbh ;正常属性显示
INT10H
ENDM
宏定义分为带参宏定义与无参宏定义。
宏定义的功能旨在减少代码量和提高程序的结构化程度。
一个定义好的宏可以在程序中被多次调用,从而增加了程序员和程序本身的效率。
其中,无参宏定义的格式为:
宏名MACRO
宏体
ENDM
带参宏定义的格式为:
宏名MACRO形参1,形参2
宏体
ENDM
它们的调用格式为:
宏名[实参]
清屏宏为一个带有五个参数的带参宏。
它的功能是将屏幕中一定区域的内容清楚,为接下的显示提供屏幕空间。
要想进行显示操作就要了解BIOS(INT10H)调用。
清屏宏中用到了六号功能调用:
6号功能:
初始窗口或向上滚动
入口参数:
AH=6,AL=上滚行数(AL=0时,整个屏幕为空白)
CX=上滚窗口左上角的行、列号
DX=上滚窗口右下角的行、列号
BH=空白行的属性
出口参数:
无
在清屏宏的五个参数中,pch和pcl的值分别赋给CH和CL寄存器,这样所要清屏区域的左上角的坐标就设置好了。
同样,将pdh和pdl的值赋给DH和DL寄存器,设置好右下角的坐标。
BH寄存器取得pbh的值设置空白行的属性。
最后INT10h,调用BIOS显示设置实现清屏功能。
三流程设计和程序编写
1.主程序流程图如图3.1:
图3.1主程序流程图t图
2.源程序代码
源代码:
DATASEGMENT
INFO1DB0DH,0AH,'INPUT1,2,ORq:
(1:
bird,2:
car,q:
exit)$'
BUFADB200
DB?
DB200DUP(0)
BUFBDB200DUP(?
)
CARDB7;小汽车的字符图形表
DB52H,7,0,0
DB0B1H,7,0,1
DB0DBH,7,0,1
DB0DBH,7,0,1
DB4FH,7,1,0
DB4FH,7,0,-3
DB2,7,-2,1
CHAR_CNTDW?
POINTERDW?
LINE_ONDB?
COL_ONDB?
ZONGZUOBIAODB13,13,11,10,10,9,20,6,9,5,3,2,1,9,19,9,
10,11,11,11,12,13,14;小鸟的字符图形表
HENGZUOBIAODB1,2,3,4,5,6,6,7,7,8,9,10,11,12,12,13,14,15,16,17,18,19,20
SHULIANGDB2,4,6,7,7,8,3,1,14,18,20,20,23,7,4,6,5,4,4,4,3,2,1
FLAGDW0
YIDONGDB0
YANSHIDW0
DATAENDS
STACKSEGMENTstack
DB200DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
start:
movax,data
movds,ax
movah,0;设置显示方式为320*200彩色图形方式
moval,3
int10h
leadx,info1;在显示器上显示字符串提示信息
movah,9
int21h
movah,0;从键盘读取字符到AL寄存器
int16h
CMPAL,31H;比较AL是否等于1
JNEA
CALLXIAO
A:
CMPAL,32H;比较AL是否等于2
JNEB
CALLQICHE
B:
CMPAL,71H;比较AL是否等于q
JNESTART
MOVAH,4CH;终止当前程序并返回调用程序
INT21H
CLEARMACROpch,pcl,pdh,pdl,pbh;清屏宏定义
MOVAH,0
MOVAL,4
INT10H
MOVAH,6;调用6号功能
MOVAL,0;设置整个屏幕为空白
MOVCH,pch
MOVCL,pcl;窗口左上角(0行,0列)
MOVDH,pdh
MOVDL,pdl;窗口右下角(24行,79列)
MOVBH,pbh;正常属性显示
INT10H
ENDM
xiaoproc;小鸟子程序
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVFLAG,0
MOVYIDONG,70
;描绘小鸟图像
LOOP4:
MOVAH,02H;设置光标位置
LEABX,HENGZUOBIAO
MOVCX,FLAG
ADDBX,CX
MOVDH,[BX];DH代表行号
LEABX,ZONGZUOBIAO
ADDBX,CX
MOVDL,[BX];DL代表列号
ADDDL,YIDONG
MOVBH,0;表示页号
INT10H
MOVAH,09H;在当前光标位置处写字符和属性
MOVAL,76H;设置字符ASCII码
LEABX,SHULIANG
MOVDX,FLAG
ADDBX,DX
MOVCL,[BX];CX代表写入字符数
MOVCH,0
MOVBH,0
MOVBL,16H;字符属性
INT10H
INCFLAG
CMPFLAG,22;表示要写23次
JNALOOP4
;JMPLOOP3
Fasheng:
;发声程序
MOVAL,0B6H
OUT43H,AL
MOVAX,34DCH
MOVDX,12H
DIVBX
OUT42H,AL
MOVAL,AH
OUT42H,AL
INAL,61H
ORAL,03H
OUT61H,AL
LOOP3:
MOVFLAG,0
;小鸟飞行程序
LOOP2:
MOVAH,02H;置光标位置
LEABX,HENGZUOBIAO
MOVCX,FLAG
ADDBX,CX
MOVDH,[BX]
LEABX,ZONGZUOBIAO
ADDBX,CX
MOVDL,[BX]
ADDDL,YIDONG;纵坐标(相当于列)加上40
MOVBH,0;选择在第0页
INT10H
MOVAH,09H;在当前光标位置处写字符和属性
MOVAL,76H;字符的ASCII码值
LEABX,SHULIANG
MOVDX,FLAG
ADDBX,DX
MOVCL,[BX];cx为写入的字符数
MOVCH,0
MOVBH,0;写入的页数
MOVBL,16H;字符属性
INT10H
INCFLAG
CMPFLAG,22
JNALOOP2
;JIXU:
movYANSHI,5
CALLDLY
MOVAH,02H
MOVDX,0
MOVBH,0
INT10H
MOVAH,09H;清除前一帧图像
MOVAL,''
MOVCX,1700
MOVBL,07H
INT10H
DECYIDONG
CMPYIDONG,0;飞行到纵坐标为0处时将重新从开始出飞行
JALOOP3
MOVYIDONG,70
JMPLOOP3
TUICHU:
RET
xiaoendp
DLYPROCNEAR;延时子程序
PUSHCX
PUSHDX
MOVDX,1000
DL1:
MOVCX,680
DL2:
LOOPDL2
DECDX
JNZDL1
POPDX
POPCX
RET
DLYENDP
QICHEPROCnear;汽车子程序
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVAH,0
MOVAL,4
INT10H
MOVAH,0BH;设置彩色组颜色为绿、红、黄
MOVBH,01
MOVBL,00
INT10H
CLEAR33,33,24,79,7;清屏宏调用
LEADI,CAR;DI指向字符图形表
MOVDH,10;从第5行5列位置开始显示汽车
MOVDL,0
CALLMOVE_SHAPE
RET
QICHEENDP
MOVE_SHAPEPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVAH,0FH;取当前显示方式
INT10H
SUBCH,CH
MOVCL,[DI];CL放字符个数
INCDI;DI指向字符图形表中的第一个字符
MOVCHAR_CNT,CX
MOVPOINTER,DI
MOVLINE_ON,DH
MOVCOL_ON,DL
PLOT_NEXT:
ADDDH,[DI+2];改变行列坐标
ADDDL,[DI+3]
CMPDL,80;出屏否?
JBMOV_CRSR
PopDI
PopDX
PopCX
PopBX
PopAX
jmpexit2
MOV_CRSR:
MOVAH,2
INT10H
MOVAL,[DI];取字符值
MOVBL,[DI+1];取字符属性
PUSHCX
MOVCX,1
MOVAH,09;显示字符
INT10H
POPCX
ADDDI,4;DI指向下一个字符
LOOPPLOT_NEXT
CALLDLY
CALLERASE
JMPSHORTPLOT_NEXT
exit2:
ret
MOVE_SHAPEENDP
ERASEPROCNEAR
MOVCX,CHAR_CNT
MOVDI,POINTER
MOVDH,LINE_ON
MOVDL,COL_ON
ERASE_NEXT:
ADDDH,[DI+2];修正光标的行坐标
ADDDL,[DI+3];修正光标的列坐标
MOVAH,2
INT10H;设置光标位置
MOVAL,[DI];以黑色的相同字符覆盖原有的图案实现擦除图案的功能
MOVBL,0;设置字符属性为0,黑色
PUSHCX
MOVCX,1;设置显示字符次数为1
MOVAH,9
INT10H;9号调用,显示黑色字符,擦除字符
POPCX
ADDDI,4;指向下一个要用来擦除的字符LOOPERASE_NEXT
LOOPERASE_NEXT
MOVCX,CHAR_CNT
MOVDI,POINTER
MOVDH,LINE_ON
INCCOL_ON
MOVDL,COL_ON
RET
ERASEENDP
CODEENDS
ENDstart
运行可执行程序CAR.exe,选择1,小鸟飞过;选择2,汽车开过;选择q,退出。
四、调试结果与分析
4.1电路连接
一般无须连接电路,如果想要听到笑鸟鸣叫声大一点,可以把电脑里面的蜂鸣器接口用导线引出来,外接一个大的扬声器,效果可能好一点。
4.2调试步骤
1)运行MF2KP汇编软件,在里面编辑源程序,编辑完成之后,生成.ASM文件,保存该该文件;
2)接着仍用上面的软件进行编译,连接,运行生成.EXE文件;
3)运行所生成的EXE文件即可产生所需要的结果。
程序正常运行截图如下面的几幅图像所示。
当点击开.EXE文件之后,出来一个界面,提示输入1,2或者q
(1)当输入为1时,得到了下面的用v组成的在“飞行”的大鸟。
且可以发出声音(声音程序部分可以跳过去,若将程序中的“;loop3”改成“loop3”则不发生):
(2)初始化图像
当按下按键2时,出现移动的小车:
(3)初始化图像
当按下按键2时,退出程序。
5、调试中出现的问题、原因及排除方法
在编程调试的过程中,遇到了很多麻烦,总结起来有以下几点:
问题1:
当我们将程序start:
movax,data
movds,ax
movah,0;设置显示方式为320*200彩色图形方式
moval,3
中最后一句改成moval,4,则组成的小鸟异动到屏幕左端会突然出现有一行v显示不了的问题,而且整体的形状看起来也不稳定。
如下图
原因:
moval,4中不是文本格式
解决办法:
改成文本格式,将4换成3或者0,1,2,3,6
如换成6之后对应的图形为:
问题2:
寄存器的值变幻无常,怎么办?
原因:
程序结构过于复杂,使用寄存器比较频繁,以及使用了BIOS中断程序,这样会导致其它与之相关寄存器的值的改变。
解决办法:
堆栈是保护环境的主要工具,一旦用错,后过将很严重,比如我们在调试程序的过程中,遇到过这样的问题:
在一个函数的开始,我先用PUSH把所有寄存器入栈了,在函数的执行中,我又把一个寄存器PUSH到栈中保存,却忘记了在执行POP指令之前把它恢复出来!
这样就造成了所有的寄存器的值都的生了变化,包括数据和代码段寄存器,这样不出问题才怪呢?
!
所以,要记住,PUSH了一个变量之后在新的PUSH来临之前如果又有POP别的变量的语句,一定会出问题!
解决的办法只有一个,把PUSH和POP对上号。
问题3:
要显示的字符串过多,但又不想重复写代码,既要美观,又要易读,怎么办?
原因:
过于频繁的调用中断显示字符串,导致程序过于庞大和复杂,可读性差。
解决办法:
解决这种问题的最好方法是直接把显示部分写成子过程,但是子过程在传递参数的时候不方便,所以就用宏定义,宏定义可以很方便的传递参数,不仅使得程序美观好看,而且可读性好,程序代码紧凑。
问题4:
跳转,转移指令跳出的范围太大,编译出现错误怎么办?
原因:
程序结构过于复杂,庞大。
解决办法:
使用过程,也就是子程序设计,直接把一个要频繁要用到的函数
打包成一个子过程,然后用CALL调用子过程就可以了,这样就可以避免使用跳转和转移指令了。
六课程设计总结
通过将近一个半星期的摸索和编程,查资料,终于把程序完成了。
感觉很有成就,但是还是有不足,在音乐发声上还有待改进。
在这次《微机原理与接口技术》的课程设计中,我的体会就是:
要提高自己的编程能力,你必须亲自去体验、去设计、编辑、编译、调试、运行。
每一个程序员都是在失败、尝试、失败、尝试与收获中成长起来的。
而课程设计给了我一个很好的机会,将理论和实践很好的结合起来了,使我的知识更加结构化和系统化,而且还可以学到一些课堂上不讲或是一语带过的知识,增加我的课外理论知识。
同时我也可以从中获取很多的乐趣,原来汇编语言的功能是如此的强大,感觉很好玩,很有意思。
还有很重要的一点就是在调试程序时要讲究心平气和,而我恰恰是比较急躁的一个人,这次的课程设计程序调试过程中,很好的磨砺了我那急躁的性格,教会我学会冷静地去处理问题,相反,越毛躁越容易出问题,恶性循环,问题也就难以去顺利地解决。
总之,通过这次课程设计,自己的课堂上的理论知识
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 接口 研究 教学 专题 简单 动画 程序设计