《《微机原理与接口技术》课程设计说明书-霓虹灯显示程序设计..doc》由会员分享,可在线阅读,更多相关《《微机原理与接口技术》课程设计说明书-霓虹灯显示程序设计..doc(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 霓虹灯显示程序设计1设计内容简介 汇编语言是用指令的助记符、符号地址、标号等书写程序的语言,实际上是机器语言的一种符号表示,主要特点是可以使用助记符来表示机器指令的操作码和操作数,可以用标号和符号来代替地址、常量和变量。汇编语言是能够利用计算机所有硬件特性进而直接控制硬件的唯一语言。汇编语言的使用范围很广,文字显示只是其中很简单的一项。本次课程设计采用DOS和BIOS功能调用,采用2580的彩色图像显示方式。先在坐标纸上用ASCII码所对应的字符拼出自己的名字,并设定ASCII码的颜色值。ASCII码对应字符的位置由行数与列数的二维坐标确定。其中行向上则减,向下则增;列向左则减,向右则增。程
2、序在数据段中写出所要显示的我名字的位形图,每行数据段定义组成文字的一个点。其中包含组成文字的字符、颜色、横坐标、纵坐标。文字的变色是通过同一个字的不同颜色版本去覆盖当前的版本以及清屏、擦除程序实现的。文字的闪烁则是通过将颜色属性的八位二进制数的最高位置一实现的。通过比较输入字符与0、Q或q的大小,来实现退出的功能。2设计任务及要求 本次霓虹灯显示程序设计任务书的内容要求如下: 1用汇编语言编写一个霓虹灯的模拟显示程序; 2在屏幕上显示你的中文名字或其它文字,按某种规律闪烁变化,按“q”键退出; 分析任务书要求可知:本次程序设计尽量在屏幕上显示自己的名字,也可以显示其他的文字。文字要按某种方式闪
3、烁,闪烁方式不限定于一种,也可以多种。程序运行过程中,有Q或q输入,则程序结束;无字符输入或输入字符不是Q、q,则程序照常运行。3方案论证 本次课程设计在确定最终方案之前,各个功能模块都从多种设计中比较得出。 (1)文字显示可采用坐标纸写点的方式或者直接用字模软件取字符。原本下载了一个字模软件,在其中输入文字就可以读取字模。但是其字模编码是用于LED中的,并不能直接在本程序中调用显示文字。因此,最后采用用坐标纸写点的方式, 虽然写点的工作量较大,但是便于理解,容易修改。 (2)用相同字体但不同颜色的字符去覆盖对应的字符,只能起到变色的作用。要实现闪烁还要把每一个点的颜色属性最高位设为1。 (3
4、)退出程序块中,在判断输入字符是否为Q或q之前必须加一段有没有字符输入的程序。否则,程序运行到判断字符这里,运行窗口就会等在那里,直到输入字符才能继续运行。这样每次运行到这里程序就会等着,实现不了霓虹灯的连续闪烁。4软件设计说明主程序流程图 流程思路:数据段初始化调用汉字显示程序,先显示汉字”yu”,再显示汉字”yu1”调用竖条纹显示程序,显示运动的条纹判断是否有字符输入,没有的话,继续往下执行有字符输入时,判断是否为“Q”或“q”不为“Q”或“q”时,转到执行程序段Aagain1为“Q”或“q”时,退出程序。主程序流程图如下:开始数据段初始 YY N N调用条纹显示子程序,显示运动的条纹调用
5、汉字显示子程序,先后显示“xiang”,“xiang1”调用条纹显示子程序,显示运动的条纹 结束输入字符是否是“Q”、“q”?调用汉字显示子程序,先后显示“jia”,“jia1”调用条纹显示子程序,显示运动的条纹调用汉字显示程序,先后显示“yu”,“yu1”判断是否有字符输入? 图1 霓虹灯显示主程序子程序流程图 本程序显示的汉字为自己的名字,名字中的每个字都用不同颜色的版本写两次,然后竖形条纹扫过,条纹扫过时汉字被覆盖,条纹扫过后开始显示下一个文字,然后条纹再扫过,一直这样循环。因此,子程序有汉字显示子程序、竖形条纹显示子程序、擦除子程序,对应的流程图分别如图2、3、4所示。 开始Y N C
6、X中内容自减1寄存器出栈判断CX中内容是否为0? CX出栈,保存循环次数 在指定坐标处写第一个点CX入栈 保存组成点的基本信息CX寄存器清零寄存器入栈 结束 图2 汉字显示子程序流程图 开始 寄存器入栈CX寄存器清零保存组成点的基本信息 结束 寄存器出栈 将字符写11次判断指定坐标处字符是否为*?判断指定坐标处字符是否为?CX出栈,保存循环次数在指定坐标处写第一个点判断是否到达屏幕最左端? CX寄存器入栈 YN Y N N Y 图3 竖形条纹显示子程序 开始N NNYY 结束保存点的基本信息列坐标dl自减1将字符改为*将字符写11个判断指定位置处字符是否为*?判断指定位置处字符是否为?判断是否
7、到达屏幕最左端?保存组成点的基本信息 图4 擦除子程序程序中用到的BIOS内的中断功能 (1)02H号功能调用 功能:用文本坐标下设置光标位置 入口参数:AH=02H BH=显示页码 DH=行(Y坐标) DL=列(X坐标) 出口参数:无 (2)08H号功能调用 功能:读光标处的字符及其属性 入口参数:AH=08H BH=显示页码 出口参数:AH=属性 AL=字符 (3)09H号功能调用 功能:在当前光标处按指定属性显示字符 入口参数:AH=09H AL=字符 BH=显示页码 BL=属性(文本模式)或颜色(图形模式) CX=重复输出字符的次数 出口参数:无 (4)0FH号功能调用 功能:读取显示
8、器模式 入口参数:AH=0FH 出口参数:AH=屏幕字符的列数 AL=显示模式 BH=页码程序中用到的DOS功能调用 (1)01H号功能调用 功能:从键盘输入一个字符 输入参数:无 输出参数:AL=ASCII码 (2)0BH号功能调用 功能:检查标准输入设备上是否有字符可读,该输入操作可被重定向 输入参数:AH=0BH 输出参数:AL=00H无字符可读;FFH有字符可读 (3)4CH号功能调用 功能:返回操作系统4CH 调用:MOV AH,4CH INT 21H主要程序段与程序设计分析 (1)数据段 本课程设计源程序中的汉字运用写点的方式实现,在数据段的定义中,由组成汉字的点的ASCII码值、
9、颜色、X坐标、Y坐标构成。 例如: yu db 34 db 2ah,8ah,0,0 db 2ah,8ah,-5,1 db 2ah,8ah,4,0 db 2ah,8ah,-5,1 这段程序是第一个汉字“余”的位形图,其中2ah为组成“余”字第一个点的ASCII码值,在屏幕上显示为*;8ah为颜色属性,为淡绿色且闪烁;(0,0)为这个点的坐标,第一个为行坐标,第二个为列坐标。这个点为“余”字组成点的基准坐标,其它点的坐标设置与此点类似。坐标设置按照矩阵的形式,向上则行自减1,向下则行自增1,向左则列自减1,向右则列自增1。每写出一个点后,该点的坐标变回基准坐标(0,0)。本程序中写点是按照从左到右
10、、从上到下的顺序写的,直至写完所有的点。 (2)写点程序段 首先将汉字位形图的地址送给寄存器,程序如下: lea di,yu mov dh,17 mov dl,6 其中,dh,dl分别对应于所写汉字第一个点在屏幕上显示时的行、列坐标。然后读取组成点的信息,程序段如下: mov char_cnt1,cx mov pointer1,di mov line_on1,dh mov col_on1,dl mov char,cx 程序中char_cnt1指字符,pointer1指颜色,line_on1指行坐标, col_on1指列坐标。写点的程序在子程序Amust_2,Amust_21中类似,程序段如下:
11、 mov cx,char_cnt1 mov di,pointer1 mov dh,line_on1 mov dl,col_on1Aplot_next0: add dh,di+2 add dl,di+3 mov ah,2 int 10h mov al,di mov bl,di+1 push cx mov cx,1 mov ah,09 int 10h pop cx add di,4应当说明的是,程序中 cx寄存器入栈又出栈。入栈是为了保存cx中的数值,将寄存器cx空出来,作为计数用,随即出栈的目的是重新将已经保存的cx中的值保存到 cx中,作为循环次数用。程序中到 int 10h为止都是写点的程序
12、。add di,4是为写下一个点做准备,直至写完。 (3)输入Q、q退出程序 mov ah,0bh int 21h cmp al,0 jz Aagain1 mov ah,1 int 21h cmp al,q jz exit cmp al,Q jz exit jmp Aagain1exit : mov ax,4c00h int 21h本段程序实现了首先判断有没有字符输入,有字符输入再判断是否为Q、q,进而判断是否退出。若没有 jmp Aagain1这条语句,输入的字符不是Q、q程序也会结束。 (4)竖形条纹的显示程序 cmp al,40h je Aexitx0 cmp al,02ah je Ae
13、xitx0 jmp Aexitx1 Aexitx0: dec Acount0 jne Aplot_next mov Acount0,11 数据段中竖形条纹只定义了6个点,为了能够有足够的宽度将汉字覆盖,因此要将db 40h,05h,1,0与db 02ah,05h,-1,0两个点重复写11次,形成够宽的条纹。主程序中Acount0先定义为了11,写完11个“”后,Acount0重新赋值11,再将02ah对应的字符“*”写11次,构成完整的竖形条纹。 (5)竖形条纹的移动与擦除程序 自己名字三个字的依次显示是通过竖形条纹的移动覆盖与擦除程序实现的。 Aerase_next: add dh,di+2
14、 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 Aexit7 Aexit0: mov al,* mov bl,0 Aexit7: push cx mov cx,1 mov ah,9 int 10
15、h pop cx cmp Acount0,11 jne Aerase_next add di,4 loop Aerase_next dec col_on1 在每次写完竖形条纹以后,由dec col_on1实现起始点列坐标的的自减1,从而实现竖形条纹的从右向左移动。屏幕的擦除是通过比较竖形条纹与“*”,相同则不变,不同则将次字符改为“*”实现的。 首先显示两种版本彩色的“余”字,并且能够闪烁。 图中四个白色方格实际是闪烁功能,按Alt+Enter在全屏下观看,则可看见闪烁。然后竖形条纹从右向左扫过,覆盖“余”字,开始以同样的方式写“佳”字。 最后,同样竖形条纹从右向左扫过,覆盖“佳”字,进而开始
16、显示“翔”字。“翔”字显示完以后,重新开始循环显示自己名字的三个字,直至输入了Q、q程序结束,否则一直循环。5程序调试说明和结果分析 使用汇编语言调试器DEBUG进行调试,DEBUG程序是专门为汇编语言设计的一种调试工具。它能给DOS提供有力的纠错、跟踪和运行功能,并能检查系统的各个数据。该工具可以通过单步、设置断点等方法微程序设计者提供一种有效的调试手段。 本程序在调试过程中,遇到了很多自己思考不周的问题。第一,在没有输入任何字符的情况下,程序运行到字符检测点停了下来,必须输入一个字符让程序继续或结束。经过检查原来是没有设置判断是否有字符输入的程序,修改后解决了;第二,输入的字符非Q、q时,
17、程序也会结束。在和Q、q比较的程序段之后、过程终止程序段之前加上jmp Aagain1语句,即正常了。第三,在使用条件转移指令jz时,发现不能生成obj文件,经检查发现jz与要调用的程序距离太远,把二者距离拉近后问题得到解决。第四,写好程序运行时发现屏幕上显示的汉字严重错位,检查数据段发现有一个点没有定义,重新定义后显示了正确的字符。真是一个小疏漏造成大问题。6心得体会 经过两周的霓虹灯显示程序设计课程设计,我觉得学习像微机原理与接口技术这样实用的知识,不仅要掌握书本上的基本内容,还要灵活思考,善于变换,这样才能找到最优设计,达到事半功倍的效果。课程设计是培养学生综合运用所学知识,发现,提出,
18、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。回顾起此次微机原理课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的
19、问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。 我通过在网上找资料,在图书馆借书,找到了一点有用的信息但这些都不是自己的,后来努力钻研把它们变为了自己的知识。在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师的身上我学得到很多实用的知识,在此我表示感谢! 参考文献 附录data_seg segment ;定义数据段 yu db 34 ; 第一个“余”字的位形图 db 2ah,8ah,0,0 db 2ah,8ah,-5,1 db 2ah,8ah,4,0 db 2ah
20、,8ah,-5,1 db 3dh,8ah,2,0 db 2ah,8ah,2,0 db 2ah,8ah,-5,1 db 3dh,8ah,3,0 db 2ah,8ah,3,0 db 2ah,8ah,-7,1 db 3dh,8ah,2,0 db 3dh,8ah,2,0 db 2ah,8ah,4,0 db 2ah,8ah,-9,1 db 3dh,8ah,3,0 db 40h,8eh,1,0 db 3dh,8ah,1,0 db 40h,8eh,1,0 db 40h,8eh,1,0 db 40h,8eh,1,0 db 40h,8eh,1,0 db 2ah,8ah,-10,1 db 2ah,8ah,1,0
21、db 3dh,8ah,3,0 db 3dh,8ah,2,0 db 2ah,8ah,-4,1 db 3dh,8ah,4,0 db 2ah,8ah,2,0 db 2ah,8ah,-5,1 db 3dh,8ah,3,0 db 2ah,8ah,3,0 db 2ah,8ah,-5,1 db 2ah,8ah,6,0 db 2ah,8ah,-5,1yu1 db 34 ;第二个“余”字的位形图 db 2ah,0ch,0,0 db 2ah,0ch,-5,1 db 2ah,0ch,4,0 db 2ah,0ch,-5,1 db 3dh,0ch,2,0 db 2ah,0ch,2,0 db 2ah,0ch,-5,1 d
22、b 3dh,0ch,3,0 db 2ah,0ch,3,0 db 2ah,0ch,-7,1 db 3dh,0ch,2,0 db 3dh,0ch,2,0 db 2ah,0ch,4,0 db 2ah,0ch,-9,1 db 3dh,0ch,3,0 db 40h,01h,1,0 db 3dh,0ch,1,0 db 40h,01h,1,0 db 40h,01h,1,0 db 40h,01h,1,0 db 40h,01h,1,0 db 2ah,0ch,-10,1 db 2ah,0ch,1,0 db 3dh,0ch,3,0 db 3dh,0ch,2,0 db 2ah,0ch,-4,1 db 3dh,0ch,
23、4,0 db 2ah,0ch,2,0 db 2ah,0ch,-5,1 db 3dh,0ch,3,0 db 2ah,0ch,3,0 db 2ah,0ch,-5,1 db 2ah,0ch,6,0 db 2ah,0ch,-5,1jia db 43 ;第一个“佳”字的位形图 db 23h,0eh,0,0 db 23h,0eh,-1,1 db 2ah,0eh,1,0 db 2ah,0eh,1,0 db 2ah,0eh,1,0 db 2ah,0eh,1,0 db 2ah,0eh,1,0 db 2ah,0eh,1,0 db 2ah,0eh,1,0 db 2ah,0eh,1,0 db 23h,0eh,-9,1
24、 db 23h,0eh,-1,1 db 3dh,0eh,6,1 db 3dh,0eh,4,0 db 3dh,0eh,-7,1 db 3dh,0eh,3,0 db 3dh,0eh,2,0 db 3dh,0eh,2,0 db 3dh,0eh,-7,1 db 3dh,0eh,3,0 db 3dh,0eh,2,0 db 3dh,0eh,2,0 db 24h,0ch,-10,1 db 24h,0ch,1,0 db 24h,0ch,1,0 db 24h,0ch,1,0 db 24h,0ch,1,0 db 24h,0ch,1,0 db 3dh,0eh,1,0 db 24h,0ch,1,0 db 3dh,0e
25、h,1,0 db 24h,0ch,1,0 db 3dh,0eh,1,0 db 3dh,0eh,-7,1 db 3dh,0eh,3,0 db 3dh,0eh,2,0 db 3dh,0eh,2,0 db 3dh,0eh,-7,1 db 3dh,0eh,3,0 db 3dh,0eh,2,0 db 3dh,0eh,2,0 db 3dh,0eh,-4,1 db 3dh,0eh,4,0jia1 db 43 ;第二个“佳”字的位形图 db 23h,0ah,0,0 db 23h,0ah,-1,1 db 2ah,0ah,1,0 db 2ah,0ah,1,0 db 2ah,0ah,1,0 db 2ah,0ah,1
26、,0 db 2ah,0ah,1,0 db 2ah,0ah,1,0 db 2ah,0ah,1,0 db 2ah,0ah,1,0 db 23h,0ah,-9,1 db 23h,0ah,-1,1 db 3dh,0ah,6,1 db 3dh,0ah,4,0 db 3dh,0ah,-7,1 db 3dh,0ah,3,0 db 3dh,0ah,2,0 db 3dh,0ah,2,0 db 3dh,0ah,-7,1 db 3dh,0ah,3,0 db 3dh,0ah,2,0 db 3dh,0ah,2,0 db 24h,07h,-10,1 db 24h,07h,1,0 db 24h,07h,1,0 db 24h
27、,07h,1,0 db 24h,07h,1,0 db 24h,07h,1,0 db 3dh,0ah,1,0 db 24h,07h,1,0 db 3dh,0ah,1,0 db 24h,07h,1,0 db 3dh,0ah,1,0 db 3dh,0ah,-7,1 db 3dh,0ah,3,0 db 3dh,0ah,2,0 db 3dh,0ah,2,0 db 3dh,0ah,-7,1 db 3dh,0ah,3,0 db 3dh,0ah,2,0 db 3dh,0ah,2,0 db 3dh,0ah,-4,1 db 3dh,0ah,4,0xiang db 57 ;第一个“翔”字的位形图 db 2ah,0c
28、h,0,0 db 23h,0ch,3,0 db 23h,0ch,2,0 db 23h,0ch,2,0 db 40h,0ch,3,0 db 2ah,0ch,-9,1 db 23h,0ch,2,0 db 23h,0ch,2,0 db 23h,0ch,2,0 db 40h,0ch,2,0 db 2ah,0ch,-7,1 db 23h,0ch,1,0 db 40h,0ch,1,0 db 23h,0ch,1,0 db 40h,0ch,1,0 db 23h,0ch,1,0 db 40h,0ch,1,0 db 2ah,0ch,-7,1 db 23h,0ch,2,0 db 23h,0ch,2,0 db 23h
29、,0ch,2,0 db 2ah,0ch,-7,1 db 23h,0ch,3,0 db 23h,0ch,2,0 db 23h,0ch,2,0 db 2ah,0ch,1,1 db 3dh,0ch,-5,1 db 2ah,0ch,2,0 db 2ah,0ch,2,0 db 3dh,0ch,-4,1 db 2ah,0ch,3,0 db 5ch,0ch,3,0 db 5ch,0ch,1,0 db 3dh,0ch,-7,1 db 7ch,0ch,1,0 db 7ch,0ch,1,0 db 7ch,0ch,1,0 db 7ch,0ch,1,0 db 7ch,0ch,1,0 db 7ch,0ch,1,0 db 7ch,0ch,1,0 db 2ah,0ch,-2,1 db 3dh,0ch,-5,1 db 2ah,0ch,2,0 db 2ah,0ch,2,0 db 3dh,0ch,-4,1 db 2ah,0ch,3,0 db 5ch,0ch,3,0 db 5ch,0ch,1,0 db 3dh,0ch,-7,1 db 7ch,0ch,1,0 db 7ch,0ch,1,0 db 7ch,0ch,1,0 db 7ch,0ch,1,0 db 7ch,0ch,1,0