微机原理课程设计显示图形变换.docx

上传人:b****3 文档编号:4312294 上传时间:2022-11-29 格式:DOCX 页数:29 大小:196.92KB
下载 相关 举报
微机原理课程设计显示图形变换.docx_第1页
第1页 / 共29页
微机原理课程设计显示图形变换.docx_第2页
第2页 / 共29页
微机原理课程设计显示图形变换.docx_第3页
第3页 / 共29页
微机原理课程设计显示图形变换.docx_第4页
第4页 / 共29页
微机原理课程设计显示图形变换.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

微机原理课程设计显示图形变换.docx

《微机原理课程设计显示图形变换.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计显示图形变换.docx(29页珍藏版)》请在冰豆网上搜索。

微机原理课程设计显示图形变换.docx

微机原理课程设计显示图形变换

显示图型变换程序

一.设计任务及要求

初始条件:

按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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1