微机接口研究性教学专题三简单动画程序设计Word格式文档下载.docx
- 文档编号:18627817
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:23
- 大小:62.57KB
微机接口研究性教学专题三简单动画程序设计Word格式文档下载.docx
《微机接口研究性教学专题三简单动画程序设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《微机接口研究性教学专题三简单动画程序设计Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
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
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;
清屏宏定义
MOVAL,4
MOVAH,6
;
调用6号功能
MOVAL,0
设置整个屏幕为空白
MOVCH,pch
MOVCL,pcl
窗口左上角(0行,0列)
MOVDH,pdh
MOVDL,pdl
窗口右下角(24行,79列)
MOVBH,pbh
正常属性显示
ENDM
宏定义分为带参宏定义与无参宏定义。
宏定义的功能旨在减少代码量和提高程序的结构化程度。
一个定义好的宏可以在程序中被多次调用,从而增加了程序员和程序本身的效率。
其中,无参宏定义的格式为:
宏名MACRO
宏体
ENDM
带参宏定义的格式为:
宏名MACRO形参1,形参2
它们的调用格式为:
宏名[实参]
清屏宏为一个带有五个参数的带参宏。
它的功能是将屏幕中一定区域的内容清楚,为接下的显示提供屏幕空间。
要想进行显示操作就要了解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
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
STACKENDS
CODE,DS:
DATA,SS:
start:
movax,data
movds,ax
movah,0;
moval,3
int10h
leadx,info1;
在显示器上显示字符串提示信息
movah,9
int21h
int16h
CMPAL,31H;
JNEA
CALLXIAO
JNEB
CALLQICHE
CMPAL,71H;
JNESTART
终止当前程序并返回调用程序
CLEARMACROpch,pcl,pdh,pdl,pbh;
MOVAH,6;
MOVAL,0;
MOVCH,pch
MOVCL,pcl;
MOVDL,pdl;
MOVBH,pbh;
xiaoproc;
小鸟子程序
PUSHDS
MOVAX,0
PUSHAX
MOVFLAG,0
MOVYIDONG,70
;
描绘小鸟图像
LOOP4:
MOVAH,02H;
设置光标位置
LEABX,HENGZUOBIAO
MOVCX,FLAG
ADDBX,CX
MOVDH,[BX];
DH代表行号
LEABX,ZONGZUOBIAO
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;
INCFLAG
CMPFLAG,22;
表示要写23次
JNALOOP4
JMPLOOP3
Fasheng:
发声程序
MOVAL,0B6H
OUT43H,AL
MOVAX,34DCH
MOVDX,12H
DIVBX
OUT42H,AL
MOVAL,AH
INAL,61H
ORAL,03H
OUT61H,AL
LOOP3:
小鸟飞行程序
LOOP2:
置光标位置
MOVCX,FLAG
MOVDH,[BX]
MOVDL,[BX]
ADDDL,YIDONG;
纵坐标(相当于列)加上40
选择在第0页
字符的ASCII码值
cx为写入的字符数
写入的页数
CMPFLAG,22
JNALOOP2
JIXU:
movYANSHI,5
CALLDLY
MOVAH,02H
MOVDX,0
清除前一帧图像
MOVAL,'
'
MOVCX,1700
MOVBL,07H
DECYIDONG
CMPYIDONG,0;
飞行到纵坐标为0处时将重新从开始出飞行
JALOOP3
JMPLOOP3
TUICHU:
RET
xiaoendp
DLYPROCNEAR;
延时子程序
PUSHCX
PUSHDX
MOVDX,1000
DL1:
MOVCX,680
DL2:
LOOPDL2
DECDX
JNZDL1
POPDX
POPCX
DLYENDP
QICHEPROCnear;
汽车子程序
PUSHBX
PUSHDX
MOVAH,0BH;
设置彩色组颜色为绿、红、黄
MOVBH,01
MOVBL,00
CLEAR33,33,24,79,7;
清屏宏调用
LEADI,CAR;
DI指向字符图形表
MOVDH,10;
从第5行5列位置开始显示汽车
MOVDL,0
CALLMOVE_SHAPE
QICHEENDP
MOVE_SHAPEPROCNEAR
PUSHDI
MOVAH,0FH;
取当前显示方式
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
MOVAL,[DI];
取字符值
MOVBL,[DI+1];
取字符属性
MOVCX,1
MOVAH,09;
显示字符
ADDDI,4;
DI指向下一个字符
LOOPPLOT_NEXT
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
9号调用,显示黑色字符,擦除字符
ADDDI,4;
指向下一个要用来擦除的字符LOOPERASE_NEXT
LOOPERASE_NEXT
INCCOL_ON
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:
中最后一句改成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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 接口 研究 教学 专题 简单 动画 程序设计
![提示](https://static.bdocx.com/images/bang_tan.gif)