指针式屏显电子钟_第1页
指针式屏显电子钟_第2页
指针式屏显电子钟_第3页
指针式屏显电子钟_第4页
指针式屏显电子钟_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、微机原理及应用课程设计设计题目: 指针式屏显电子钟专 业 计算机科学与技术 班 级 计102 学 生 * 指导 教师 付长龙 2013 年 春季 学期目录Error! Reference source not found. 3Error! Reference source not found. 3Error! Reference source not found. 3Error! Reference source not found. 4Error! Reference source not found. 5六、实验结果 14Error! Reference source not found.

2、 15八、参考资料 15一、实验目的1)学习系统驻留的方法。2)了解BIOS中时间参数的调用方法。3)了解屏幕画图的方法 对于本次应用的科目微机原理与接口技术来说,因为需要应用Win32 汇编语言技术来编写代码实现功能,所以要掌握这门语言。并且要用到Windows API 接口的许多函数,所以要掌握一部分函数的调用方法及实现的功能。检验和提高汇编语言程序设计能力,和微机原理与接口技术应用方面的分析问题与解决问题的能力,掌握32位汇编语言,完成软件的设计要求、编码和测试等。 二、实验内容及要求1)在屏幕上显示一个适当大小的椭圆形界面,椭圆形轨道上,均匀的分布着60个“点”,代表1秒60秒的位置,

3、凡是5倍数的“点”,应当比其他的“点”稍大。2)以椭圆的中心为轴,画一条线代表“秒针”,采用定时中断的方式,每过一秒钟,秒钟移动一个位置,同时系统发出“嘀嗒”的声音,如果相应的“点”能改变颜色,则动感更强。3)定时源可以使用系统的定时源。4)按下“Esc”键之后,结束演示。三 课设基本思想 1)屏幕应设置为图形方式,采用模块化编程模式,主模块显示椭圆形表盘,并且处理时钟中断,每过一秒钟,转入一次子模块,子模块负责秒针移动的位置。2)在着手本课题设计之前,学习掌握真设计方法,掌握顺时针方向画圆的技术,灵活运用,就可以设计出秒针的移动程序。3)系统驻留的方法及BIOS中时间参数的调用方法见统驻留时

4、间程序。屏幕设置为图形方式,采用模块化编程,主模块显示界面信息,每个子模块负责一个功能,然后通过模块调用来实现。 圆及画线子模块显示圆形表盘,及时、分、秒针,然后调用秒针移动子模块式电子钟能够运行。 动子模块中,首先通过cos和sin两个功能模块来确定秒针移动的度数,其次分别对秒、分、时进行擦除重写操作,再分别对表盘及圆心进行刷新,这样就实现了时、分、秒针的动态变化。四 程序流程图开始显示信息调用画线子模块画出时分秒针调用系统实时时钟显示模块Clk显示系统时间调用擦除、重写及角度确定子模块进行指针移动调用renovate及enovate进行表盘及圆心的刷新接收键盘字符是否为q结束YN五、实验源

5、代码.386 ;指明指令集.model flat, stdcall ;程序工作模式,flat模式,stdcall右边参数先入栈option casemap :none ;格式,大小写敏感; Include 文件定义includewindows.inc includeuser32.incincludelibuser32.libincludekernel32.incincludelibkernel32.libincludeGdi32.incincludelibGdi32.lib; Equ等值定义ICO_MAINequ1000hID_TIMERequ1; 对颜色的宏定义RGB macro red,g

6、reen,bluexor eax,eaxmov ah,blueshl eax,8 mov ah,greenmov al,redendm ;宏定义结束指令; 数据段.datahInstancedd? ;变量类型为DWORD双字hWinMaindd?dwCenterXdd?;圆心XdwCenterYdd?;圆心YdwRadiusdd?;半径.constszClassNamedb指针式的屏显电子钟,0; 代码段.code; 计算时钟的位置、大小等参数_CalcClockParamproclocalstRect:RECT ;局部变量变量名:变量类型rect对象用来存储一个矩形框的左上角坐标、宽度和高度

7、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,0movdw

8、CenterY,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_CalcCloc

9、kParamendp; 计算时钟圆周上某个角度对应的 X 坐标; X = 圆心X + Sin(角度) * 半径_dwPara180dw180_CalcXproc_dwDegree,_dwRadius ;CalcX(度数,半径)localdwReturnfilddwCenterX ;装入整数dwCenterX(圆心x坐标)到浮点运算器fild_dwDegree ;装入整数_dwDegree到浮点运算器fldpi ;将pi装入浮点运算器fmul ;角度*pifild_dwPara180 ;装入整数_dwPara180到浮点运算器fdivpst(1),st;极坐标度数=角度*Pi/180fsin ;

