微机原理课设指针式屏显电子钟.docx

上传人:b****6 文档编号:6044426 上传时间:2023-01-03 格式:DOCX 页数:11 大小:74.04KB
下载 相关 举报
微机原理课设指针式屏显电子钟.docx_第1页
第1页 / 共11页
微机原理课设指针式屏显电子钟.docx_第2页
第2页 / 共11页
微机原理课设指针式屏显电子钟.docx_第3页
第3页 / 共11页
微机原理课设指针式屏显电子钟.docx_第4页
第4页 / 共11页
微机原理课设指针式屏显电子钟.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

微机原理课设指针式屏显电子钟.docx

《微机原理课设指针式屏显电子钟.docx》由会员分享,可在线阅读,更多相关《微机原理课设指针式屏显电子钟.docx(11页珍藏版)》请在冰豆网上搜索。

微机原理课设指针式屏显电子钟.docx

微机原理课设指针式屏显电子钟

微机原理及应用

课程设计

设计题目:

指针式的屏显电子钟

 

专业网络工程

班级网络081

学生刘妙曲

指导教师王理

 

2011年2学期

 

一、实验目的…………………………………………..3

二、实验内容及要求……………………………………3

三、课设基本思想………………………………………3

四、程序流程图…………………………………………4

五、实验结果…………………..……………………….6

六、程序源代码…………………………………………6

七、课设心得体会………………………………………14

八、参考文献……………………………………………14

 

一、实验目的

1)学习系统驻留的方法。

2)了解BIOS中时间参数的调用方法。

3)了解屏幕画图的方法

对于本次应用的科目微机原理与接口技术来说,因为需要应用Win32汇编语言技术来编写代码实现功能,所以要掌握这门语言。

并且要用到WindowsAPI接口的许多函数,所以要掌握一部分函数的调用方法及实现的功能。

检验和提高汇编语言程序设计能力,和微机原理与接口技术应用方面的分析问题与解决问题的能力,掌握32位汇编语言,完成软件的设计要求、编码和测试等。

二、实验内容及要求

1)在屏幕上显示一个适当大小的椭圆形界面,椭圆形轨道上,均匀的分布着60个“点”,代表1秒~60秒的位置,凡是5倍数的“点”,应当比其他的“点”稍大。

2)以椭圆的中心为轴,画一条线代表“秒针”,采用定时中断的方式,每过一秒钟,秒钟移动一个位置,同时系统发出“嘀——嗒”的声音,如果相应的“点”能改变颜色,则动感更强。

3)定时源可以使用系统的定时源。

4)按下“Esc”键之后,结束演示。

三.课设基本思想

1)屏幕应设置为图形方式,采用模块化编程模式,主模块显示椭圆形表盘,并且处理时钟中断,每过一秒钟,转入一次子模块,子模块负责秒针移动的位置。

2)在着手本课题设计之前,学习掌握真设计方法,掌握顺时针方向画圆的技术,灵活运用,就可以设计出秒针的移动程序。

3)系统驻留的方法及BIOS中时间参数的调用方法见统驻留时间程序。

屏幕设置为图形方式,采用模块化编程,主模块显示界面信息,每个子模块负责一个功能,然后通过模块调用来实现。

圆及画线子模块显示圆形表盘,及时、分、秒针,然后调用秒针移动子模块式电子钟能够运行。

动子模块中,首先通过cos和sin两个功能模块来确定秒针移动的度数,其次分别对秒、分、时进行擦除重写操作,再分别对表盘及圆心进行刷新,这样就实现了时、分、秒针的动态变化。

四.程序流程图

 

五、实验结果

六、程序源代码

包含的库文件及数据段的定义如下:

.386

.modelflat,stdcall

optioncasemap:

none

includewindows.inc;Include文件定义

includeuser32.inc

includelibuser32.lib

includekernel32.inc

includelibkernel32.lib

includeGdi32.inc

includelibGdi32.lib

.data?

hInstancedd?

hWinMaindd?

dwCenterXdd?

;圆心X

dwCenterYdd?

;圆心Y

dwRadiusdd?

;半径

ICO_MAINequ1000h;Equ等值定义

ID_TIMERequ1

.const

szClassNamedb'指针式屏显电子钟',0

(2)计算时钟的位置、大小的_CalcClockParam子程序:

_CalcClockParamproc

local@stRect:

RECT

invokeGetClientRect,hWinMain,addr@stRect

moveax,@stRect.right

subeax,@stRect.left;eax=宽度

movecx,@stRect.bottom

