《微机原理霓虹灯显示程序课程设计(共35页).doc》由会员分享,可在线阅读,更多相关《微机原理霓虹灯显示程序课程设计(共35页).doc(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上霓虹灯显示程序设计1设计内容及要求要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1用汇编语言编写一个霓虹灯的模拟显示程序;2在屏幕上显示你的中文名字或其它文字,按某种规律闪烁变化,按“q”键退出;3撰写课程设计说明书。内容包括:摘要、目录、正文、参考文献、附录(程序清单)。正文部分包括:设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。2程序原理分析本次设计实现的是霓虹灯的模拟显示,在80*25大小的屏幕上显示由各种字符组成的不同图形,在屏幕上,0行0
2、列相对于屏幕左上角的位置,24行79列相对于右下角的位置。对应显示屏幕上的每个字符,在存储器中又连续的两个字节表示,一个字节保存ASCII码,另一个字节保存字符的属性。在屏幕上处理字母、数字以及一些字符图形称为文本方式。在文本方式下,属性字节对单色显示和彩色显示都是有效的。本程序采用的是彩色字符显示,在显示彩色文本时,属性字节能够选择前景和背景的颜色。每个字符可以选择16种颜色中的一种,背景色有8种颜色可以选择。图1-1是16色文本方式显示的属性字节。表1-1列出了16色字符方式颜色的组合。76543210BLRGBIRGB闪烁前景背景图1-1 16色方式下的属性字节表1-1 16种颜色的组合
3、颜色IRGB颜色IRGB颜色IRGB颜色IRGB黑0000灰1000红0100浅红1100蓝0001浅蓝1001品红0101浅品红1101绿0010浅绿1010棕0110黄1110青0011浅青1011灰白0111白1111本程序主要运用了BIOS显示中断类型10H的部分功能,主要有用到以下几个功能:置光标:AH=02 BH=页号 DH=行 DL=列读光标:AH=03显示字符串:AH=13H AL=01H ;光标跟随移动ES:BP=串地址 CX=串长度 DH,DL=起始行列 BH=页号 BL=属性即程序通过INT 10H2号功能的调用置光标位置,3号功能的调用读光标的位置,以及13号功能的调用
4、显示字符串。并通过顺序、循环结构程序的调用进行图形的霓虹灯效果显示。程序的数据段以字符串的形式来表示,可以很方便的直接运用INT 10H中的13号功能即显示字符串功能显示图形,这样一来程序得到了很大的简化,但同时,图形的显示是以字符串的形式,即以行的依次顺序逐渐出像在屏幕上,在字符串一次出现的同时,通过调用相应的子程序改变图形显示的颜色属性,以及不断变换显示图形的形状。同时由于微机处理速度较快,不容易一次看到图形变化,则需要在程序中添加延迟程序作为子程序不断被调用用以减缓显示速度,方便肉眼观察到图形变换效果。延迟程序中,由于寄存器CX存储有限,不能达到合适的延迟程度,故应采用循环结构的子程序来
5、进行延迟操。专心-专注-专业3 程序流程图3.1 主程序流程图定义数据段,然后将代码段程序初始化,然后调用13号功能显示字符串组成的董德军三个字 ,再调用条纹显示子程序,显示运动的条纹,判断是否输入Q,若输入Q,则程序结束,退出程序,否则,执行跳转命令,继续调用汉字显示程序和条纹显示程序。主程序结构流程图如图2-1开始Y数据段初始化调用汉字显示程序以不同颜色重复显示名字“董德军”N调用条纹显示子程序,显示运动的条纹是否输入Q/q?Y结束图3-1 主程序结构流程图3.2 子程序结构流程图3.2.1名字显示子程序流程图按照要求要显示出自己的名字,因此,运用多个字符组成,并按照笔画顺序显示出来,结构
6、流程图如图3-2所示。 开始Y N判断CX中内容是否为0? CX出栈,保存循环次数CX入栈 保存组成点的基本信息 寄存器入栈CX寄存器清零 在指定坐标处写第一个点 CX中内容自减1寄存器出栈 结束 图3-2 名字显示子程序流程图3.2.2擦除子程序流程图 在显示完名字并进行变色以后,将使用竖条纹对屏幕进行擦出,擦除以后若没有检测到字符Q的输入,则进行循环,继续显示名字,并在此进行擦出,擦出子程序流程图如图3-3所示。开始N NNYY 结束保存点的基本信息列坐标dl自减1将字符改为*将字符写11个判断指定位置处字符是否为?判断是否到达屏幕最左端?保存组成点的基本信息判断指定位置处字符是否为*?
7、图3-3 擦除子程序流程图 4 程序主要模块功能分析4.1名字显示功能模块如何使用ASCII码显示自己的中文名字是这次课程设计的关键之处,为了达到霓虹灯的效果,我采用各种字符组合,来组成名字的形状,为了达到更美观的效果,在这里,借助一个字符画转换软件,名字为ASCIIArtStudioASCII,该软件是用来创建ASCII字符画的软件,可以像使用画笔一样创建 ASCII 字符画。还支持将图片转换为字符画,以及保存成文本或图片文件等功能。首先我使用画图工具将自己的名字打出来,并转化为图片格式,如图4-1所示。图4-1 使用绘图工具得到宋体的中文名字然后运行ASCIIArtStudioASCII软
8、件,点击菜单栏文件,选择将图片转换为ASCII ART一项,读出图片,点击转换,将图片转化为字符画,所得字符画如图4-2所示。图4-2 名字的ASCII码组成然后按照每一个字符的坐标方位在80*25大小的屏幕上显示由各种字符组成的文字,在屏幕上,0行0列相对于屏幕左上角的位置,24行79列相对于右下角的位置。对应显示屏幕上的每个字符,在存储器中又连续的两个字节表示,一个字节保存ASCII码,另一个字节保存字符的属性。在屏幕上处理字母、数字以及一些字符图形称为文本方式。在文本方式下,属性字节对单色显示和彩色显示都是有效的。在彩色显示器里,如 CGA、EGA、VGA 等,常用一个字节 ( 8 个位
9、 ) 来表示文字颜色和背景颜色,通常以第 03 位表示文字本身颜色;第 46 位表示背景颜色,背景颜色只有上表左栏的 8 种而已;第 7 个位,表示是否闪烁,0 表示不闪烁,1 表示闪烁。每个字符由四种属性组成,第一项为字符种类,如61h代表字符“a”,第二项为字符的颜色,如Oah代表绿色,第三项为字符相对于前一个字符的行坐标,第四项为该字符对于上一个字符的列坐标,这样只要定义了第一个字符在屏幕中的位置,那么就能将整个汉字显示出来。以下为第一个汉字“董”所定义的数据段。dong db 130 db 61h,0ah,0,0 db 12 dup(a,0ah,0,1) db 30h,0ah,0,1
10、db &,0ah,0,1 db ,0ah,-1,-9 db n,0ah,0,1 db J,0ah,1,-1 db &,0ah,0,1 db ,0ah,1,-1 db f,0ah,0,1 db 26h,0ah,-2,4 db 26h,0ah,1,0 db !,0ah,1,0 db ,0ah,0,1 db g,0ah,0,1 db 22h,0ah,1,0 db 7eh,0ah,0,-1 db 7eh,0ah,0,-1 db M,0ah,0,-1 db 0,0ah,0,-1 db M,0ah,0,-1 db *,0ah,0,-1 db v,0ah,0,-1 db a,0ah,0,-1 db 61h,
11、0ah,0,-1 db 61h,0ah,1,-2 db 12 dup(a,0ah,0,1) db 30h,0ah,0,1 db e,0ah,0,1 db 5dh,0ah,2,-12 db 36h,0ah,0,1 db 5dh,0ah,1,-1 db M,0ah,0,1 db 5dh,0ah,1,-1 db L,0ah,0,1 db _,0ah,-3,0 db 7 dup(_,0ah,0,1) db j,0ah,0,1 db B,0ah,1,0 db #,0ah,1,0 db #,0ah,1,0 db 7eh,0ah,-1,-7 db 6 dup(,0ah,0,1) db 61h,0ah,1,-
12、6 db 6 dup(a,0ah,0,1) db 26h,0ah,-4,-3 db 7 dup(&,0ah,1,0) db P,0ah,-4,0 db 8,0ah,3,0 db !,0ah,0,-6 db ,0ah,0,1 db 4 dup(,0ah,0,1) db ,0ah,0,2 db 4 dup(,0ah,0,1) db ,0ah,-1,0 db 27h,0ah,3,-12 db 14 dup(27h,0ah,0,1) db ,0ah,-1,0 db _,0ah,0,-1显示名字的的过程如下面程序段所示,其中前三句是将汉字位型图的地址送给寄存器,dh和dl分别表示汉字的其实的第一个点在屏
13、幕上的行列的坐标,call指令用于子程序调用,分别调用move_shape1和 Amust_2子程序,进行读点和写点。 lea di,dong mov dh,7 mov dl,17 call move_shape1 call Amust_2在move_shape1子程序中,和Amust_2子程序中,char_cntl是指字符,pointer1表示颜色,line_on1为行坐标,col_on1为列坐标。 mov char_cnt1,cx mov pointer1,di mov line_on1,dh mov col_on1,dl名字的显示效果如图4-2所示。 图4-2名字显示结果4.2颜色变化功
14、能模块颜色变化功能实际上就是将名字用其他颜色重新写一遍,将原来的文字覆盖,因此可实现文字颜色变化,本程序用的是重新定义数据段的方法,将每个字符重新定义,还有一种方法是使用函数,将每个字符代表字符颜色的部分同时加减一个数,便可实现变色功能。文字变色的显示结果如图4-3所示。图4-3 文字变色显示结果4.3条纹清屏与文字闪烁功能模块程序通过从右向左将名字显示覆盖,即达到清除屏幕显示的名字的效果。若将调用的延迟程序调的快一些,还可以达到文字闪烁的效果,在这里提一下,实现文字闪烁的功能也可以通过改变定义数据段中文字的属性实现,程序模块如下:Aerase proc near mov cx,char_cn
15、t1 mov di,pointer1 mov dh,line_on1 mov dl,col_on1 Aerase_next: add dh,di+2 add dl,di+3 cmp dl,2 je Aleft mov ah,2 int 10h mov ah,8 int 10h cmp al,40h je Aexitx2 cmp al,02ah je Aexitx2 jmp Aexitx3 Aexitx2: dec Acount0 jne Aexitx3 mov Acount0,11 Aexitx3: cmp Acount1,1 je Aexit0 mov al,* mov bl,03h jmp
16、 Aexit7 Aexit0: mov al,* mov bl,0 Aexit7: push cx mov cx,1 mov ah,9 int 10h pop cx cmp Acount0,11 jne Aerase_next add di,4 loop Aerase_next dec col_on1 mov cx,char_cnt1 mov di,pointer1 mov dh,line_on1 mov dl,col_on1 Aleft: ret Aerase endpcol_onl代表的是列坐标,每次循环经过dec col_onl就可以实现的列坐标自减1的功能,从而使得条纹字符从右向左而来
17、,经过除所有字符都变为“*”。显示效果如图4-4所示。图4-4 条纹清屏的显示效果4.4按Q/q键退出功能模块 该设计要求在程序运行过程中,按下Q或q键能够推出程序,因此在程序中加入了退出功能模块,首先判断有没有字符输入,没有就跳转到Aagain,若检测到字符输入,再把输入字符与Q/q相比较,若不同,还是跳转到Aagain执行循环,若是Q/q,则执行退出命令,返回DOS。 mov ah,0bh int 21h cmp al,0 jz Aagain mov ah,1 int 21h cmp al,q jz exit cmp al,Q jz exit jmp Aagainexit : mov ax
18、,4c00h int 21h 4.5延迟功能模块 若显示程序没有了延时功能模块,那么所有的显示内容都将一闪而过,根本看不清,因此,我们需要在程序中加入延迟程序,除此之外延迟程序可以用来控制汉字显示的快慢以及刷屏的快慢速度,汉字显示的慢一些会有一笔一画写出来的效果,非常漂亮,刷屏快一些则会有闪烁的效果出现。以下是延迟模块的子程序。 dly_qrtr proc near push cx push dx mov dx,25 dll: mov cx,65530 dl2: loop dl2 dec dx jnz dll pop dx pop cx ret dly_qrtr endp5程序调试在WINXP
19、操作系统下,在MFPCI98软件中编入80x86汇编程序,用MASM5.0编译,进行汇编、连接、运行操作。对编译时出现的错误进行调试。我在编译时容易出现遗漏对应指令的错误,如进行CALL指令调用子程序时,容易遗漏在CALL后的RET指令,导致运行时出现错误图形。还有在调用INT 10H功能时,读光标,置光标还有显示字符串指令时,对寄存器AX,BX,DX,CX,BP的数据传送应根据光标起始位的行列坐标需求来确定数据的传送,才能达到要求的图形显示效果。 6课程设计总结一拿到这个课程设计,我就被吓了一跳,因为要显示自己的名字,而我的名字有33画,要用一个个字符组合显示出来,实在是一个庞大的工程量,这
20、对我的耐心和我的毅力都是一个很大的考验,虽然可以用别的文字替换,但我最终还是决定将自己的名字做出来,为此,我花费了近四个小时。最终对自己做出的成果还算满意。经过两个周的课程设计,我认识到,课程设计是能真正让人学到实际应用的东西的一门课程,收获比上几个星期的课还多。首先,要实现题目要求的功能,我们必须全心的投入其中,养成一种敢于钻研的习惯,在把课程要求实现到实际中来的过程中,首先必须要有个清晰地思路,设计方案,这就需要能够精心钻研。其次,通过课程设计,让我在课本的基础上,更深入的了解了各种指令的用法和程序的完成过程,调试方法及技巧。为了了解程序思路,我查了不少指令的功能资料,以及关于显示器显示的
21、功能要求,并了解了霓虹灯功能的实现。编写程序的过程中,体会最深的是子程序的调用和程序的条理问题,一个程序就算功能实现了,但是也要使主程序和子程序的条理分明,易读性高,才能算一个比较好的程序,调试程序中,学习了汇编语言的整个调试过程,更加容易的找出程序的错误处了。课程设计终于圆满完成了,在这次课程设计过程中,我得到了许多人的帮助。首先我要感谢与我同组的同学,没有我们的一致团结合作,就没有我们今天的成果,同时,也要感谢其他组的同学,在我们有疑问的时候,你们给予了及时的解答,及时的提醒让我们得以少走很多弯路。还有,我的课程设计指导老师老师在课程设计上给予我了指导、提供给我的支持和帮助,这是我能顺利完
22、成这次报告的主要原因,更重要的是老师利用自己渊博的知识以及丰富的设计经验帮我解决了许多技术上的难题,让我能把程序做得更加完善。在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。参考文献1沈美明,温冬禅编著.IBM-PC汇编语言程序设计.第二版.北京:清华大学出版社,20012周佩玲,吴耿峰,万炳奎编著.十六位微型计算机原理接口及其应用.合肥:中国科学技术大学出版社,19953艾德才编著.Pentium/80486实用汇编语言程序设计.北京:高等教育出版社,20004谭浩强编著.计算机硬件技术基础.北京:电子工业出版社,20045李继灿编著.新编16-32位微型计算机原
23、理及应用.北京:清华大学出版社,19976邹逢兴编著.计算机硬件技术基础.北京:高等教育出版社,20017邹逢新等编著.微型计算机原理及其应用典型题解析与实战模拟.长沙:国防科技大学出版社,20018周佩玲,彭虎,傅忠谦编著.微机原理与接口技术.北京:电子工业出版社,2007附录 源程序代码;-DATA_SEGMENT- ;DATA_SEGMENT部分为定义数据段 data_seg segment;-A-*-A- dong db 130 ;定义“董”的字符个数 db 61h,0ah,0,0 db 12 dup(a,0ah,0,1) db 30h,0ah,0,1 db &,0ah,0,1 db
24、,0ah,-1,-9 db n,0ah,0,1 db J,0ah,1,-1 db &,0ah,0,1 db ,0ah,1,-1 db f,0ah,0,1 db 26h,0ah,-2,4 db 26h,0ah,1,0 db !,0ah,1,0 db ,0ah,0,1 db g,0ah,0,1 db 22h,0ah,1,0 db 7eh,0ah,0,-1 db 7eh,0ah,0,-1 db M,0ah,0,-1 db 0,0ah,0,-1 db M,0ah,0,-1 db *,0ah,0,-1 db v,0ah,0,-1 db a,0ah,0,-1 db 61h,0ah,0,-1 db 61h,
25、0ah,1,-2 db 12 dup(a,0ah,0,1) db 30h,0ah,0,1 db e,0ah,0,1 db 5dh,0ah,2,-12 db 36h,0ah,0,1 db 5dh,0ah,1,-1 db M,0ah,0,1 db 5dh,0ah,1,-1 db L,0ah,0,1 db _,0ah,-3,0 db 7 dup(_,0ah,0,1) db j,0ah,0,1 db B,0ah,1,0 db #,0ah,1,0 db #,0ah,1,0 db 7eh,0ah,-1,-7 db 6 dup(,0ah,0,1) db 61h,0ah,1,-6 db 6 dup(a,0ah
26、,0,1) db 26h,0ah,-4,-3 db 7 dup(&,0ah,1,0) db P,0ah,-4,0 db 8,0ah,3,0 db !,0ah,0,-6 db ,0ah,0,1 db 4 dup(,0ah,0,1) db ,0ah,0,2 db 4 dup(,0ah,0,1) db ,0ah,-1,0 db 27h,0ah,3,-12 db 14 dup(27h,0ah,0,1) db ,0ah,-1,0 db _,0ah,0,-1 dong1 db 130 db 61h,0ch,0,0 db 12 dup(a,0ch,0,1) db 30h,0ch,0,1 db &,0ch,0
27、,1 db ,0ch,-1,-9 db n,0ch,0,1 db J,0ch,1,-1 db &,0ch,0,1 db ,0ch,1,-1 db f,0ch,0,1 db 26h,0ch,-2,4 db 26h,0ch,1,0 db !,0ch,1,0 db ,0ch,0,1 db g,0ch,0,1 db 22h,0ch,1,0 db 7eh,0ch,0,-1 db 7eh,0ch,0,-1 db M,0ch,0,-1 db 0,0ch,0,-1 db M,0ch,0,-1 db *,0ch,0,-1 db v,0ch,0,-1 db a,0ch,0,-1 db 61h,0ch,0,-1 d
28、b 61h,0ch,1,-2 db 12 dup(a,0ch,0,1) db 30h,0ch,0,1 db e,0ch,0,1 db 5dh,0ch,2,-12 db 36h,0ch,0,1 db 5dh,0ch,1,-1 db M,0ch,0,1 db 5dh,0ch,1,-1 db L,0ch,0,1 db _,0ch,-3,0 db 7 dup(_,0ch,0,1) db j,0ch,0,1 db B,0ch,1,0 db #,0ch,1,0 db #,0ch,1,0 db 7eh,0ch,-1,-7 db 6 dup(,0ch,0,1) db 61h,0ch,1,-6 db 6 dup
29、(a,0ch,0,1) db 26h,0ch,-4,-3 db 7 dup(&,0ch,1,0) db P,0ch,-4,0 db 8,0ch,3,0 db !,0ch,0,-6 db ,0ch,0,1 db 4 dup(,0ch,0,1) db ,0ch,0,2 db 4 dup(,0ch,0,1) db ,0ch,-1,0 db 27h,0ch,3,-12 db 14 dup(27h,0ch,0,1) db ,0ch,-1,0 db _,0ch,0,-1 dong2 db 130 db 61h,0eh,0,0 db 12 dup(a,0eh,0,1) db 30h,0eh,0,1 db &
30、,0eh,0,1 db ,0eh,-1,-9 db n,0eh,0,1 db J,0eh,1,-1 db &,0eh,0,1 db ,0eh,1,-1 db f,0eh,0,1 db 26h,0eh,-2,4 db 26h,0eh,1,0 db !,0eh,1,0 db ,0eh,0,1 db g,0eh,0,1 db 22h,0eh,1,0 db 7eh,0eh,0,-1 db 7eh,0eh,0,-1 db M,0eh,0,-1 db 0,0eh,0,-1 db M,0eh,0,-1 db *,0eh,0,-1 db v,0eh,0,-1 db a,0eh,0,-1 db 61h,0eh,0,-1 db 61h,0eh,1,-2 db 12 dup(a,0eh,0,1) db 30h,0eh,0,1 db e,0eh,0,1 db 5dh,0eh,2,-12 db 36h,0eh,0,1 db 5dh,0eh,1,-1 db M,0eh,0,1 db 5dh,0eh,1,-1 db L,0eh,0,1 db _,0eh,-3,0 db 7 dup(_,0eh,0,1)