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

上传人:scccc 文档编号:11226676 上传时间:2021-07-15 格式:DOC 页数:12 大小:21.70KB
返回 下载 相关 举报
微机原理及应用课程设计 指针式的屏显电子钟 源代码及注释.doc_第1页
第1页 / 共12页
微机原理及应用课程设计 指针式的屏显电子钟 源代码及注释.doc_第2页
第2页 / 共12页
微机原理及应用课程设计 指针式的屏显电子钟 源代码及注释.doc_第3页
第3页 / 共12页
微机原理及应用课程设计 指针式的屏显电子钟 源代码及注释.doc_第4页
第4页 / 共12页
微机原理及应用课程设计 指针式的屏显电子钟 源代码及注释.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《微机原理及应用课程设计 指针式的屏显电子钟 源代码及注释.doc》由会员分享,可在线阅读,更多相关《微机原理及应用课程设计 指针式的屏显电子钟 源代码及注释.doc(12页珍藏版)》请在三一文库上搜索。

1、微机原理及应用课程设计 指针式的屏显电子钟 源代码及注释 微机原理及应用课程设计 指针式的屏显电子钟 汇编程序源代码及完整注释: ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&g

2、t;>>>>>>>>> ;>>>>>> 2012微机原理课程设计 ;>>>>>>指针式的屏显电子钟 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&g

3、t;>>>>>>>>>>>>>>>>>>>> .386 ;指明指令集 .model flat, stdcall ;程序工作模式,flat模式,stdcall右边参数先入栈 option casemap :none ;格式,大小写敏感 ; Include 文件定义 include include include include ; Equ等值定义 ICO_MAIN ; 对颜色的宏定义 RGB macro red,green,blue xoreax,eax movah,blue

4、shl eax,8 movah,green moval,red endm ; 数据段 .data equ 1 1000h ID_TIMERequ windows.inc user32.inc kernel32.inc Gdi32.inc includelib user32.lib includelib kernel32.lib includelib Gdi32.lib hInstance dd hWinMain dd dwCenterX dd dwCenterY dd dwRadius dd .const szClassName ; 代码段 .code ; 计算时钟的位置、大小等参数 _Cal

5、cClockParam _CalcClockParam endp 宽度和高度 invoke GetClientRect,hWinMain,addr stRect ;获取窗口客户区的坐标(窗口句柄,客户区坐标),写入stRect mov eax,stRect.right sub eax,stRect.left ;左坐标-右坐标相减得到宽度保存至eax mov ecx,stRect.bottom sub ecx,stRect.top .if ;上坐标-下坐标相减得到高度保存至ecx proc local stRect:RECT ;局部变量变量名:变量类型rect对象用来存储一个矩形框的左上角坐标、

6、db 指针式的屏显电子钟 by LZP,0 ? ;变量类型为DWORD双字 ? ? ? ? ;圆心X ;圆心Y ;半径 ; 比较客户区宽度和高度,以小的值作为时钟的直径 ecx>eax ;高度>宽度 mov edx,eax sub ecx,eax ;ecx=高度-宽度 shr ecx,1 ;ecx逻辑右移,ecx/2 mov dwCenterX,0 mov dwCenterY,ecx ;得到宽高之差的一半 mov edx,ecx sub eax,ecx ;eax=宽度-高度 shr eax,1 ;eax逻辑右移,eax/2 mov dwCenterX,eax ;得到宽高之差的一半

7、mov dwCenterY,0 .else ;高度<宽度 .endif shr edx,1 ;edx逻辑右移,edx/2 mov dwRadius,edx ;得到圆的半径dwRadius add dwCenterX,edx ;dwCenterX=dwCenterX+半径长度,得到圆心X坐标 add dwCenterY,edx ;dwCenterY=dwCenterY+半径长度,得到圆心Y坐标 ret ; 计算时钟圆周上某个角度对应的 X 坐标 ; X = 圆心X + Sin(角度) * 半径 _dwPara180 _CalcX ; 计算时钟圆周上某个角度对应的 Y 坐标 ; Y = 圆心

8、Y - Cos(角度) * 半径 _CalcY ; 按照 _dwDegreeInc的步进角度,画 _dwRadius为半径的小圆点 fild dwCenterY ;装入整数dwCenterY(圆心y坐标)到浮点运算器 fild _dwDegree ;装入整数_dwDegree到浮点运算器 fldpi ;将pi装入浮点运算器 fmul ;角度*pi fild _dwPara180 ;装入整数_dwPara180到浮点运算器 fdivp st(1),st ;极坐标度数=角度*Pi/180 fcos ;Cos(角度*Pi/180) fild _dwRadius ;装入整数_dwRadius(半径)到

