微机原理课设指针式屏显电子钟.docx
《微机原理课设指针式屏显电子钟.docx》由会员分享,可在线阅读,更多相关《微机原理课设指针式屏显电子钟.docx(11页珍藏版)》请在冰豆网上搜索。
微机原理课设指针式屏显电子钟
微机原理及应用
课程设计
设计题目:
指针式的屏显电子钟
专业网络工程
班级网络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.《汇编语言实战精解》(李春生著)南开大学出版社。