subecx,@stRect.top;ecx=高度

.ifecx>eax;比较客户区宽度和高度,以小的值作为时钟的直径

movedx,eax;高度>宽度

subecx,eax

shrecx,1

movdwCenterX,0

movdwCenterY,ecx

.else

movedx,ecx

subeax,ecx

shreax,1

movdwCenterX,eax

movdwCenterY,0

.endif

shredx,1

movdwRadius,edx

adddwCenterX,edx

adddwCenterY,edx

ret

_CalcClockParamendp

(3)计算时钟圆周上某个角度对应的X坐标,X=圆心X+Sin(角度)*半径的子程序_CalcX:

_dwPara180dw180

_CalcXproc_dwDegree,_dwRadius;输入参数是角度_dwDegree和半径_dwRadius

local@dwReturn

filddwCenterX

fild_dwDegree

fldpi

fmul;角度*Pi

fild_dwPara180

fdivpst

(1),st;角度*Pi/180

fsin;Sin(角度*Pi/180)

fild_dwRadius

fmul;半径*Sin(角度*Pi/180)

fadd;X+半径*Sin(角度*Pi/180)

fistp@dwReturn

moveax,@dwReturn

ret

_CalcXendp

计算时钟圆周上某个角度对应的Y坐标,类似于上面计算X坐标,Y=圆心Y-Cos(角度)*半径

(4)按照_dwDegreeInc的步进角度,画_dwRadius为半径的小圆点(刻度)程序:

_DrawDotproc_hDC,_dwDegreeInc,_dwRadius

local@dwNowDegree,@dwR

local@dwX,@dwY

mov@dwNowDegree,0

moveax,dwRadius

subeax,10

mov@dwR,eax

.while@dwNowDegree<=360

finit

invoke_CalcX,@dwNowDegree,@dwR;计算小圆点的圆心坐标

mov@dwX,eax

invoke_CalcY,@dwNowDegree,@dwR

mov@dwY,eax

moveax,@dwX;画点

movebx,eax

movecx,@dwY

movedx,ecx

subeax,_dwRadius

addebx,_dwRadius

subecx,_dwRadius

addedx,_dwRadius

invokeEllipse,_hDC,eax,ecx,ebx,edx

moveax,_dwDegreeInc

add@dwNowDegree,eax

.endw

ret

_DrawDotendp

(5)画_dwDegree角度的线条,半径=时钟半径-参数_dwRadiusAdjust(指针)子程序:

_DrawLineproc_hDC,_dwDegree,_dwRadiusAdjust

local@dwR

local@dwX1,@dwY1,@dwX2,@dwY2

moveax,dwRadius

subeax,_dwRadiusAdjust

mov@dwR,eax

invoke_CalcX,_dwDegree,@dwR;计算线条两端的坐标

mov@dwX1,eax

invoke_CalcY,_dwDegree,@dwR

mov@dwY1,eax

add_dwDegree,180

invoke_CalcX,_dwDegree,10

mov@dwX2,eax

invoke_CalcY,_dwDegree,10

mov@dwY2,eax

invokeMoveToEx,_hDC,@dwX1,@dwY1,NULL

invokeLineTo,_hDC,@dwX2,@dwY2

ret

_DrawLineendp

 

(6)调用API函数显示系统当前时间及画电子钟的指针程序:

_ShowTimeproc_hWnd,_hDC

local@stTime:

SYSTEMTIME

pushad

invokeGetLocalTime,addr@stTime

invoke_CalcClockParam

invokeGetStockObject,BLACK_BRUSH;画时钟圆周上的点

invokeSelectObject,_hDC,eax

invoke_DrawDot,_hDC,360/12,3;画12个大圆点

invoke_DrawDot,_hDC,360/60,1;画60个小圆点

invokeCreatePen,PS_SOLID,1,0;画时钟指针

invokeSelectObject,_hDC,eax

invokeDeleteObject,eax

movzxeax,@stTime.wSecond

movecx,360/60

mulecx;秒针度数=秒*360/60

invoke_DrawLine,_hDC,eax,15

;时针、分针的画法类似于秒针,只是设置的显示宽度不同

invokeCreatePen,PS_SOLID,3,0

invokeSelectObject,_hDC,eax

invokeDeleteObject,eax

movzxeax,@stTime.wHour

.ifeax>=12

subeax,12

.endif

movecx,360/12

mulecx

movzxecx,@stTime.wMinute

shrecx,1

addeax,ecx

invoke_DrawLine,_hDC,eax,30