9、浮点运算器 fmul ;半径*Cos(角度*Pi/180) fsubp st(1),st ;圆心Y-半径*Cos(角度*Pi/180) fistp dwReturn ;dest<- st(0) 然后再执行一次出栈操作 mov eax,dwReturn ;运算结果存至eax ret endp proc _dwDegree,_dwRadius ;CalcY(度数,半径) local dwReturn fild dwCenterX ;装入整数dwCenterX(圆心x坐标)到浮点运算器 fild _dwDegree ;装入整数_dwDegree到浮点运算器 fldpi ;将pi装入浮点运算器

10、fmul ;角度*pi ;极坐标度数=角度*Pi/180 ;Sin(角度*Pi/180) ;半径*Sin(角度*Pi/180) ;圆心X+半径*Sin(角度*Pi/180) fild _dwPara180 ;装入整数_dwPara180到浮点运算器 fdivp st(1),st fsin fmul fadd dw 180 proc _dwDegree,_dwRadius ;CalcX(度数,半径) local dwReturn fild _dwRadius ;装入整数_dwRadius(半径)到浮点运算器 fistp dwReturn ;dest<- st(0) 然后再执行一次出栈操作

11、mov eax,dwReturn ;运算结果存至eax ret endp _CalcX _CalcY _DrawDot proc _hDC,_dwDegreeInc,_dwRadius ; 画以表盘中心为圆心的圆 _DrawSquareproc _hDC local dwR mov eax,dwRadius ;eax=半径 sub eax,50 ;eax=半径-10,到窗口留10的距离 mov dwR,eax moveax,dwCenterX movebx,eax movecx,dwCenterY movedx,ecx sub eax,dwR ;椭圆左上角的X坐标=x-点的半径 ret mov

12、 eax,_dwDegreeInc add dwNowDegree,eax ;按_dwDegreeInc进行步进,循环画点 mov dwNowDegree,0 ;当前Degree初始化为0 mov eax,dwRadius ;eax=半径 sub eax,20 ;eax=半径-20,点到窗口留20的距离 mov dwR,eax .while dwNowDegree<= 360 finit ;初始化FPU,清除浮点数据寄存器栈和异常 invoke invoke _CalcX,dwNowDegree,dwR _CalcY,dwNowDegree,dwR local dwNowDegree,d

13、wR local dwX,dwY ; 计算小圆点的圆心坐标 mov dwX,eax mov dwY,eax mov eax,dwX mov ebx,eax ;表示该圆为正圆 mov ecx,dwY mov edx,ecx ;表示该圆为正圆 sub eax,_dwRadius ;椭圆左上角的X坐标=x-点的半径 add ebx,_dwRadius ;椭圆右下角的X坐标=x+点的半径 sub ecx,_dwRadius ;椭圆左上角的Y坐标=y-点的半径 add edx,_dwRadius ;椭圆右下角的Y坐标=y+点的半径 invoke Ellipse,_hDC,eax,ecx,ebx,edx

14、;画圆 ;画点 .endw _DrawDot endp add ebx,dwR ;椭圆右下角的X坐标=x+点的半径 sub ecx,dwR ;椭圆左上角的Y坐标=y-点的半径 add edx,dwR ;椭圆右下角的Y坐标=y+点的半径 invoke Ellipse,_hDC,eax,ecx,ebx,edx ;画圆 _DrawSquareendp ; 画时针和分针,角度为_dwDegree,半径=时钟半径-参数_dwRadiusAdjust _DrawLine proc _hDC,_dwDegree,_dwRadiusAdjust ; 画秒针,角度为_dwDegree,半径=时钟半径-参数_dw

15、RadiusAdjust _DrawLine2 mov eax,dwRadius ;eax=圆的半径dwRadius sub eax,_dwRadiusAdjust ;指针线条的长度=圆的半径-所给参数 mov dwR2,edx mov dwR,eax invoke _CalcX,_dwDegree,dwR proc _hDC,_dwDegree,_dwRadiusAdjust,_dwRadius local dwR,dwR2 local dwX1,dwY1,dwX2,dwY2,dwX,dwY ret _DrawLine endp mov eax,dwRadius ;eax=圆的半径dwRad

16、ius sub eax,_dwRadiusAdjust ;指针线条的长度=圆的半径-所给参数 mov dwR,eax invoke invoke _CalcX,_dwDegree,dwR _CalcY,_dwDegree,dwR local dwR local dwX1,dwY1,dwX2,dwY2 ; 计算线条两端的坐标 mov dwX1,eax mov dwY1,eax add _dwDegree,180 ;dwDegree=dwDegree+180度,得到指针对应另一端点的度数 invoke invoke invoke invoke _CalcX,_dwDegree,10;时针和分针另一

