当前位置:文档之家› 霓虹灯模拟显示课程设计

霓虹灯模拟显示课程设计

霓虹灯模拟显示课程设计1.设计任务及要求分析本次课程设计要求用汇编语言设计“霓虹灯”模拟显示,需要实现的功能如下:1、按下b/B键,分六笔快速画出矩形及其两条对角线;2、按下y/Y 键,流水灯从左到右依次点亮,然后一次熄灭;3、按下q/Q键,退出程序。

分析本设计不需要硬件设备,在微机原理实验集成环境MF2KP中编写程序,调用DOS命令和BIOS命令,并用合适的字符代替霓虹灯来实现。

1方案论证2.1方案一我们可以采用编写延时子程序的方法来实现延时,这种方法的主要原理是运用计算机相应每一条的时间积累。

程序如下:push bxpush cxmov cx ,xx ;输入正数A1:mov bx,xx ;输入正数A2:dec bxJnz A1Loop A2pop cxpop bx此方案的原理是运用循环指令来进行,主要通过设置cx和bx的值来进行复循环,从而达到时间的积累即延时。

2.2方案二方案二:运用DOS功能调用。

采用21H来中断调用,功能号为AH=2CH,完成的功能是设置时间,DH的值变换一次是0.01秒,这样通过设置DH的值来设置时间的延时。

2.3方案比较两种方案在理论上都是可行的,但是课程设计任务在时间要求上不是很严格只要区分快慢的大概效果既可,故选择方案一。

3设计原理3.1设计思想本次课程设计主要中显示图案是通过显示单个字符逐步实现的,通过移动光标可以改变字符输出的位置,位置的改变又是通过宏定义定义了一个程序段用于改变光标,设计了两个变量分别为光标在屏幕上的行和列坐标,把已经设计好了的图案的行列坐标分别定义在数据段的行列数据组里,用指针自加的方式进行连续调用显示。

在显示中插入延时程序控制显示的效果。

本次课程设计设计了二个延时程序分别满足二种不同的延时需要。

延时程序是通过LOOP循环来实现的,可以改变CX的值来改变延时的长短。

本次课设还涉及到清屏功能,故设计了一个清屏子程序,通过BIOS功能的调用实现清屏,和屏幕属性的设置。

整个程序分为三部分:第一段是继续与否的选择,检查输入是否为设计的字符b/B,是则进入下一程序断,否则继续检测;第二段是快速显示设计图案,通过光标移动逐步显示完预设图案,并询问是否进入下一程序段,检查输入是否为字符y\Y,是则进入下一程序段,否则跳回第二段程序重复执行一遍;第三段程序以较慢速度依次出现“*”,以实现模拟流水灯的效果,然后一次消失,在这个过程中检查是否有“q/Q”输入,有则跳转到中止程序段退出程序,否则继续。

3.2程序中用到的DOS功能调用(1)01H号功能调用(中断指令int 21h)功能:从键盘输入1个字符输入参数:无输出参数:AL=ASCII码(2)02H号功能调用(中断指令int 21h)功能:在屏幕上显示1个字符(ASCII码)输入参数:DL=ASCII码输出参数:无。

(3)09H号功能调用(中断指令int 21h)功能:多字符输出到屏幕显示输入参数:DS:DX=输出字符缓冲区首地址输出参数:无该功能对输出字符的个数没有要求,但输出字符串要以‘$’结束。

(4)4CH号功能调用(中断指令int 21h)功能:返回操作系统4CH调用:MOV AH,4CH3.3程序中用到的BIOS功能调用1)功能01H调用(中断指令int 16h)功能描述:检测键盘输出参数:ZF=1 无码可读ZF=0 输入于AX中2)功能02H调用(中断指令int 10h)功能描述:用文本坐标下设置光标位置入口参数:AH=02HBH=页号DH=行坐标DL=列坐标出口参数:无3)功能06H调用(中断指令int 10h)功能描述:初始化屏幕或滚屏入口参数:AH=06H向上滚屏,AH=07H向下滚屏AL=滚动行数(0,清窗口)BH=空白区域的缺省属性(CH、CL)=窗口的左上角坐标(X、Y)(DH、DL)=窗口的右下角坐标(X、Y)出口参数:无4.程序设计流程图程序流程图如下图所示,分为主程序流程图和子程序流程图。

主程序流程图如图4—1所示;置光标宏定义流程图如图4—2所示;延时子程序流程图如图4—3所示;字符显示流程图如图4—4所示。

