您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 微机原理课设_指针式屏显电子钟
湖南文理学院芙蓉学院微机原理课程设计报告题目指针式的屏显电子钟学生姓名唐杰学号10170106专业班级计算机科学技术1101班指导老师杨红杰设计时间2014.6.15评阅意见:评定成绩:指导老师签名:年月日2目录一、实验目的…………………………………………..3二、实验内容及要求……………………………………3三、课设基本思想………………………………………3四、程序流程图…………………………………………4五、实验结果…………………..……………………….6六、程序源代码…………………………………………6七、课设心得体会………………………………………14八、参考文献……………………………………………143一、实验目的1)学习系统驻留的方法。2)了解BIOS中时间参数的调用方法。3)了解屏幕画图的方法对于本次应用的科目微机原理与接口技术来说,因为需要应用Win32汇编语言技术来编写代码实现功能,所以要掌握这门语言。并且要用到WindowsAPI接口的许多函数,所以要掌握一部分函数的调用方法及实现的功能。检验和提高汇编语言程序设计能力,和微机原理与接口技术应用方面的分析问题与解决问题的能力,掌握32位汇编语言,完成软件的设计要求、编码和测试等。二、实验内容及要求1)在屏幕上显示一个适当大小的椭圆形界面,椭圆形轨道上,均匀的分布着60个“点”,代表1秒~60秒的位置,凡是5倍数的“点”,应当比其他的“点”稍大。2)以椭圆的中心为轴,画一条线代表“秒针”,采用定时中断的方式,每过一秒钟,秒钟移动一个位置,同时系统发出“嘀——嗒”的声音,如果相应的“点”能改变颜色,则动感更强。3)定时源可以使用系统的定时源。4)按下“Esc”键之后,结束演示。三.课设基本思想1)屏幕应设置为图形方式,采用模块化编程模式,主模块显示椭圆形表盘,并且处理时钟中断,每过一秒钟,转入一次子模块,子模块负责秒针移动的位置。2)在着手本课题设计之前,学习掌握真设计方法,掌握顺时针方向画圆的技术,灵活运用,就可以设计出秒针的移动程序。3)系统驻留的方法及BIOS中时间参数的调用方法见统驻留时间程序。屏幕设置为图形方式,采用模块化编程,主模块显示界面信息,每个子模块负责一个功能,然后通过模块调用来实现。圆及画线子模块显示圆形表盘,及时、分、秒针,然后调用秒针移动子模块式电子钟能够运行。动子模块中,首先通过cos和sin两个功能模块来确定秒针移动的度数,其次分别对秒、分、时进行擦除重写操作,再分别对表盘及圆心进行刷新,这样就实现了时、分、秒针的动态变化。四.程序流程图4开始显示信息调用画线子模块画出时分秒针调用系统实时时钟显示模块Clk显示系统时间调用擦除、重写及角度确定子模块进行指针移动调用renovate及enovate进行表盘及圆心的刷新接收键盘字符是否为q结束YN5五、实验结果六、程序源代码包含的库文件及数据段的定义如下:.386.modelflat,stdcalloptioncasemap:noneincludewindows.inc;Include文件定义includeuser32.incincludelibuser32.libincludekernel32.incincludelibkernel32.libincludeGdi32.incincludelibGdi32.lib.data?hInstancedd?hWinMaindd?dwCenterXdd?;圆心X6dwCenterYdd?;圆心YdwRadiusdd?;半径ICO_MAINequ1000h;Equ等值定义ID_TIMERequ1.constszClassNamedb'指针式屏显电子钟',0(2)计算时钟的位置、大小的_CalcClockParam子程序:_CalcClockParamproclocal@stRect:RECTinvokeGetClientRect,hWinMain,addr@stRectmoveax,@stRect.rightsubeax,@stRect.left;eax=宽度movecx,@stRect.bottomsubecx,@stRect.top;ecx=高度.ifecxeax;比较客户区宽度和高度,以小的值作为时钟的直径movedx,eax;高度宽度subecx,eaxshrecx,1movdwCenterX,0movdwCenterY,ecx.elsemovedx,ecxsubeax,ecxshreax,1movdwCenterX,eaxmovdwCenterY,0.endifshredx,1movdwRadius,edxadddwCenterX,edxadddwCenterY,edxret_CalcClockParamendp(3)计算时钟圆周上某个角度对应的X坐标,X=圆心X+Sin(角度)*半径的子程序_CalcX:_dwPara180dw180_CalcXproc_dwDegree,_dwRadius;输入参数是角度_dwDegree和半径_dwRadius7local@dwReturnfilddwCenterXfild_dwDegreefldpifmul;角度*Pifild_dwPara180fdivpst(1),st;角度*Pi/180fsin;Sin(角度*Pi/180)fild_dwRadiusfmul;半径*Sin(角度*Pi/180)fadd;X+半径*Sin(角度*Pi/180)fistp@dwReturnmoveax,@dwReturnret_CalcXendp计算时钟圆周上某个角度对应的Y坐标,类似于上面计算X坐标,Y=圆心Y-Cos(角度)*半径(4)按照_dwDegreeInc的步进角度,画_dwRadius为半径的小圆点(刻度)程序:_DrawDotproc_hDC,_dwDegreeInc,_dwRadiuslocal@dwNowDegree,@dwRlocal@dwX,@dwYmov@dwNowDegree,0moveax,dwRadiussubeax,10mov@dwR,eax.while@dwNowDegree=360finitinvoke_CalcX,@dwNowDegree,@dwR;计算小圆点的圆心坐标mov@dwX,eaxinvoke_CalcY,@dwNowDegree,@dwRmov@dwY,eaxmoveax,@dwX;画点movebx,eaxmovecx,@dwYmovedx,ecxsubeax,_dwRadiusaddebx,_dwRadiussubecx,_dwRadiusaddedx,_dwRadius8invokeEllipse,_hDC,eax,ecx,ebx,edxmoveax,_dwDegreeIncadd@dwNowDegree,eax.endwret_DrawDotendp(5)画_dwDegree角度的线条,半径=时钟半径-参数_dwRadiusAdjust(指针)子程序:_DrawLineproc_hDC,_dwDegree,_dwRadiusAdjustlocal@dwRlocal@dwX1,@dwY1,@dwX2,@dwY2moveax,dwRadiussubeax,_dwRadiusAdjustmov@dwR,eaxinvoke_CalcX,_dwDegree,@dwR;计算线条两端的坐标mov@dwX1,eaxinvoke_CalcY,_dwDegree,@dwRmov@dwY1,eaxadd_dwDegree,180invoke_CalcX,_dwDegree,10mov@dwX2,eaxinvoke_CalcY,_dwDegree,10mov@dwY2,eaxinvokeMoveToEx,_hDC,@dwX1,@dwY1,NULLinvokeLineTo,_hDC,@dwX2,@dwY2ret_DrawLineendp(6)调用API函数显示系统当前时间及画电子钟的指针程序:_ShowTimeproc_hWnd,_hDClocal@stTime:SYSTEMTIMEpushad9invokeGetLocalTime,addr@stTimeinvoke_CalcClockParaminvokeGetStockObject,BLACK_BRUSH;画时钟圆周上的点invokeSelectObject,_hDC,eaxinvoke_DrawDot,_hDC,360/12,3;画12个大圆点invoke_DrawDot,_hDC,360/60,1;画60个小圆点invokeCreatePen,PS_SOLID,1,0;画时钟指针invokeSelectObject,_hDC,eaxinvokeDeleteObject,eaxmovzxeax,@stTime.wSecondmovecx,360/60mulecx;秒针度数=秒*360/60invoke_DrawLine,_hDC,eax,15;时针、分针的画法类似于秒针,只是设置的显示宽度不同invokeCreatePen,PS_SOLID,3,0invokeSelectObject,_hDC,eaxinvokeDeleteObject,eaxmovzxeax,@stTime.wHour.ifeax=12subeax,12.endifmovecx,360/1210mulecxmovzxecx,@stTime.wMinuteshrecx,1addeax,ecxinvoke_DrawLine,_hDC,eax,30invokeGetStockObject,NULL_PENinvokeSelectObject,_hDC,eaxinvokeDeleteObject,eaxpopadret_ShowTimeendp(7)显示圆形表盘窗口的初始化过程:_ProcWinMainprocusesebxediesihWnd,uMsg,wParam,lParamlocal@stPS:PAINTSTRUCTmoveax,uMsg.ifeax==WM_TIMERinvokeInvalidateRect,hWnd,NULL,TRUEinvokeMessageBeep,-1.elseifeax==WM_PAINTinvokeBeginPaint,hWnd,addr@stPSinvoke_ShowTime,hWnd,eax11invokeEndPaint,hWnd,addr@stPS.elseifeax==WM_CREATEinvokeSetTimer,hWnd,ID_TIMER,1000,NULL.elseifeax==WM_CLOSE||((eax==WM_KEYDOWN||eax==WM_KEYUP)&&wParam==VK_ESCAPE)invokeKillTimer,hWnd,ID_TIMERinvokeDestroyWindow,hWinMaininvokePostQuitMessage,NULL.elseinvokeDefWindowProc,hWnd,uMsg,wParam,lParamret.endifxoreax,eaxret_ProcWinMainendp(8)程序的主体显示过程:_WinMainproclocal@stWndClass:WNDCLASSEXlocal@stMsg:MSGinvokeGetModuleHandle,NULLmovhInstance,eaxinvokeRtlZeroMemory,addr@stWndClass,sizeof@stWndClass;注册窗口类12invokeLoadIcon,hInstance,ICO_MAINmov@stWndClass.hIcon,eaxmov@stWndClass.hIconSm,eaxinvokeLoadCursor,0,IDC_ARROWmov@stWndClass.hCursor,eaxpushhInstancepop@stWndClass.hIns
本文标题:微机原理课设_指针式屏显电子钟
链接地址:https://www.777doc.com/doc-5327237 .html