invokeGetStockObject,NULL_PEN

invokeSelectObject,_hDC,eax

invokeDeleteObject,eax

popad

ret

_ShowTimeendp

(7)显示圆形表盘窗口的初始化过程:

_ProcWinMainprocusesebxediesihWnd,uMsg,wParam,lParam

local@stPS:

PAINTSTRUCT

moveax,uMsg

.ifeax==WM_TIMER

invokeInvalidateRect,hWnd,NULL,TRUE

invokeMessageBeep,-1

.elseifeax==WM_PAINT

invokeBeginPaint,hWnd,addr@stPS

invoke_ShowTime,hWnd,eax

invokeEndPaint,hWnd,addr@stPS

.elseifeax==WM_CREATE

invokeSetTimer,hWnd,ID_TIMER,1000,NULL

.elseifeax==WM_CLOSE||((eax==WM_KEYDOWN||eax==WM_KEYUP)&&wParam==VK_ESCAPE)

invokeKillTimer,hWnd,ID_TIMER

invokeDestroyWindow,hWinMain

invokePostQuitMessage,NULL

.else

invokeDefWindowProc,hWnd,uMsg,wParam,lParam

ret

.endif

xoreax,eax

ret

_ProcWinMainendp

(8)程序的主体显示过程:

_WinMainproc

local@stWndClass:

WNDCLASSEX

local@stMsg:

MSG

invokeGetModuleHandle,NULL

movhInstance,eax

invokeRtlZeroMemory,addr@stWndClass,sizeof@stWndClass;注册窗口类

invokeLoadIcon,hInstance,ICO_MAIN

mov@stWndClass.hIcon,eax

mov@stWndClass.hIconSm,eax

invokeLoadCursor,0,IDC_ARROW

mov@stWndClass.hCursor,eax

pushhInstance

pop@stWndClass.hInstance

mov@stWndClass.cbSize,sizeofWNDCLASSEX

mov@stWndClass.style,CS_HREDRAWorCS_VREDRAW

mov@stWndClass.lpfnWndProc,offset_ProcWinMain

mov@stWndClass.hbrBackground,COLOR_WINDOW+1

mov@stWndClass.lpszClassName,offsetszClassName

invokeRegisterClassEx,addr@stWndClass;建立并显示窗口

invokeCreateWindowEx,WS_EX_CLIENTEDGE,\

offsetszClassName,offsetszClassName,\

WS_OVERLAPPEDWINDOW,\

100,100,250,270,\

NULL,NULL,hInstance,NULL

movhWinMain,eax

invokeShowWindow,hWinMain,SW_SHOWNORMAL

invokeUpdateWindow,hWinMain

.whileTRUE

invokeGetMessage,addr@stMsg,NULL,0,0

.break.ifeax==0

invokeTranslateMessage,addr@stMsg

invokeDispatchMessage,addr@stMsg

.endw

ret

_WinMainendp

 

七、课设心得体会

在这一周的课设里,完成课设题目的过程很是艰辛。

在此之前,根本就不清楚用汇编居然也可以编出来像MFC那样的东西。

在屏幕上显示出来。

所以题目一出来就有点蒙了,不知道该从何着手。

然后就按照题目在网上搜索相关的实现步骤及思想。

这才发现自己懂得的东西真是少的可怜,竟然连这个都不了解的。

办法只有深入学习汇编语言,学习Win32程序,及相关函数。

在平时上课的时候只能说是对汇编语言有了一定的了解,只懂了一点皮毛,所掌握的东西对这次实验来说可谓是杯水车薪,所以就需要自己去深入地研究,查资料。

通过几天的设计,我在掌握了它的DOS和BIOS各个功能调用的同时,也学到了自己以前从没想过的东西,比如画点、画线、更延伸的画圆、颜色的设定、以及表的发声装置和音乐报时功能(只是这部分东西没有加在设计了)等的知识。

学习的过程痛苦,几乎是从零开始的。

在参照网上别人代码的同时,加入自己的修改,最后总算是完成了任务。

学到了很多的知识,在任务的压迫下,促使我们深入考虑一些问题,更加开拓了我的视野,真是收益非浅。

八、参考文献

1.16/32位微机原理、汇编语言及接口技术(第二版)   机械工业出版社   钱晓捷、陈涛等。

2.《汇编语言程序设计教程》(周艳萍邹伟著)清华大学出版社。

3.《汇编语言实战精解》(李春生著)南开大学出版社。

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

当前位置:首页 > 高中教育 > 小学教育

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

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