好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

微机原理课设_指针式屏显电子钟.doc

13页
  • 卖家[上传人]:cl****1
  • 文档编号:556741611
  • 上传时间:2023-02-02
  • 文档格式:DOC
  • 文档大小:313.50KB
  • / 13 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 微机原理及应用课程设计设计题目: 指针式的屏显电子钟专 业 网 络 工 程 班 级 网 络 081 学 生 刘妙曲 指导教师 王 理 2011 年 2 学期目 录一、 实验目的 …………………………………………..3二、 实验内容及要求……………………………………3三、 课设基本思想………………………………………3四、 程序流程图…………………………………………4五、 实验结果…………………..……………………….6六、 程序源代码…………………………………………6七、 课设心得体会………………………………………14八、 参考文献……………………………………………14一、实验目的1)学习系统驻留的方法2)了解BIOS中时间参数的调用方法3)了解屏幕画图的方法 对于本次应用的科目微机原理与接口技术来说,因为需要应用Win32 汇编语言技术来编写代码实现功能,所以要掌握这门语言并且要用到Windows API 接口的许多函数,所以要掌握一部分函数的调用方法及实现的功能。

      检验和提高汇编语言程序设计能力,和微机原理与接口技术应用方面的分析问题与解决问题的能力,掌握32位汇编语言,完成软件的设计要求、编码和测试等 二、实验内容及要求1)在屏幕上显示一个适当大小的椭圆形界面,椭圆形轨道上,均匀的分布着60个“点”,代表1秒~60秒的位置,凡是5倍数的“点”,应当比其他的“点”稍大2)以椭圆的中心为轴,画一条线代表“秒针”,采用定时中断的方式,每过一秒钟,秒钟移动一个位置,同时系统发出“嘀——嗒”的声音,如果相应的“点”能改变颜色,则动感更强3)定时源可以使用系统的定时源4)按下“Esc”键之后,结束演示三. 课设基本思想 1)屏幕应设置为图形方式,采用模块化编程模式,主模块显示椭圆形表盘,并且处理时钟中断,每过一秒钟,转入一次子模块,子模块负责秒针移动的位置2)在着手本课题设计之前,学习掌握真设计方法,掌握顺时针方向画圆的技术,灵活运用,就可以设计出秒针的移动程序3)系统驻留的方法及BIOS中时间参数的调用方法见统驻留时间程序屏幕设置为图形方式,采用模块化编程,主模块显示界面信息,每个子模块负责一个功能,然后通过模块调用来实现 圆及画线子模块显示圆形表盘,及时、分、秒针,然后调用秒针移动子模块式电子钟能够运行。

      动子模块中,首先通过cos和sin两个功能模块来确定秒针移动的度数,其次分别对秒、分、时进行擦除重写操作,再分别对表盘及圆心进行刷新,这样就实现了时、分、秒针的动态变化四. 程序流程图开始显示信息调用画线子模块画出时分秒针调用系统实时时钟显示模块Clk显示系统时间调用擦除、重写及角度确定子模块进行指针移动调用renovate及enovate进行表盘及圆心的刷新接收键盘字符是否为q结束YN五、实验结果六、程序源代码包含的库文件及数据段的定义如下:.386 .model flat, stdcall option casemap :none include windows.inc ; Include 文件定义include user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.libinclude Gdi32.incincludelib Gdi32.lib.data?hInstance dd ?hWinMain dd ?dwCenterX dd ? ;圆心X dwCenterY dd ? ;圆心YdwRadius dd ? ;半径ICO_MAIN equ 1000h ; Equ 等值定义ID_TIMER equ 1.constszClassName db '指针式屏显电子钟',0(2)计算时钟的位置、大小的_CalcClockParam子程序:_CalcClockParam proc local @stRect:RECT invoke GetClientRect,hWinMain,addr @stRect mov eax,@stRect.right sub eax,@stRect.left ;eax = 宽度 mov ecx,@stRect.bottom sub ecx,@stRect.top ;ecx = 高度 .if ecx > eax ; 比较客户区宽度和高度,以小的值作为时钟的直径 mov edx,eax ;高度 > 宽度 sub ecx,eax shr ecx,1 mov dwCenterX,0 mov dwCenterY,ecx .else mov edx,ecx sub eax,ecx shr eax,1 mov dwCenterX,eax mov dwCenterY,0 .endif shr edx,1 mov dwRadius,edx add dwCenterX,edx add dwCenterY,edx ret_CalcClockParam endp(3)计算时钟圆周上某个角度对应的 X 坐标, X = 圆心X + Sin(角度) * 半径的子程序_CalcX:_dwPara180 dw 180_CalcX proc _dwDegree,_dwRadius ;输入参数是角度_dwDegree和半径_dwRadius local @dwReturn fild dwCenterX fild _dwDegree fldpi fmul ;角度*Pi fild _dwPara180 fdivp st(1),st ;角度*Pi/180 fsin ;Sin(角度*Pi/180) fild _dwRadius fmul ;半径*Sin(角度*Pi/180) fadd ;X+半径*Sin(角度*Pi/180) fistp @dwReturn mov eax,@dwReturn ret_CalcX endp计算时钟圆周上某个角度对应的 Y 坐标,类似于上面计算X坐标,Y = 圆心Y - Cos(角度) * 半径(4)按照 _dwDegreeInc 的步进角度,画 _dwRadius 为半径的小圆点(刻度)程序:_DrawDot proc _hDC,_dwDegreeInc,_dwRadius local @dwNowDegree,@dwR local @dwX,@dwY mov @dwNowDegree,0 mov eax,dwRadius sub eax,10 mov @dwR,eax .while @dwNowDegree <= 360 finit invoke _CalcX,@dwNowDegree,@dwR ; 计算小圆点的圆心坐标 mov @dwX,eax invoke _CalcY,@dwNowDegree,@dwR mov @dwY,eax mov eax,@dwX ;画点 mov ebx,eax mov ecx,@dwY mov edx,ecx sub eax,_dwRadius add ebx,_dwRadius sub ecx,_dwRadius add edx,_dwRadius invoke Ellipse,_hDC,eax,ecx,ebx,edx mov eax,_dwDegreeInc add @dwNowDegree,eax .endw ret_DrawDot endp(5) 画 _dwDegree 角度的线条,半径=时钟半径-参数_dwRadiusAdjust(指针)子程序:_DrawLine proc _hDC,_dwDegree,_dwRadiusAdjust local @dwR local @dwX1,@dwY1,@dwX2,@dwY2 mov eax,dwRadius sub eax,_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 invoke MoveToEx,_hDC,@dwX1,@dwY1,NULL invoke LineTo,_hDC,@dwX2,@dwY2 ret_DrawLine endp(6)调用API函数显示系统当前时间及画电子钟的指针程序:_ShowTime proc _hWnd,_hDC local @stTime:SYSTEMTIME pushad invoke GetLocalTime,addr @stTime invoke _CalcClockParam invoke GetStockObject,BLACK_BRUSH ; 画时钟圆周上的点 invoke SelectObject,_hDC,eax invoke _DrawDot,_hDC,360/12,3 ;画12个大圆点 invoke _DrawDot,_hDC,360/60,1 ;画60个小圆点 invoke CreatePen,PS_SOLID,1,0 ; 画时钟指针 invoke SelectObject,_hDC,eax invoke DeleteObject,eax movzx eax,@stTime.wSecond mov ecx,360/60 mul ecx ;秒针度数 = 秒 * 360/60 invoke _DrawLine,_hDC,eax,15;时针、分针的画法类似于秒针,只是设置的显示宽度不同 invoke CreatePen,PS_SOLID,3,0 invoke SelectObject,_hDC,eax invoke DeleteObject,eax movzx eax,@stTime.wHour .if eax >= 12 sub eax,12 .endif mov ecx,360/12 mul ecx。

      点击阅读更多内容
      相关文档
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.