微机原理及应用课程设计-指针式的屏显电子钟-源代码及注释

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

微机原理及应用课程设计指针式的屏显电子钟汇编程序源代码及完整注释:;;2012微机原理课程设计;指针式的屏显电子钟;;.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?;半径.constszClassNamedb'指针式的屏显电子钟byLZP',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@dwReturnfilddwCenterX;装入整数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=半径subeax,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;画圆_DrawSquareendp;画时针和分针,角度为_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;dwDegree=dwDegree+180度,得到指针对应另一端点的度数invoke_CalcX,_dwDegree,50;秒针另一端长度给50mov@dwX2,eaxinvoke_CalcY,_dwDegree,50;秒针另一端长度给50mov@dwY2,eaxinvokeMoveToEx,_hDC,@dwX1,@dwY1,NULLinvokeLineTo,_hDC,@dwX2,@dwY2;画秒针指向的点xoreax,eaxmoveax,dwRadius;eax=圆的半径dwRadiussubeax,20;eax=半径-20,点到窗口留20的距离mov@dwR,eaxfinit;初始化FPU,清除浮点数据寄存器栈和异常;计算小圆点的圆心坐标add_dwDegree,180invoke_CalcX,_dwDegree,@dwRmov@dwX,eaxinvoke_CalcY,_dwDegree,@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;画圆ret_DrawLine2endp;显示时间_ShowTimeproc_hWnd,_hDClocal@stTime:SYSTEMTIME;局部变量变量名:变量类型SYSTEMTIME类数据结构(年,月,日,星期,时,分,秒,毫秒)pushad;汇编语言传送指令,PUSHAD指令压入32位寄存器,使他们按照EDI,ESI,EBP,ESP,EBX,EDX,EC

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功