开系统初是否有g输入缓慢显示提示字是否有y输入入栈保系统初赋AX、BX、闪烁图案出栈恢是否有esc入结图4—1主流程图图4—2置光标宏定义图4—3延时子程序流程图图4—4显示字符程序段流程图本次课程设计用到了二个不同大小的延时效果,故在延时程序中改变CX的赋值来改变延时长短。

清屏子程序流程图与置光标宏定义类似只需改变相应寄存器赋值和调用中断号即可。

显示图案时分部分显示连续的字符就能达到显示整个图案的效果。

5.主要程序分析5.1设置光标的宏定义程序如下:MA macro op1,op2push ax;保存数据push bxmov ah,02hmov bh,0mov dh,op1 ;光标纵坐标mov dl,op2 ;光标横坐标int10hpop bxpop axEndm该宏定义主要是调用功能02H(中断指令“INT 10H”)来确定光标的位置的。

该定义的主要功能首先是指定位置来完成字符‘@’或‘*’的显示与消失。

5.2时间延迟程序程序如下:waiting_1 proc nearpush cxpush dxmov dx,0ffhdll: mov cx,65500dl2: loop dl2dec dxjnz dllpop dxpop cxretwaiting_1 endpwaiting_2 proc nearpush cxpush dxmov dx,0fffhd2l: mov cx,65500d22: loop dl2dec dxjnz dllpop dxpop cxretwaiting_2 endp本题目中需要两种不同的延迟,通过改变dx的值来大致控制时间的长短。

6.程序调试显示6.1矩形及其对角线的显示程序运行之初,首先在屏幕上出现提示字符“please input b to begin”如图6—1所示,按下b/B键,屏幕上以较快速度分六笔画出矩形及其对角线,并由提示符“please input y to chose”如图6—2所示。

图6—1 初始提示字符图6—2 矩形及其对角线的显示6.2流水灯的运行根据提示符,按下Y/y键,屏幕和字符的颜色会变化,用*号代替灯来流水灯的效果,如图6—3所示,然后依次熄灭,并出现提示符“please q to quit”如图6—4。

最后根据提示符,按下Q/q键,退出程序。

如图6—3 流水灯出现6—4图流水灯消失7.心得体会两周的课程设计就这样匆匆结束,感觉时间很快,但是本次课程设计让我学到了很多东西。

首先,通过对这程序的制作,加深了我对课本知识的理解和掌握,使我对汇编语言的基本知识的使用更加熟练,同时也让我学到了新的知识,如DOS命令和BIOS命令的调用,让我大胆编写程序,实现自己想要的功能。

其次,在这次课程设计,需要与同学充分交流,加强团结合作的技巧。

通过查阅以下资料如课本以及网络也学到了一些课本上没有的东西,拓宽了自己的知识面,增加了学好汇编语言的信心。

此外,通过这个课程设计,让我切实的体会到了微机原理的重要性,同时增强了我的学习兴趣,然我发现,实际生活的常用知识都来自于我们所学的课本基础知识。

本次课程设计是一个综合的程序,平时的很多程序都用到了。

很多子程序的设计是固定的,因此可以直接从指导资料中调用,大多只需要修改几个参数就可以,这大大方便了我们的设计,为我们节省了很多的时间。

特别之处的是,通过本次‘霓虹灯’模拟显示的课程设计,我掌握了关于DOS和BIOS中断功能调用,如颜色显示,屏幕属性,字符输入\输出,字符串输入\输出等。

通过综合程序编写的联系,学会了编写相对复杂程序的基本方法步骤。

由于和同学相互交流学习,加强了合作能力,当要用到一些完全陌生的知识时需要独立去查询资料,加强了自学能力。

