您好,欢迎访问三七文档
1微机原理及应用课程设计设计题目:指针式屏显电子钟专业计算机科学与技术班级计102学生******指导教师付长龙2013年春季学期2目录一、实验目的3二、实验内容及要求3三.课设基本思想3四.程序流程图4五、实验源代码5六、实验结果14七、课设心得体会15八、参考资料153一、实验目的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,stdcall;程序工作模式,flat模式,stdcall右边参数先入栈optioncasemap:none;格式,大小写敏感;Include文件定义includewindows.incincludeuser32.incincludelibuser32.libincludekernel32.incincludelibkernel32.libincludeGdi32.incincludelibGdi32.lib;Equ等值定义ICO_MAINequ1000hID_TIMERequ1;对颜色的宏定义RGBmacrored,green,bluexoreax,eaxmovah,blueshleax,8movah,greenmoval,redendm;宏定义结束指令;数据段.datahInstancedd?;变量类型为DWORD双字hWinMaindd?dwCenterXdd?;圆心XdwCenterYdd?;圆心YdwRadiusdd?;半径6.constszClassNamedb'指针式的屏显电子钟',0;代码段.code;计算时钟的位置、大小等参数_CalcClockParamproclocal@stRect:RECT;局部变量变量名:变量类型rect对象用来存储一个矩形框的左上角坐标、宽度和高度invokeGetClientRect,hWinMain,addr@stRect;获取窗口客户区的坐标(窗口句柄,客户区坐标),写入stRectmoveax,@stRect.rightsubeax,@stRect.left;左坐标-右坐标相减得到宽度保存至eaxmovecx,@stRect.bottomsubecx,@stRect.top;上坐标-下坐标相减得到高度保存至ecx;比较客户区宽度和高度,以小的值作为时钟的直径.ifecxeax;高度宽度movedx,eaxsubecx,eax;ecx=高度-宽度shrecx,1;ecx逻辑右移,ecx/2movdwCenterX,0movdwCenterY,ecx;得到宽高之差的一半.else;高度宽度movedx,ecxsubeax,ecx;eax=宽度-高度shreax,1;eax逻辑右移,eax/2movdwCenterX,eax;得到宽高之差的一半movdwCenterY,0.endifshredx,1;edx逻辑右移,edx/2movdwRadius,edx;得到圆的半径dwRadiusadddwCenterX,edx;dwCenterX=dwCenterX+半径长度,得到圆心X坐标adddwCenterY,edx;dwCenterY=dwCenterY+半径长度,得到圆心Y坐标ret_CalcClockParamendp;计算时钟圆周上某个角度对应的X坐标;X=圆心X+Sin(角度)*半径_dwPara180dw180_CalcXproc_dwDegree,_dwRadius;CalcX(度数,半径)local@dwReturn7filddwCenterX;装入整数dwCenterX(圆心x坐标)到浮点运算器fild_dwDegree;装入整数_dwDegree到浮点运算器fldpi;将pi装入浮点运算器fmul;角度*pifild_dwPara180;装入整数_dwPara180到浮点运算器fdivpst(1),st;极坐标度数=角度*Pi/180fsin;Sin(角度*Pi/180)fild_dwRadius;装入整数_dwRadius(半径)到浮点运算器fmul;半径*Sin(角度*Pi/180)fadd;圆心X+半径*Sin(角度*Pi/180)fistp@dwReturn;dest-st(0)然后再执行一次出栈操作moveax,@dwReturn;运算结果存至eaxret_CalcXendp;计算时钟圆周上某个角度对应的Y坐标;Y=圆心Y-Cos(角度)*半径_CalcYproc_dwDegree,_dwRadius;CalcY(度数,半径)local@dwReturnfilddwCenterY;装入整数dwCenterY(圆心y坐标)到浮点运算器fild_dwDegree;装入整数_dwDegree到浮点运算器fldpi;将pi装入浮点运算器fmul;角度*pifild_dwPara180;装入整数_dwPara180到浮点运算器fdivpst(1),st;极坐标度数=角度*Pi/180fcos;Cos(角度*Pi/180)fild_dwRadius;装入整数_dwRadius(半径)到浮点运算器fmul;半径*Cos(角度*Pi/180)fsubpst(1),st;圆心Y-半径*Cos(角度*Pi/180)fistp@dwReturn;dest-st(0)然后再执行一次出栈操作moveax,@dwReturn;运算结果存至eaxret_CalcYendp;按照_dwDegreeInc的步进角度,画_dwRadius为半径的小圆点_DrawDotproc_hDC,_dwDegreeInc,_dwRadiuslocal@dwNowDegree,@dwRlocal@dwX,@dwYmov@dwNowDegree,0;当前Degree初始化为0moveax,dwRadius;eax=半径8subeax,20;eax=半径-20,点到窗口留20的距离mov@dwR,eax.while@dwNowDegree=360finit;初始化FPU,清除浮点数据寄存器栈和异常;计算小圆点的圆心坐标invoke_CalcX,@dwNowDegree,@dwRmov@dwX,eaxinvoke_CalcY,@dwNowDegree,@dwRmov@dwY,eax;画点moveax,@dwXmovebx,eax;表示该圆为正圆movecx,@dwYmovedx,ecx;表示该圆为正圆subeax,_dwRadius;椭圆左上角的X坐标=x-点的半径addebx,_dwRadius;椭圆右下角的X坐标=x+点的半径subecx,_dwRadius;椭圆左上角的Y坐标=y-点的半径addedx,_dwRadius;椭圆右下角的Y坐标=y+点的半径invokeEllipse,_hDC,eax,ecx,ebx,edx;画圆moveax,_dwDegreeIncadd@dwNowDegree,eax;按_dwDegreeInc进行步进,循环画点.endwret_DrawDotendp;画以表盘中心为圆心的圆_DrawSquareproc_hDClocal@dwRmoveax,dwRadius;eax=半径subeax,50;eax=半径-10,到窗口留10的距离mov@dwR,eaxmoveax,dwCenterXmovebx,eaxmovecx,dwCenterYmovedx,ecxsubeax,@dwR;椭圆左上角的X坐标=x-点的半径addebx,@dwR;椭圆右下角的X坐标=x+点的半径subecx,@dwR;椭圆左上角的Y坐标=y-点的半径addedx,@dwR;椭圆右下角的Y坐标=y+点的半径invokeEllipse,_hDC,eax,ecx,ebx,edx;画圆_DrawSquareendp9;画时针和分针,角度为_dwDegree,半径=时钟半径-参数_dwRadiusAdjust_DrawLineproc_hDC,_dwDegree,_dwRadiusAdjustlocal@dwRlocal@dwX1,@dwY1,@dwX2,@dwY2moveax,dwRadius;eax=圆的半径dwRadiussubeax,_dwRadiusAdjust;指针线条的长度=圆的半径-所给参数mov@dwR,eax;计算线条两端的坐标invoke_CalcX,_dwDegree,@dwRmov@dwX1,eaxinvoke_CalcY,_dwDegree,@dwRmov@dwY1,eaxadd_dwDegree,180;dwDegree=dwDegree+180度,得到指针对应另一端点的度数invoke_CalcX,_dwDegree,10;时针和分针另一端长度给10mov@dwX2,eaxinvoke_CalcY,_dwDegree,10;时针和分针另一端长度给10mov@dwY2,eaxinvokeMoveToEx,_hDC,@dwX1,@dwY1,NULL;将当前绘图位置移动到某个具体的点invokeLineTo,_hDC,@dwX2,@dwY2;用当前画笔画一条线,从当前位置连到一个指定的点ret_DrawLineendp;画秒针,角度为_dwDegree,半径=时钟半径-参数_dwRadiusAdjust_DrawLine2proc_hDC,_dwDegree,_dwRadiusAdjust,_dwRadiuslocal@dwR,@dwR2local@dwX1,@dwY1,@dwX2,@dwY2,@dwX,@dwYmoveax,dwRadius;eax=圆的半径dwRadiussubeax,_dwRadiusAdjust;指针线条的长度=圆的半径-所给参数mov@dwR2,edxmov@dwR,eax;计算线条两端的坐标invoke_CalcX,_dwDegree,@dwRmov@dwX1,eaxinvoke_CalcY,_dwDegree,@dwRmov@dwY1,eaxadd_dwDegree,180;d
本文标题:指针式屏显电子钟
链接地址:https://www.777doc.com/doc-5017416 .html