设计课题: 动画程序设计 班级: 自动化 120 组员:
指导教师: 付文秀
一.设计题目
动画程序设计
二、设计内容
1、主要内容:
利用BIOS系统功能调用,进行简单的动画设计。利用BIOS中断的10号、21号功能,进行简单的动画设计,并根据以下提示信息进行选择: (1)小鸟从屏幕飞过。
(2)汽车按水平方向从屏幕上开过去。 (3)退出。
2、基本功能:
(1)清屏宏定义
观察程序流程图,在显示小鸟图形,汽车图形时,要先清屏,所以在编写程序使用到宏,因为宏定义只需在汇编语言原程序中定义一次,便可以多次反复调用。调用时只需要一条宏指令即可。
程序中的清屏定义为:
CLEAR MACRO pch,pcl,pdh,pdl,pbh MOV AH,0 MOV AL,02H INT 10H
MOV AL,0
MOV CH,pch MOV CL,pcl MOV DH,pdh
MOV DL,pdl MOV BH,pbh INT 10H
ENDM
宏指令名为CLEAR,定义了五个形式参数,分别为:pch,pcl,pdh,pdl,pbh,把pch,pcl的值分别传给窗口左上角行号、列号,pdh,pdl的值分别传给窗口右下角行号、列号,pbh的值则传给窗口底部卷入行属性。
利用已经定义好的宏,清屏时可以宏调用。 宏调用语句为:CLEAR 0,0,24,79,7 (2)子程序设计
在接受键盘输入后,判断AL的值,如果是“1”就调用小鸟子程序,如果是“2”就调用汽车子程序,如果是“3”就结束退出。在小鸟子程序中又嵌套了延时子程序,在汽车子程序中又嵌套了多个子程序。 (3)显示小鸟字符图形
程序中利用BIOS系统功能中10H中断的09号功能进行小鸟字符图形的显示,程序段如下:
MOV AH,9 MOV AL,76H MOV BL,10 INT 10H
要是小鸟字符图形显示的更清晰,则需要延时。循环指令LOOP,当CX不为零时,执行循环转移分支;当CX为零时,退出循环。延时子程序为: DLY PROC NEAR PUSH CX PUSH DX MOV DX,10000
DL1: MOV CX,6801
DL2: LOOP DL2
DEC DX JNZ DL1 POP DX
POP CX RET
DLY ENDP
上述子程序用两层循环实现延时,内循环实现单位时间延时,外循环次数由寄存器DX决定。
(4)显示汽车字符图形
因为汽车是多字符显示,所以在子程序中还嵌套了显示汽车图形和清屏两个子程序。 MOV CH,0 MOV CL,[DI] INC DI
MOV CHAR,CX MOV POINTER,DI MOV LINE,DH
MOV COL,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、0B1H、0DBH、0DBH、4FH、4FH,显示属性为白色,即色号为7。在设置字符显示位置时,是通过两两字符间的相对坐标来实现的。 (2)延时一个时间周期,这样图形更清晰。 这里要用到延时子程序及其调用。 (3)消除图形
在进行小鸟清屏时,可使用清屏宏调用,只需在程序前面进行清屏宏定义。而在进行汽车的清屏时,由于汽车是由对字符图形显示的,所以不采用清屏宏调用,而是通过修改字符显示属性来进行清屏。
(4)改变图形的行、列坐标。
因为要求小鸟从屏幕飞过,所以小鸟的飞行路径不是水平也不是垂直的,所以要同时改
变字符的行、列坐标;而汽车从左至右行驶,所以只需要改变汽车的列坐标。 (5)返回第一步,重复上述过程。
利用BIOS系统功能中 10H中断的06号功能进行清屏,循环调用09号功能显示字符图形;延迟一段时间后,再循环调用09号功能,设置BL寄存器的值为0(黑底黑字显示字符图形),以达到擦除图形的效果;改变行、列坐标,调用02号功能设置光标位置,重复上述过程。
利用DOS中断的01号和02号子功能来完成键盘接收,结果显示。
四、汇编源程序代码
DATA SEGMENT
INFO1 DB 0DH,0AH,'---PLEASE INPUT 1,2, OR 3 (1:bird,2:car,3:exit)--- $' BUFA DB 200 DB ?
DB 200 DUP(0) BUFB DB 200 DUP(?)
CAR DB 7 ;小汽车的字符图形表 DB 52H,7,0,0 DB 0B1H,7,0,1 DB 0DBH,7,0,1 DB 0DBH,7,0,1 DB 4FH,7,1,0 DB 4FH,7,0,-3 DB 2,7,-2,1 CHAR DW ? POINTER DW ? LINE DB ? COL DB ? DATA ENDS
STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX
MOV AH,0 ;设置显示方式为80*25的黑白文体 MOV AL,02H INT 10H
LEA DX,INFO1 ;在显示器上显示字符串提示信息 MOV AH,9 INT 21H
MOV AH,1 ;从键盘读取字符到AL寄存器 INT 21H
CMP AL,31H ;比较AL是否等于1 JNE A CALL BIRD
A: CMP AL,32H ;比较AL是否等于2 JNE B CALL QICHE
B: CMP AL,33H ;比较AL是否等于3 JNE START
MOV AH,4CH ;终止当前程序并返回调用程序 INT 21H
CLEAR MACRO pch,pcl,pdh,pdl,pbh ;清屏宏定义 MOV AH, 0 MOV AL,02H INT 10H
MOV AH,6 ;调用6号功能
MOV AL,0 ;设置整个屏幕为空白 MOV CH,pch
MOV CL,pcl ;窗口左上角行列数 MOV DH,pdh
MOV DL,pdl ;窗口左上角行列数 MOV BH,pbh ;正常属性显示 INT 10H ENDM
BIRD PROC ;小鸟子程序 MOV AX,DATA MOV DS,AX
MOV AH,0 MOV AL,02H INT 10H
CLEAR 0,0,24,79,7 ;清屏宏调用
MOV AH,0FH ;读当前显示状态 INT 10H
MOV DH,10 MOV DL,0 BEGIN:MOV SI,2 MOV CX,1 DISP: CMP DL,80 JAE EXIT1
MOV AH,2 INT 10H
MOV AH,9 MOV AL,76H MOV BL,10 INT 10H
CALL DLY ; MOV AH,9 MOV AL,[DI] INT 10H INC DL DEC SI
JNZ DISP JMP BEGIN EXIT1:RET BIRD ENDP
QING PROC NEAR MOV AH,6 MOV AL,0 MOV CX,0 MOV DH,24 MOV DL,79
延时
MOV BH,7 INT 10H RET QING ENDP
DLY PROC NEAR ;延时子程序 PUSH CX PUSH DX MOV DX,10000 DL1: MOV CX,6801
DL2: LOOP DL2 DEC DX JNZ DL1 POP DX
POP CX RET DLY ENDP
QICHE PROC NEAR ;汽车子程序 MOV AH,0 MOV AL,02 INT 10H
CLEAR 0,0,24,79,7 ;清屏宏调用 LEA DI,CAR ;DI指向字符图形表
MOV DH,5 ;从第5行0列位置开始显示汽车 MOV DL,0 CALL MOVE RET QICHE ENDP MOVE PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI
MOV AH,0FH ;取当前显示方式
INT 10H MOV CH,0
MOV CL,[DI] ;CL放字符个数 INC DI ;DI指向字符图形表 MOV CHAR,CX MOV POINTER,DI MOV LINE,DH MOV COL,DL PLOT_NEXT:
ADD DH,[DI+2] ;改变行列坐标 ADD DL,[DI+3]
CMP DL,80 ;是否出屏 JB MOV_CRSR POP DI POP DX POP CX POP BX POP AX RET MOV_CRSR:
MOV AH,2 INT 10H
MOV AL,[DI] ;取字符值 MOV BL,[DI+1] ;取字符属性 MOV AH,09 ;显示字符 INT 10H
ADD DI,4 ;DI指向下一个字符 LOOP PLOT_NEXT CALL DLY CALL ERASE
JMP SHORT PLOT_NEXT MOVE ENDP ERASE PROC NEAR MOV CX,CHAR
MOV DI,POINTER MOV DH,LINE MOV DL,COL ERASE_NEXT:
ADD DH,[DI+2] ;修改光标的行坐标 ADD DL,[DI+3] ;修改光标的列坐标 MOV AH,2
INT 10H ;设置光标位置 MOV AL,[DI]
MOV BL,0 ;设置字符属性为0,为黑色 PUSH CX
MOV CX,1 ;设置字符显示次数为1 MOV AH,9 INT 10H POP CX
ADD DI,4 ;指向下一个要用来擦除的字符 LOOP ERASE_NEXT MOV CX,CHAR MOV DI,POINTER MOV DH,LINE INC COL MOV DL,COL RET ERASE ENDP CODE ENDS END START
五、实施结果
1、初始界面,如图5-2所示:
图5-1
2、输入1,小鸟从屏幕飞过界面,如图5-2所示:
图5-2
3、输入2,汽车按水平方向从屏幕上开过去界面,如图5-3所示:
图5-3
4、输入3,退出界面,如图5-4所示:
图5-4
六、心得与体会
在老师布置了微机原理与接口技术课程设计的研讨题目后,我们小组首先进行了集体讨论,从12个课题中选择了一个比较感兴趣的课题——动画程序设计。确定这个课题之后,组内便开始分工,大家查阅相关书籍,上网查找各种资料,初步确定了设计方案,对整个程序的流程有了大概的顺序,对程序先实现什么再实现什么有了一个初步计划。
因为小车使用多字符图形组合来显示,所以首先定义出小车的字符图形表。然后就是在运行程序是要用键盘输入指令1、2、3,以显示不同的运行结果,此时就要对从键盘输入信
息和在显示器上显示信息进行定义。因为在显示小鸟图形和汽车图形时,要先清屏,所以在编写程序要进行清屏宏定义以供调用。接下来就编写小鸟子程序,为使小鸟字符图形显示的更清晰,则需要编写延时子程序。最后一大块,便是编写汽车子程序。
得出完整程序后,便在计算机上运行,初次运行时程序中出现了好几处错误。有几处粗无是“错误的中文标注”因为在中文标注后忘记切换回英文键盘,岛主程序中出现了不合法的中文字符。还有就是单引号不慎写成了双引号等。根据计算机提示的错误行数,很容易找到错误,在组员的齐心协力下,我们终于把所有的错误都解决了,最后运行通过!
通过本次微机原理与接口技术研讨,组内成员对所学知识更加了解。学会了把课堂上的理论知识运用到实践中,通过解决实际问题,不断地找出自己所学知识中的薄弱环节。也使大家对微机原理与接口技术这门课程的学习兴趣有所增加,为以后更好的学习这门课程,以及与本课程有关的相关课程打下了坚实的基础。所以说,实践出真知,任何课本上的知识都不要通过实践来证实,来认识。
七、参考文献
[1] 《微机原理与接口技术》 张凡,清华大学出版社、北京交通大学出版社 [2] 《微型计算机技术及应用》 戴梅萼、史嘉权,清华大学出版社 [3] 《8086微型计算机组成、原理及接口》 顾滨,机械工业出本社
因篇幅问题不能全部显示,请点此查看更多更全内容