微机原理与接口技术课程设计-动画程序设计(小鸟飞过、汽车开过)(共14页).doc
精选优质文档-倾情为你奉上 微机原理与接口技术 课程设计设计课题: 动画程序设计 班 级: 学 号:姓 名: 指导教师: 2010 年 12月 24日一、设计题目动画程序设计二、设计内容1、主要内容:利用BIOS系统功能调用,进行简单的动画设计。利用BIOS中断的10号、21号功能,进行简单的动画设计,并根据以下提示信息进行选择:(1)小鸟从屏幕飞过。(2)汽车按水平方向从屏幕上开过去。(3)退出。2、基本功能:(1)清屏宏定义观察程序流程图,在显示小鸟图形,汽车图形时,要先清屏,所以在编写程序使用到宏,因为宏定义只需在汇编语言原程序中定义一次,便可以多次反复调用。调用时只需要一条宏指令即可。程序中的清屏定义为: CLEAR MACRO pch,pcl,pdh,pdl,pbh MOV AH,0 MOV AL,02H INT 10HMOV AL,0 MOV CH,pch MOV CL,pcl MOV DH,pdh MOV DL,pdl MOV BH,pbh INT 10HENDM宏指令名为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,'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 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 XIAO 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 10HENDMBIRD 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,' ' INT 10H INC DL DEC SI NZ 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-12、输入1,小鸟从屏幕飞过界面,如图5-2所示:图5-23、输入2,汽车按水平方向从屏幕上开过去界面,如图5-3所示:图5-34、输入3,退出界面,如图5-4所示:图5-4六、课程设计体会 看到本次微机原理与接口技术课程设计的课题后,我首先从12个课题中选择了一个我比较感兴趣的课题动画程序设计。确定这个课题之后,我便仔细研究了老师在指导书中给出的设计思路,然后查阅相关书籍,上网查找各种资料,初步确定了设计方案,对整个程序的流程有了大概的顺序,对程序先实现什么再实现什么有了一个初步计划。因为小车使用多字符图形组合来显示,所以首先定义出小车的字符图形表。然后就是在运行程序是要用键盘输入指令1、2、3,以显示不同的运行结果,此时就要对从键盘输入信息和在显示器上显示信息进行定义。因为在显示小鸟图形和汽车图形时,要先清屏,所以在编写程序要进行清屏宏定义以供调用。接下来就编写小鸟子程序,为使小鸟字符图形显示的更清晰,则需要编写延时子程序。最后一大块,便是编写汽车子程序。得出完整程序后,便在计算机上运行,初次运行时程序中出现了六处错误。有两处比较明显的相同错误,单引号不慎写成了双引号,改正后运行便还剩四处错误。根据计算机提示的错误行数,很容易找到了第三处错误,英文字母EXIT在输入时写成了EXT。第四处错误是MOV POINTER,DI中,POINTER和DI之间的“,”写成了“.”。最后一处错误也是最严重的一处错误,把段寄存器CS当成了目的操作数,修改方式是:用其他通用寄存器代替。通过本次微机原理与接口技术课程设计,培养了我各方面的能力。我更好的学会了把课堂上的理论知识运用到实践中,通过解决实际问题,不断地找出自己所学知识中的薄弱环节。使课堂上学习的理论知识得到了进一步的优化、补充,使自己所学知识变得更加完善。通过对程序的不断调试修改,不但使自己的知识面有所拓宽,同时也提高了自己敢于动手、善于动手的能力和独立的分析问题、解决问题的能力,也使自己对微机原理与接口技术这门课程的学习兴趣有所增加,为以后更好的学习这门课程,以及与本课程有关的相关课程打下了坚实的基础。 七、参考文献微型计算机系统原理及应用,周明德,清华大学出版社。微型计算机技术及应用,戴梅萼、史嘉权,清华大学出版社。8086微型计算机组成、原理及接口,顾滨,机械工业出版社。专心-专注-专业