微机原理课程设计显示图形变换.docx
- 文档编号:4312294
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:29
- 大小:196.92KB
微机原理课程设计显示图形变换.docx
《微机原理课程设计显示图形变换.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计显示图形变换.docx(29页珍藏版)》请在冰豆网上搜索。
微机原理课程设计显示图形变换
显示图型变换程序
一.设计任务及要求
初始条件:
按S用四种颜色各显示一个矩形的程序,按T用三种颜色各显示一个三角形的程序,按C用一种颜色显示一个圆。
按Q退出程序。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
(1)设计任务及要求分析
(2)方案比较及认证说明
(3)系统原理阐述
(4)硬件设计课题需要说明:
硬件原理,电路图,所采用器件的功能说明
(5)软件设计课题需要说明:
软件思想,流程图,源程序及程序注释
(6)调试记录及结果分析
(7)总结
(8)参考资料
(9)附录:
芯片资料或程序清单,软件演示屏幕拷贝图或硬件实物图
二.原理分析
本课程设计大体可分为三个子程序,即显示矩形,显示三角形和显示圆的程序。
设计之前要查询资料,熟悉DOS调用和BIOS调用,以便在DOS界面上能输出图形和颜色,BIOS调用功能如表1所示。
表1常用的BIOS中断类型
中断号
功能
中断号
功能
0H
除法出错
0EH
软盘中断
1H
单步中断
0FH
并行打印机中断
2H
不可屏蔽中断
10H
显示中断
3H
断点中断
11H
取设备信息
4H
溢出中断
12H
取内存容量
5H
打印屏幕中断
13H
磁盘
8H
8254系统定时中断
14H
异步通信
9H
键盘中断
15H
磁带
0AH
彩色图形接口中断
16H
键盘
0BH
异步通信串行口1中断
17H
打印机
0CH
异步通信串行口0中断
18H
驻留BIOS
0DH
硬盘中断
19H
引导装入程序
不仅如此,在了解了常用BIOS中断类型后,还必须学习如何用BIOS功能调用编写显示程序。
INT10H提供了两种图形方式下读写像素的功能:
AH=0CH,写像素。
输入参数:
DX=像素行。
CX=像素列。
BX=显示页号。
AL=像素颜色值。
返回结果:
无。
AH=ODH,读像素。
输入参数:
DX=像素行。
CX=像素列。
返回结果:
AL=像素颜色值。
使用读写像素功能时注意,像素的行列坐标的值应取决于当前显示模式。
三.设计方案
1.方案一
(1).设计分析
程序主流程图如图1所示:
图1程序主流程图
显示变色矩形程序流程图如图2所示:
图2变色矩形流程图
显示变色三角形程序流程图如图3所示:
图3变色三角形流程图
画圆程序流程图如图4所示:
图4画圆流程图
画圆程序是最难的一个,只能用离散的点来组成。
算法如下:
电脑屏幕是由X、Y坐标组成的二维平面,在屏幕中央位置取一点为圆心,这就是坐标轴的交点(O点),取半径适中,然后交X轴于A、C两点,如图5所示。
DE直线垂直于X轴,则有|AB|*|BC|=|BD|*|BE|。
编程序时,取A点为起点,逐步沿X轴正向移动,每次移动一个像素点,计算A点的位置坐标,然后让D、E点的纵坐标从零递增,直到刚符合上述等式,即取纵坐标的平方值大于等式左边的第一个值,所以要用两个循环嵌套才能实现此功能。
第一次运行后的结果截屏如图6所示。
图5算法实现原理图
图6第一次运行结果
由此产生一个严重的问题,就是D、E点取点时的第一个、第二个点离起点太远,最后两个点离终点太远。
所以必须做修改。
修改算法如下:
在第一段程序的基础上,再画一个圆,第二个圆与第一个圆唯一的不同之处就是起点不同,改为F点,依据同样的算法,沿Y移动,相应变换的就是另外两个点,当程序运行结束后,其实画的是两个圆,重叠后就是一个完整的圆。
最终运行结果如图9所示。
最后的程序代码在附录中。
(2).运行结果
变色三角形程序演示结果如图7所示
图7变色三角形演示结果
变色矩形演示结果如图8所示
图8变色矩形演示结果
画圆演示结果如图9所示
图9画圆演示结果
命令输入窗口如图10所示
图10命令输入窗口
2.方案二
方案二与方案一的不同在于画圆的程序,其程序如附录中所示。
方案一算法简单而创新,实现简洁而明了,且修改方便;而方案二中程序冗长,且需调用许多子程序,算法复杂,不易修改。
所以相比较而言,方案一具有明显优势,最终选择方案一。
四.心得体会
此次课程设计可以说是受益匪浅,通过查阅了很多资料,了解了许多汇编程序的思想,扩展了自己的视野,不再仅仅局限于书本中几条简短的程序,而且更重要的是明白写程序的态度:
仔细谨慎,精益求精。
在编写此程序时,最头疼的是编写画圆程序,因为汇编语言没有开方算法,所以只能用点来组成圆,秉着学术至上的态度,我尽量使组成圆的点连续,这可是一个浩大的工程:
先是在网上下载了一个高手编的画圆程序,但程序很长,而且比较深,迫使我和组员共商简便方法,功夫不负有心人,经过漫长的摸索与不懈的努力,我们得出了新算法,并编写出了更加简便的程序,经过一次次的调试,最终修成正果。
在此过程中,我不仅学到了书本中不具备的汇编语言的知识,更懂得了如何高效的与人合作,融入到团队之中,真的受益匪浅!
而且在设计中,把死板的课本知识变得生动有趣,激发了学习的积极性,把学过的计算机编译原理的知识强化,能够把课堂上学到的知识通过自己设计的程序表示出来,加深了对理论知识的理解。
以前对于计算机操作系统的认识是模糊的,概念上的,现在通过自己亲自动手做实验,从实践上认识了操作系统是如何处理命令的,如何协调计算机内部各个部件的运行,对计算机编译原理的认识更加深刻。
课程设计中程序比较复杂,在调试时应该仔细,耐心,循序渐进,不要急于求成。
这样才能提高效率,保质保量地完成课程设计。
通过此次的微机原理课程设计,加深了我对课本知识的理解,使原本看似深奥的知识一下子变得简单而实用,提高了我发现问题,解决问题的能力,提高了我的动手能力与团队合作意识,收获颇丰!
参考文献
[1]《微机原理与接口技术》(基于16位机),2005.周佩玲等,电子工业出版社.
[2]《微型计算机原理与接口技术》,2004.姚燕南,高等教育出版社.
[3]《计算机硬件技术及应用基础.下册:
接口与应用》,2001.邹逢兴,国防科技大学出版社.
[4]《微型计算机接口技术及应用》,2000.刘乐善,华中科技大学出版社.
[5]《IBMPC汇编语言程序设计》,2001.沈美明、温冬婵,清华大学出版社.
附录
1.方案一程序:
datasegment
info1db0dh,0ah,'pleasechoosetheletters,t,c:
'
db0dh,0ah,'inputqtoquit','$'
info2db0dh,0ah,'chooseerror!
','$'
info3db0dh,0ah,'pressanykeytocontinue','qtoquit''$'
d3dw0
r=50;圆的半径
x=300
y=240;圆心坐标
numdw0;数据暂存
yydw?
;数据暂存
dataends
stacksegmentstack
db200dup(0)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
mainprocfar
movax,data
movds,ax
movah,0
moval,4
int10h
input:
leadx,info1
movah,9
int21h
movah,08
int21h
cmpal,'t'
jzsa
cmpal,'s'
jzzhen
cmpal,'c'
jzyua
cmpal,'q'
jzexit
movdx,offsetinfo2
movah,09
int21h
jmpinput
sa:
callsan
callcontinuse
jmpinput
zhen:
callzheng
callcontinuse
jmpinput
yua:
callyuan
callcontinuse
jmpinput
exit:
movah,4ch
int21h
ret
mainendp
sanprocnear
pushax
pushbx
pushcx
pushdx
movah,0
moval,12h
int10h
moval,1
a0:
movdx,1
movd3,1
movcx,320
a1:
pushcx
pushd3
a2:
movah,12
pushax
int10h
popax
inccx
subd3,1
jnza2
popd3
addd3,2
popcx
incdx
deccx
cmpcx,20
jnea1
incal
cmpal,4
jnea0
popdx
popcx
popbx
popax
ret
sanendp
zhengprocnear
pushax
pushbx
pushcx
pushdx
movah,0fh
int10h
movah,0
moval,3
int10h
movcx,1;字符数量
movah,2
movdh,5;5行开始
movdl,25;25列开始
int10h
calldly_qrtr;调用延时子程序
;*****光标向下动********
line:
movah,2
int10h
moval,1
movah,9
movbl,0e0h;字符黄色
int10h
incdh;行增加
cmpdh,20;20行
jneline
jmpline1
;****光标向右动*****
line1:
movah,2
int10h
moval,1
movah,9
movbl,0e0h;字符为黄色
int10h
incdl;列增加
cmpdl,55;55列
jneline1
jmpline2
;*****光标向上动*********
line2:
movah,2
int10h
moval,1
movah,9
movbl,0e0h;字符为黄色
int10h
decdh
cmpdh,5
jneline2
jmpline3
;***光标向左动***
line3:
movah,2
int10h
moval,1
movah,9
movbl,0e0h;字符为黄色
int10h
decdl
cmpdl,25
jneline3
l00:
movah,7
moval,14
movbh,20h;绿色
movch,6
movcl,26
movdh,19
movdl,54
int10h
calldly_qrtr;调用延时子程序
l1:
movah,6
moval,14
movbh,0f0h;白色
movch,6
movcl,26
movdh,19
movdl,54
int10h
calldly_qrtr;调用延时子程序
l3:
movah,7
moval,14
movbh,40h;红色
movch,6
movcl,26
movdh,19
movdl,54
int10h
calldly_qrtr;调用延时子程序
l005:
movah,7
moval,14
movbh,30h;青
movch,6
movcl,26
movdh,19
movdl,54
int10h
calldly_qrtr;调用延时子程序
popdx
popcx
popbx
popax
ret
zhengendp
yuanprocnear
pushax
pushbx
pushcx
pushdx
movbx,505fh
movax,4f02h
int10h;显示模式
movax,data
movds,ax
movsi,0
movcx,x-r;行
movdx,y;竖●起点坐标
moval,02
movah,0ch
int10h
movax,0
movdx,0
loop1:
incax;
inccx;x坐标增一
pushax;保护ax
movbx,100;2r
subbx,ax;2r-ax
mulbx;(2r-ax)*ax
movbx,ax;由bx保存
push0
movnum,0
loop2:
popax
incax;ax++
pushax
incnum;num++
mulax;ax*ax
cmpax,bx;比较大小
jbloop2;小于跳转
popax
pushnum
adddx,y
adddx,num
moval,02
movah,0ch
int10h
popnum
subdx,num
subdx,num
moval,02
movah,0ch
int10h
cmpcx,350
jbp
jmpnext
p:
popax
jmploop1
next:
movdx,y-r;列
movcx,x;竖●起点坐标
moval,02
movah,0ch
int10h
movax,0
loop11:
incax;
incdx;y坐标增一
movyy,dx
pushax;保护ax
movbx,100;2r
subbx,ax;2r-ax
mulbx;(2r-ax)*ax
movbx,ax;由bx保存
push0
movnum,0
loop21:
popax
incax;ax++
pushax
incnum;num++
mulax;ax*ax
cmpax,bx;比较大小
jbloop21;小于跳转
popax
pushnum
movcx,0
addcx,x
addcx,num
movdx,yy
moval,02
movah,0ch
int10h
popnum
subcx,num
subcx,num
moval,02
movah,0ch
int10h
cmpdx,290
jbq
callcontinuse
popdx
popcx
popbx
popax
ret
jmp$
;movah,4ch
;int21h
q:
popax
jmploop11
yuanendp
continuseprocnear
leadx,info3
movah,9
int21h
movah,08
int21h
cmpal,'q'
jeexit1
ret
exit1:
movah,4ch
int21h
continuseendp
dly_qrtrprocnear;延时子程序
pushcx
pushdx
movdx,50000
d11:
movcx,8000
d12:
loopd12
decdx
jnzd11
popdx
popcx
ret
dly_qrtrendp
codeends
endmain
2.方案二画圆程序
datassegment
colordw02
bkcolordw15
xdw280,
ydw240,
radiusdw150
datasends
stackssegment
dw100dup(0)
stacksends
codessegment
assumecs:
codes,ds:
datas,ss:
stacks
start:
movax,datas
movds,ax
movax,0a000h
moves,ax
movax,0012h
int10h;设置640*480*16图形模式
moval,2
callset_write_mode;将写模式设为写模式2
again:
movax,bkcolor
callclear;将背景清成白色
movax,wordptr[x]
pushax
movax,wordptr[y]
pushax
movax,wordptr[radius]
pushax
callcircle
movah,0
int16h
cmpal,0dh;回车退出
jzexit
cmpah,2eh;key'corc'
jnzskip
inccolor
skip:
jmpagain
quit:
movah,4ch
int21h
exit:
movax,4c00h
int21h
;******************************************
;640*480*16模式下的画点函数
;******************************************
pixelproc
pushbp
pushbx
pushcx
pushds
movbp,sp
movax,80
movbx,wordptr[bp+12];bx<=y
mulbx;(dx:
ax)<=80*y
movbx,ax;
movax,wordptr[bp+14];ax<--x
movcl,8;||
divcl;al<=商(x/8),ah<=余数(x%8)sp->||
movcl,ah;cl<=ah|ds|<-bp
movah,0;|cx|<-bp+2
addbx,ax;bx(offset)<=80*y+x/8|bx|<-bp+4
moval,80h;|bp|<-bp+6
shral,cl;al(mask)<=(80h>>cl)|返回地址|<-bp+8
pushax;|color|<-bp+10
movdx,3ceh;|y|<-bp+12
moval,8;|x|<-bp+14
outdx,al;||
movdx,3cfh;pixel堆栈结构
popax
outdx,al
moval,es:
[bx]
movax,wordptr[bp+10];ax<=color
movbyteptres:
[bx],al
popds
popcx
popbx
popbp
ret6
pixelendp
;********************************
;清屏函数
;********************************
clearprocnear
movbx,0
clr1:
moves:
[bx],al
incbx
cmpbx,9600h;80*480
jnbclr2
jmpclr1
clr2:
ret
clearendp
;***************************************
;bresenham算法实现的画圆函数
;***************************************
circleprocnear
pushbp
movbp,sp
subsp,6
movwordptr[bp-2],0;x<=0||
movax,wordptr[bp+4];||
movwordptr[bp-4],ax;y<=rsp->||
movax,0fffeh;|p|<-bp-6
imulwordptr[bp+4];ax<=radius*(-2)|y|<-bp-4
addax,3;ax<=3-2*radius|x|<-bp-2
movwordptr[bp-6],ax;p=3-2*radius|bp|<-bp
c0:
movax,wordptr[bp-2];ax<=x|返回地址|<-bp+2
cmpax,wordptr[bp-4];ifx jlc00;|yc|<-bp+6 jmpc3;|xc|<-bp+8 c00: pushwordptr[bp+8];circle堆栈结构 pushwordptr[bp+6]; pushwordptr[bp-2] pushwordptr[bp-4] callcircle_point cmpwordptr[bp-6],0 jgec1 movax,4 mulwordptr[bp-2] addax,6 addax,wordptr[bp-6] movwordptr[bp-6],ax jmpc2 c1: movax,wordptr[bp-2] subax,wordptr[bp-4] movbx,4 imulbx addax,10 addax,wordptr[bp-6] movwordptr[bp-6],ax decwordptr[bp-4] c2: incwordptr[bp-2] jmpc0 c3: movax,wordptr[bp-2] cmpax,wordptr[bp-4] jnec4 pushwordptr[bp+8] pushwordptr[bp+6] pushwordptr[bp-2] pushwordptr[bp-4] callcircle_point c4: movsp,bp popbp ret6 circleendp circle_pointprocnear pushbp movbp,sp subsp,16 movax,wordptr[bp+10]; addax,wordptr[bp+6]; movwordptr[bp-2],ax;xc+x movax,wordptr[bp+10]; sub
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 课程设计 显示 图形 变换