以上心得体会势必对我以后的学习和工作大有帮助,衷心感谢学校给我们这个宝贵的学习机会和老师的耐心指导!参考资料[1]齐志儒、高福祥.汇编语言程序设计.沈阳:东北大学出版,2001[2]刘均、周苏、金海荣.汇编语言程序设计实验教程.北京:科学出版社,2009[3]周佩玲、彭虎、傅忠谦.微机原理与接口技术.北京:电子工业出版社,2005[4]方立友.微机原理与汇编语言实用教程.北京:清华大学出版社,2007[5]凌志浩.微机原理与接口技术.上海:华东理工大学出版社,2006[6]朱世鸿.微机系统和接口应用技术.北京:清华大学出版社,2006附录程序清单如下所示:MA macro op1,op2push ax;保存数据push bxmov ah,02hmov bh,0mov dh,op1 ;光标纵坐标mov dl,op2 ;光标横坐标int10hpop bxpop axendmdata segmentinfo_1 db 'please input b to began',0dh,0ah,'$'info_2 db 'please input y to choose another way',0dh,0ah,'$'info_3 db 'please q to quit',0dh,0ah,'$' hang_1 db 8,8,8,8,8,8,8,8,8,8db 8,9,10,11,12,13,14,15,16,17db 17,17,17,17,17,17,17,17,17,17db 17,16,15,14,13,12,11,10,9,8,7hang_2 db 8,9,10,11,12,13,14,15,16,17db 8,9,10,11,12,13,14,15,16,17 hang_3 db 14,14,14,14,14,14,14lie_1 db 35,36,37,38,39,40,41,42,43,44 db 44,44,44,44,44,44,44,44,44,44, db 44,43,42,41,40,39,38,37,36,35 db 35,35,35,35,35,35,35,35,35,35 lie_2 db 35,36,37,38,39,40,41,42,43,44 db 44,43,42,41,40,39,38,37,36,35 lie_3 db 30,32,34,36,38,40,42count db 8clour db 0f7hdata endscode segmentassume ds:data,cs:code;**********清屏子程序*********clear_screen proc nearpush axpush bxpush cxpush dxmov ah,6mov al,0mov ch,0mov cl,0mov dh,24mov dl,79mov bh,7int10hpop dxpop cxpop bxpop axretclear_screen endp;**********延迟子程序******** waiting_1 proc nearpush cxpush dxmov dx,0ffh dll: mov cx,65500 dl2: loop dl2dec dxjnz dllpop dxpop cxretwaiting_1 endpwaiting_2 proc nearpush cxpush dxmov dx,0fffh d2l: mov cx,65500 d22: loop dl2dec dxjnz dllpop dxpop cxretwaiting_2 endpstart:mov ax,datamov ds,axxor ax,axxor bx,bxxor cx,cxxor dx,dxmov ah,02h;置光标位子mov bh,0;BH=页数mov dh,0;DH\DL=行列数mov dl,0int10hinfo:lea dx,info_1 ;提示字符输出mov ah,9int21hmov ah,01hint21hcmp al,'b' ;输入字符检查是否为g/Gje xianshi_1 ;是则跳转到xianshi_1cmp al,'B' ;否则跳回info重新检查je xianshi_1jmp info;**********方式一显示程序********xianshi_1:mov ah,06h;屏幕初始化mov bh,29H;卷入行属性mov cx,0;左上角行列坐标(0,0)mov dx,1850h;右下角行列坐标(80,80)int10hlea si,hang_1 ;取hang_1,lie_1字符串的首地址lea di,lie_1mov cx,40;cx赋值确定循环次数loop_1:MA [si],[di] ;调用宏定义移动光标mov dl,'@'mov ah,02;在光标处显示输出‘*’int21hinc si ;指针自加inc diMA 0,0;移动光标call waiting_1 ;延时loop loop_1 ;循环loop_1xianshi_2: ;显示图案第二部分lea si,hang_2lea di,lie_2mov cx,20loop_2:MA [si],[di]mov dl,'@'mov ah,02int21hinc siinc diMA 0,0call waiting_1loop loop_2lea dx,info_2 ;方式选择提示mov ah,9int21hmov ah,01hint21hcmp al,'y' ;检查输入字符是否为y/Yje liushui ;是,则跳转到liushuicmp al,'Y' ;否,则跳转到xianshi_1je liushuicall clear_screen ;调用清屏程序jmp xianshi_1;**********流水灯子程序*******liushui:call clear_screen ;清屏xor ax,axxor bx,bxxor cx,cxxor dx,dxmov ah,06h;屏幕初始化mov bh,4ah;卷入行属性mov cx,0;左上角行列坐标(0,0)mov dx,1850h;右下角行列坐标(80,80)int10hMA 0,0;提示语显示lea dx,info_3mov ah,9int21hcall waiting_1xianshi_3: ;快速形成图案lea si,hang_3lea di,lie_3mov cx,7loop_3:MA [si],[di]mov dl,'*'mov ah,02int21hinc siinc diMA 0,0call waiting_2 ;延时减小loop loop_3xianshi_4: ;快速形成图案lea si,hang_3lea di,lie_3mov cx,7loop_4:MA [si],[di]mov dl,''mov ah,02int21hinc siinc diMA 0,0call waiting_2 ;延时减小loop loop_4;****检测是否按下Q键********mov ah,01hint21hcmp al,'Q'je QUITcmp al,'q'je QUITjmp liushui;*******中止程序******** QUIT:mov ah,4chint21hcode endsend start。

相关主题