10、Sin(角度*Pi/180)fild_dwRadius ;装入整数_dwRadius(半径)到浮点运算器fmul ;半径*Sin(角度*Pi/180)fadd ;圆心X+半径*Sin(角度*Pi/180)fistpdwReturn ;dest- st(0) 然后再执行一次出栈操作moveax,dwReturn ;运算结果存至eaxret_CalcXendp; 计算时钟圆周上某个角度对应的 Y 坐标; Y = 圆心Y - Cos(角度) * 半径_CalcYproc_dwDegree,_dwRadius ;CalcY(度数,半径)localdwReturnfilddwCenterY ;装入整数d

11、wCenterY(圆心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)fistpdwReturn ;dest- st(0) 然后再执行一次

12、出栈操作moveax,dwReturn ;运算结果存至eaxret_CalcYendp; 按照 _dwDegreeInc的步进角度,画 _dwRadius为半径的小圆点_DrawDotproc_hDC,_dwDegreeInc,_dwRadiuslocaldwNowDegree,dwRlocaldwX,dwYmovdwNowDegree,0 ;当前Degree初始化为0moveax,dwRadius ;eax=半径subeax,20 ;eax=半径-20,点到窗口留20的距离movdwR,eax.whiledwNowDegree=12 ;24小时制subeax,12.endifmovecx,3

13、60/12mulecx ;时针度数 = 时 * 360/12movzxecx,stTime.wMinuteshrecx,1 ;ecx逻辑右移,ecx/2addeax,ecxinvoke_DrawLine,_hDC,eax,60invoke Beep,300,300popad ;依次弹出堆栈ret_ShowTimeendp; 窗口回调函数_ProcWinMainprocuses ebx edi esi hWnd,uMsg,wParam,lParam,_hDClocalstPS:PAINTSTRUCT ;PAINTSTRUCT结构包含的信息应用程序使用来绘制一个拥有该应用窗口客户区moveax,u

14、Msg;消息判断;定时器.ifeax =WM_TIMERinvokeInvalidateRect,hWnd,NULL,TRUE ;重绘;invoke Beep,300,300;invoke MessageBeep,-1;窗口重绘.elseifeax =WM_PAINT invokeBeginPaint,hWnd,addr stPS ;指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个AINTSTRUCT结构中invoke_ShowTime,hWnd,eaxinvokeEndPaint,hWnd,addr stPS ;标记指定窗口的绘画过程结束 ;创建程序.elseifeax =WM_

15、CREATE invokeSetTimer,hWnd,ID_TIMER,1000,NULL ;定时器 1000ms ;退出程序.elseifeax =WM_CLOSE |(eax = WM_KEYDOWN |eax = WM_KEYUP) &wParam = VK_ESCAPE)invokeKillTimer,hWnd,ID_TIMER ;移除定时器invokeDestroyWindow,hWinMain ;销毁指定的窗口invokePostQuitMessage,NULL ;线程请求终止 ;缺省状态.elseinvokeDefWindowProc,hWnd,uMsg,wParam,lPara

16、mret.endifxoreax,eaxret_ProcWinMainendp_WinMainproclocalstWndClass:WNDCLASSEXlocalstMsg:MSGinvokeGetModuleHandle,NULLmovhInstance,eax ; 注册窗口类invokeRtlZeroMemory,addr stWndClass,sizeof stWndClassinvokeLoadIcon,hInstance,ICO_MAINmovstWndClass.hIcon,eaxmovstWndClass.hIconSm,eaxinvokeLoadCursor,0,IDC_AR

17、ROWmovstWndClass.hCursor,eaxpushhInstancepopstWndClass.hInstancemovstWndClass.cbSize,sizeof WNDCLASSEXmovstWndClass.style,CS_HREDRAW or CS_VREDRAWmovstWndClass.lpfnWndProc,offset _ProcWinMainmovstWndClass.hbrBackground,COLOR_WINDOW + 5movstWndClass.lpszClassName,offset szClassNameinvokeRegisterClass

18、Ex,addr stWndClass ; 建立并显示窗口invokeCreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szClassName,WS_OVERLAPPEDWINDOW,100,100,550,570, ;窗口显示的尺寸和位置NULL,NULL,hInstance,NULLmovhWinMain,eaxinvokeShowWindow,hWinMain,SW_SHOWNORMALinvokeUpdateWindow,hWinMain ; 消息循环.whileTRUEinvokeGetMessage,addr stMsg,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论