霓虹灯模拟显示课程设计.docx
《霓虹灯模拟显示课程设计.docx》由会员分享,可在线阅读,更多相关《霓虹灯模拟显示课程设计.docx(21页珍藏版)》请在冰豆网上搜索。
霓虹灯模拟显示课程设计
霓虹灯模拟显示课程设计
1.设计任务及要求分析
本次课程设计要求用汇编语言设计“霓虹灯”模拟显示,需要实现的功能如下:
1、按下b/B键,分六笔快速画出矩形及其两条对角线;2、按下y/Y键,流水灯从左到右依次点亮,然后一次熄灭;3、按下q/Q键,退出程序。
分析本设计不需要硬件设备,在微机原理实验集成环境MF2KP中编写程序,调用DOS命令和BIOS命令,并用合适的字符代替霓虹灯来实现。
1方案论证
2.1方案一
我们可以采用编写延时子程序的方法来实现延时,这种方法的主要原理是运用计算机相应每一条的时间积累。
程序如下:
pushbx
pushcx
movcx,xx;输入正数
A1:
movbx,xx;输入正数
A2:
decbx
JnzA1
LoopA2
popcx
popbx
此方案的原理是运用循环指令来进行,主要通过设置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号功能调用(中断指令int21h)
功能:
从键盘输入1个字符
输入参数:
无
输出参数:
AL=ASCII码
(2)02H号功能调用(中断指令int21h)
功能:
在屏幕上显示1个字符(ASCII码)
输入参数:
DL=ASCII码
输出参数:
无。
(3)09H号功能调用(中断指令int21h)
功能:
多字符输出到屏幕显示
输入参数:
DS:
DX=输出字符缓冲区首地址
输出参数:
无
该功能对输出字符的个数没有要求,但输出字符串要以‘$’结束。
(4)4CH号功能调用(中断指令int21h)
功能:
返回操作系统4CH
调用:
MOVAH,4CH
3.3程序中用到的BIOS功能调用
1)功能01H调用(中断指令int16h)
功能描述:
检测键盘
输出参数:
ZF=1无码可读
ZF=0输入于AX中
2)功能02H调用(中断指令int10h)
功能描述:
用文本坐标下设置光标位置
入口参数:
AH=02H
BH=页号
DH=行坐标
DL=列坐标
出口参数:
无
3)功能06H调用(中断指令int10h)
功能描述:
初始化屏幕或滚屏
入口参数:
AH=06H向上滚屏,AH=07H向下滚屏
AL=滚动行数(0,清窗口)
BH=空白区域的缺省属性
(CH、CL)=窗口的左上角坐标(X、Y)
(DH、DL)=窗口的右下角坐标(X、Y)
出口参数:
无
4.程序设计流程图
程序流程图如下图所示,分为主程序流程图和子程序流程图。
主程序流程图如图4—1所示;置光标宏定义流程图如图4—2所示;延时子程序流程图如图4—3所示;字符显示流程图如图4—4所示。
图4—1主流程图图4—2置光标宏定义
图4—3延时子程序流程图图4—4显示字符程序段流程图
本次课程设计用到了二个不同大小的延时效果,故在延时程序中改变CX的赋值来改变延时长短。
清屏子程序流程图与置光标宏定义类似只需改变相应寄存器赋值和调用中断号即可。
显示图案时分部分显示连续的字符就能达到显示整个图案的效果。
5.主要程序分析
5.1设置光标的宏定义
程序如下:
MAmacroop1,op2
pushax;保存数据
pushbx
movah,02h
movbh,0
movdh,op1;光标纵坐标
movdl,op2;光标横坐标
int10h
popbx
popax
Endm
该宏定义主要是调用功能02H(中断指令“INT10H”)来确定光标的位置的。
该定义的主要功能首先是指定位置来完成字符‘@’或‘*’的显示与消失。
5.2时间延迟程序
程序如下:
waiting_1procnear
pushcx
pushdx
movdx,0ffh
dll:
movcx,65500
dl2:
loopdl2
decdx
jnzdll
popdx
popcx
ret
waiting_1endp
waiting_2procnear
pushcx
pushdx
movdx,0fffh
d2l:
movcx,65500
d22:
loopdl2
decdx
jnzdll
popdx
popcx
ret
waiting_2endp
本题目中需要两种不同的延迟,通过改变dx的值来大致控制时间的长短。
6.程序调试显示
6.1矩形及其对角线的显示
程序运行之初,首先在屏幕上出现提示字符“pleaseinputbtobegin”如图6—1所示,按下b/B键,屏幕上以较快速度分六笔画出矩形及其对角线,并由提示符“pleaseinputytochose”如图6—2所示。
图6—1初始提示字符
图6—2矩形及其对角线的显示
6.2流水灯的运行
根据提示符,按下Y/y键,屏幕和字符的颜色会变化,用*号代替灯来流水灯的效果,如图6—3所示,然后依次熄灭,并出现提示符“pleaseqtoquit”
如图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
附录
程序清单如下所示:
MAmacroop1,op2
pushax;保存数据
pushbx
movah,02h
movbh,0
movdh,op1;光标纵坐标
movdl,op2;光标横坐标
int10h
popbx
popax
endm
datasegment
info_1db'pleaseinputbtobegan',0dh,0ah,'$'
info_2db'pleaseinputytochooseanotherway',0dh,0ah,'$'
info_3db'pleaseqtoquit',0dh,0ah,'$'
hang_1db8,8,8,8,8,8,8,8,8,8
db8,9,10,11,12,13,14,15,16,17
db17,17,17,17,17,17,17,17,17,17
db17,16,15,14,13,12,11,10,9,8,7
hang_2db8,9,10,11,12,13,14,15,16,17
db8,9,10,11,12,13,14,15,16,17
hang_3db14,14,14,14,14,14,14
lie_1db35,36,37,38,39,40,41,42,43,44
db44,44,44,44,44,44,44,44,44,44,
db44,43,42,41,40,39,38,37,36,35
db35,35,35,35,35,35,35,35,35,35
lie_2db35,36,37,38,39,40,41,42,43,44
db44,43,42,41,40,39,38,37,36,35
lie_3db30,32,34,36,38,40,42
countdb8
clourdb0f7h
dataends
codesegment
assumeds:
data,cs:
code
;**********清屏子程序*********
clear_screenprocnear
pushax
pushbx
pushcx
pushdx
movah,6
moval,0
movch,0
movcl,0
movdh,24
movdl,79
movbh,7
int10h
popdx
popcx
popbx
popax
ret
clear_screenendp
;**********延迟子程序********
waiting_1procnear
pushcx
pushdx
movdx,0ffh
dll:
movcx,65500
dl2:
loopdl2
decdx
jnzdll
popdx
popcx
ret
waiting_1endp
waiting_2procnear
pushcx
pushdx
movdx,0fffh
d2l:
movcx,65500
d22:
loopdl2
decdx
jnzdll
popdx
popcx
ret
waiting_2endp
start:
movax,data
movds,ax
xorax,ax
xorbx,bx
xorcx,cx
xordx,dx
movah,02h;置光标位子
movbh,0;BH=页数
movdh,0;DH\DL=行列数
movdl,0
int10h
info:
leadx,info_1;提示字符输出
movah,9
int21h
movah,01h
int21h
cmpal,'b';输入字符检查是否为g/G
jexianshi_1;是则跳转到xianshi_1
cmpal,'B';否则跳回info重新检查
jexianshi_1
jmpinfo
;**********方式一显示程序********
xianshi_1:
movah,06h;屏幕初始化
movbh,29H;卷入行属性
movcx,0;左上角行列坐标(0,0)
movdx,1850h;右下角行列坐标(80,80)
int10h
leasi,hang_1;取hang_1,lie_1字符串的首地址
leadi,lie_1
movcx,40;cx赋值确定循环次数
loop_1:
MA[si],[di];调用宏定义移动光标
movdl,'@'
movah,02;在光标处显示输出‘*’
int21h
incsi;指针自加
incdi
MA0,0;移动光标
callwaiting_1;延时
looploop_1;循环loop_1
xianshi_2:
;显示图案第二部分
leasi,hang_2
leadi,lie_2
movcx,20
loop_2:
MA[si],[di]
movdl,'@'
movah,02
int21h
incsi
incdi
MA0,0
callwaiting_1
looploop_2
leadx,info_2;方式选择提示
movah,9
int21h
movah,01h
int21h
cmpal,'y';检查输入字符是否为y/Y
jeliushui;是,则跳转到liushui
cmpal,'Y';否,则跳转到xianshi_1
jeliushui
callclear_screen;调用清屏程序
jmpxianshi_1
;**********流水灯子程序*******
liushui:
callclear_screen;清屏
xorax,ax
xorbx,bx
xorcx,cx
xordx,dx
movah,06h;屏幕初始化
movbh,4ah;卷入行属性
movcx,0;左上角行列坐标(0,0)
movdx,1850h;右下角行列坐标(80,80)
int10h
MA0,0;提示语显示
leadx,info_3
movah,9
int21h
callwaiting_1
xianshi_3:
;快速形成图案
leasi,hang_3
leadi,lie_3
movcx,7
loop_3:
MA[si],[di]
movdl,'*'
movah,02
int21h
incsi
incdi
MA0,0
callwaiting_2;延时减小
looploop_3
xianshi_4:
;快速形成图案
leasi,hang_3
leadi,lie_3
movcx,7
loop_4:
MA[si],[di]
movdl,''
movah,02
int21h
incsi
incdi
MA0,0
callwaiting_2;延时减小
looploop_4
;****检测是否按下Q键********
movah,01h
int21h
cmpal,'Q'
jeQUIT
cmpal,'q'
jeQUIT
jmpliushui
;*******中止程序********
QUIT:
movah,4ch
int21h
codeends
endstart