17、端长度给10 _CalcY,_dwDegree,10;时针和分针另一端长度给10 MoveToEx,_hDC,dwX1,dwY1,NULL ;将当前绘图位置移动到某个具体的点 LineTo,_hDC,dwX2,dwY2 ;用当前画笔画一条线,从当前位置连到一个mov dwX2,eax mov dwY2,eax 指定的点 ; 计算线条两端的坐标 mov dwX1,eax invoke _CalcY,_dwDegree,dwR mov dwY1,eax add _dwDegree,180 ;dwDegree=dwDegree+180度,得到指针对应另一端点的度数 invoke invoke inv

18、oke invoke _CalcX,_dwDegree,50;秒针另一端长度给50 _CalcY,_dwDegree,50;秒针另一端长度给50 MoveToEx,_hDC,dwX1,dwY1,NULL LineTo,_hDC,dwX2,dwY2 mov dwX2,eax mov dwY2,eax ;画秒针指向的点 ; 显示时间 _ShowTime local stTime:SYSTEMTIME ;局部变量变量名:变量类型 SYSTEMTIME类数据结构(年,月, proc _hWnd,_hDC ret endp _DrawLine2 xoreax,eax mov eax,dwRadius ;

19、eax=圆的半径dwRadius sub eax,20 ;eax=半径-20,点到窗口留20的距离 mov dwR,eax finit ;初始化FPU,清除浮点数据寄存器栈和异常 add _dwDegree,180 invoke invoke _CalcX,_dwDegree,dwR _CalcY,_dwDegree,dwR mov dwX,eax mov dwY,eax mov eax,dwX mov ebx,eax ;表示该圆为正圆 mov ecx,dwY mov edx,ecx ;表示该圆为正圆 sub eax,_dwRadius ;椭圆左上角的X坐标=x-点的半径 add ebx,_d

20、wRadius ;椭圆右下角的X坐标=x+点的半径 sub ecx,_dwRadius ;椭圆左上角的Y坐标=y-点的半径 add edx,_dwRadius ;椭圆右下角的Y坐标=y+点的半径 invoke Ellipse,_hDC,eax,ecx,ebx,edx ;画圆 ; 计算小圆点的圆心坐标 ;画点 日,星期,时,分,秒,毫秒) pushad ;汇编语言传送指令,PUSHAD指令压入32位寄存器,使他们按照invoke invoke GetLocalTime,addr stTime ;GetLocalTime获取当地的当前系统日期和时间,stTime_CalcClockParam ;计

21、算时钟的位置、大小等参数 EDI,ESI,EBP,ESP,EBX,EDX,ECX,最后是EAX的顺序出现在堆栈中 指向一个用户自定义包含日期和时间信息的类型为 SYSTEMTIME 的变量 ; 画时钟外围的圆 ;RGB 51,255,229 ;invokeSetDCBrushColor,_hDC,eax ;invoke ;invoke ;invoke SelectObject,_hDC,eax DeleteObject,eax GetStockObject,DC_BRUSH ;invoke _DrawSquare,_hDC ; 画时钟圆周上的点 RGB 51,208,229 ;invokeSe

22、tDCPenColor,_hDC,eax invoke SetDCBrushColor,_hDC,eax ;把当前设备上下文环境画笔颜色设置为指定颜色值 ;invoke invoke invoke invoke invoke GetStockObject,DC_PEN ;GetStockObject该函数检索预定义的备用笔、刷子、字GetStockObject,DC_BRUSH SelectObject,_hDC,eax ;选择一对象到指定的设备上下文环境中,该新对象替换先_DrawDot,_hDC,360/60,2 ;画60个小圆点 _DrawDot,_hDC,360/12,5 ;画12个大

23、圆点 体或者调色板的句柄 前的相同类型的对象 ; 画秒针及秒针指向的点变色 RGB 51,51,51 invoke SetDCBrushColor,_hDC,eax invoke invoke invoke invoke invoke movzx GetStockObject,DC_BRUSH SelectObject,_hDC,eax CreatePen,PS_SOLID,1,eax ;用指定的样式、宽度和颜色创建一个画笔(点线,宽度1,颜SelectObject,_hDC,eax ;选择一对象到指定的设备上下文环境中,该新对象替换先前DeleteObject,eax ;删除画笔,释放资源

24、eax,stTime.wSecond ;将较小值拷贝到较大值中 ;秒针度数 = 秒 * 360/60 色RGB) 的相同类型的对象 mov ecx,360/60 mul ecx invoke _DrawLine2,_hDC,eax,35,5 ;RGB 153,204,0 ;invokeSetDCBrushColor,_hDC,eax ;invoke ;invoke GetStockObject,DC_BRUSH SelectObject,_hDC,eax ;invoke _DrawDot2,_hDC,eax,8 ; 画分针 RGB 0,153,204 _ShowTime ; 窗口回调函数 _P

25、rocWinMain proc uses ebxediesi hWnd,uMsg,wParam,lParam,_hDC local stPS:PAINTSTRUCT ;PAINTSTRUCT结构包含的信息应用程序使用来绘制一个拥有该应用窗口客户区 endp ;invoke ;invoke ;invoke GetStockObject,NULL_PEN SelectObject,_hDC,eax DeleteObject,eax invoke invoke invoke movzx CreatePen,PS_SOLID,4,eax SelectObject,_hDC,eax DeleteObje

26、ct,eax eax,stTime.wMinute ;分针度数 = 分 * 360/60 mov ecx,360/60 mul ecx invoke _DrawLine,_hDC,eax,45 ; 画时针 RGB 0,53,103 invoke invoke invoke movzx .if CreatePen,PS_SOLID,8,eax SelectObject,_hDC,eax DeleteObject,eax eax,stTime.wHour 12 ;24小时制 eax>= sub eax,12 .endif mov ecx,360/12 mul ecx ;时针度数 = 时 *

27、360/12 movzx ecx,stTime.wMinute shr ecx,1 ;ecx逻辑右移,ecx/2 add eax,ecx invoke _DrawLine,_hDC,eax,60 invoke Beep,300,300 popad ;依次弹出堆栈 ret mov eax,uMsg ;消息判断 ;定时器 .if eax = invoke WM_TIMER InvalidateRect,hWnd,NULL,TRUE ;重绘 ;invoke Beep,300,300 ;invoke MessageBeep,-1 eax = WM_PAINT ;窗口重绘 .elseif invoke

28、invoke invoke BeginPaint,hWnd,addr stPS ;指定窗口进行绘图工作的准备,并用将和绘图有_ShowTime,hWnd,eax EndPaint,hWnd,addr stPS ;标记指定窗口的绘画过程结束 WM_CREATE 关的信息填充到一个AINTSTRUCT结构中 ;创建程序 .elseif eax = WM_CLOSE |(eax = WM_KEYDOWN |eax = WM_KEYUP) &&wParam eax = invoke SetTimer,hWnd,ID_TIMER,1000,NULL ;定时器 1000ms ;退出程序 .

29、elseif .else invoke ret DefWindowProc,hWnd,uMsg,wParam,lParam = VK_ESCAPE) invoke invoke invoke KillTimer,hWnd,ID_TIMER ;移除定时器 DestroyWindow,hWinMain ;销毁指定的窗口 PostQuitMessage,NULL ;线程请求终止 ;缺省状态 .endif xor eax,eax ret _ProcWinMain endp _WinMain proc invoke GetModuleHandle,NULL mov hInstance,eax invok

30、e invoke RtlZeroMemory,addr stWndClass,sizeof stWndClass LoadIcon,hInstance,ICO_MAIN local stWndClass:WNDCLASSEX local stMsg:MSG ; 注册窗口类 mov stWndClass.hIcon,eax mov stWndClass.hIconSm,eax invoke LoadCursor,0,IDC_ARROW mov stWndClass.hCursor,eax push hInstance pop stWndClass.hInstance mov stWndClass

31、.cbSize,sizeof WNDCLASSEX mov stWndClass.style,CS_HREDRAW or CS_VREDRAW mov stWndClass.lpfnWndProc,offset _ProcWinMain mov stWndClass.hbrBackground,COLOR_WINDOW + 5 mov stWndClass.lpszClassName,offsetszClassName invoke invoke RegisterClassEx,addr stWndClass CreateWindowEx,WS_EX_CLIENTEDGE, ; 建立并显示窗口

32、 offsetszClassName,offsetszClassName, WS_OVERLAPPEDWINDOW, 100,100,550,570, ;窗口显示的尺寸和位置 NULL,NULL,hInstance,NULL ShowWindow,hWinMain,SW_SHOWNORMAL UpdateWindow,hWinMain TRUE GetMessage,addr stMsg,NULL,0,0 .if eax = 0 TranslateMessage,addr stMsg DispatchMessage,addr stMsg mov hWinMain,eax invoke invoke .while ret ; 消息循环 invoke .break invoke invoke .endw _WinMain endp ;从此处开始执行 start: call _WinMain invoke ExitProcess,NULL ;中止进程 end start 程序运行结果:

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1