基于WindowsCE系统的模拟时钟设计
- 格式:doc
- 大小:24.50 KB
- 文档页数:2
基于Windows CE系统的模拟时钟设计
侯秋华;刘炜
【期刊名称】《电子世界》
【年(卷),期】2012(000)018
【摘要】本文介绍了一种基于Windows CE 6.0操作系统的模拟时钟的设计方法,该设计以三星公司的S3C2440为核心,基于MFC编程,实现了钟面上时分秒针
的实时显示.本设计编译生成的.exe文件可做为Windows CE系统的一个应用程序使用.
【总页数】3页(P97-98,99)
【作者】侯秋华;刘炜
【作者单位】北方民族大学电气信息工程学院;北方民族大学电气信息工程学院【正文语种】中文
【相关文献】
1.基于SPCE061A单片机的多功能实时时钟系统的设计 [J], 谷瑞光;檀业健
2.基于LabWindows CVI和Access的学生成绩管理系统的设计 [J], 王瑜;闫沫
3.基于Windows CE模拟器的GPS定位程序设计 [J], 王浩
4.嵌入式 Windows CE 系统下基于 LabVIEW Mobile模块的储液罐监控系统快速设计 [J], 潘世豪;王瑞波;王君丽;王永庆
5.基于Windows CE与FP GA的空情模拟系统的设计 [J], 关进辉;石春和;赵寰
因版权原因,仅展示原文概要,查看原文内容请购买。
《基于Windows CE数控系统软件的设计与实现》一、引言随着现代工业自动化技术的飞速发展,数控系统作为制造业中不可或缺的组成部分,其重要性和应用范围日益扩大。
Windows CE作为一种专为嵌入式系统设计的操作系统,具有体积小、运行效率高、可定制性强等特点,广泛应用于数控系统软件的开发中。
本文将详细介绍基于Windows CE数控系统软件的设计与实现过程。
二、系统需求分析在系统设计之初,我们首先需要对数控系统软件的需求进行深入分析。
需求分析包括明确系统的功能需求、性能需求以及用户界面需求等。
功能需求主要涉及数控系统的基本操作,如加工路径规划、机床控制、参数设置等;性能需求则关注系统的响应速度、稳定性以及数据处理能力;用户界面需求则要求软件界面友好、操作便捷。
三、系统设计根据需求分析结果,我们进行系统设计。
设计阶段主要包括总体架构设计、模块划分、数据库设计以及界面设计等。
1. 总体架构设计:采用模块化设计思想,将系统划分为多个功能模块,如加工模块、控制模块、通信模块等。
每个模块负责特定的功能,便于后期维护和升级。
2. 模块划分:根据功能需求,将系统划分为若干个功能模块。
每个模块内部实现特定的功能,模块之间通过接口进行通信,实现信息的传递和共享。
3. 数据库设计:为了实现对加工参数、机床状态等数据的存储和管理,需要设计相应的数据库。
数据库应具备高可靠性、高效率和可扩展性等特点,以便支持大量数据的存储和查询。
4. 界面设计:界面设计应遵循简洁、直观、易操作的原则,使用户能够快速上手并方便地进行操作。
同时,界面应具备良好的交互性,以便用户能够及时获取系统状态和操作反馈。
四、系统实现在系统实现阶段,我们根据设计阶段的结果,使用C、C++等编程语言,结合Windows CE开发环境,进行具体的编程实现。
1. 编程语言选择:C和C++是Windows CE开发中常用的编程语言。
C具有语法简单、易于上手的特点,而C++则具有强大的功能扩展性和灵活性。
在Windows CE .NET 4.1 平台上实现坚固的Windows CE 计时器发布日期:11/10/2004 | 更新日期:11/10/2004Michel VerhagenMicrosoft Windows Embedded MVPPTS Software, The Netherlands适用于:Microsoft Windows CE .NET 4.1摘要本文为系统开发人员提供了使用仅限于软件的解决方案在 Windows CE 平台上实现坚固的CE 计时器的指导原则。
本页内容简介QueryPerformanceCounter对计时器进行重新编程关于作者缩略语和术语简介Windows CE .NET 是来自Microsoft 的嵌入式组件化OS,它具有1 微秒(ms) 的内部计时器信号分辨率。
对于大多数项目而言,2 ms 的精确度就足够了,但某些项目却需要较高分辨率的非阻塞计时器。
CE API 没有提供此类现成功能,但通过对OAL 加以略微修改,我们可以获得分辨率高于2ms 的坚固的非阻塞计时器。
返回页首QueryPerformanceCounterWindows 确实通过QueryPerformanceCounter API 为高分辨率计时器提供了现成的解决方案。
如果您必须延迟一小段时间,则使用该API 非常有效,但如果您希望等待一小段时间,又该如何呢?延迟和等待之间的差别在于:延迟比等待消耗更多的CPU 时间。
等待意味着系统中的其他(优先级较低或相等的)线程可以在等待期间执行。
LARGE_INTEGER liDelay;// Query number of ticks per secondif (QueryPerformanceFrequency(&liDelay)){// 1ms delayliDelay.QuadPart /= 1000;LARGE_INTEGER liTimeOut;// Get current ticksif (QueryPerformanceCounter(&liTimeOut)){// Create timeout valueliTimeOut.QuadPart += liDelay.QuadPart;LARGE_INTEGER liCurrent;do{// Get current ticksQueryPerformanceCounter(&liCurrent);// Delay until timeout} while (liCurrent.QuadPart<liTimeOut.QuadPart);}}以最高优先级(优先级0)运行上述代码将在延迟期间阻塞整个OS。
基于WindowsCE系统的模拟时钟设计作者:侯秋华刘炜来源:《电子世界》2012年第18期【摘要】本文介绍了一种基于Windows CE 6.0操作系统的模拟时钟的设计方法,该设计以三星公司的S3C2440为核心,基于MFC编程,实现了钟面上时分秒针的实时显示。
本设计编译生成的.exe文件可做为Windows CE系统的一个应用程序使用。
【关键词】ARM;S3C2440;Windows CE;模拟时钟1.引言随着科学技术的发展,嵌入式设备广泛应用于商业管理和工业控制等领域。
本设计以ARM9嵌入式微处理器S3C2440为核心,基于MFC编程,在开发板的液晶显示屏上显示模拟时钟,实现了时分秒针的实时显示。
2.硬件平台本设计以ARM9嵌入式微处理器S3C2440开发板为核心,主要利用S3C2440内置的RTC 模块,通过读取系统时间来实时绘制时针,实现模拟时钟的实时走动。
3.软件设计3.1 对话框设计建立工程之后,在Resource View中设计模拟时钟的界面,选定一个与S3C2440触摸屏相符的对话框界面。
模拟时钟的显示用程序实现,在对话框下方放置从Toolbox中选择的控件。
本设计总共用到九个控件:对话框控件,显示时分秒的静态文本控件,用于显示数字的动态控件,更改时间的控件和确定控件等。
3.2 程序设计首先添加一个OnTimer()函数读取系统时间并用作计时器的消息处理函数,用于通知moniDlg类中的画表盘刻度和指针的函数重新绘图。
添加设置时间按钮函数,用于导出软键盘,设置时间;确认按钮函数用于关闭软键盘,此时屏幕刷新。
3.2.1 表盘刻度画法在moniDlg类中添加画表盘刻度的函数。
程序创建两种画笔,设置不同的颜色和粗细,来区分整点时刻和分点时刻。
由于S3C2440开发板显示屏默认的原点在左上角,根据S3C2440触摸屏的大小确定圆心位置,这样就确定了表盘的位置,表盘上的刻度都在以圆心为中心的圆环上。
以下是一个简单的使用Python和turtle库来创建一个模拟时钟的代码。
这个时钟将显示当前的时间,并且每秒更新一次。
python复制代码import turtleimport timewin = turtle.Screen()win.setup(width=600, height=600)win.bgcolor("black")# 创建一个新的Turtle对象clock_turtle = turtle.Turtle()clock_turtle.hideturtle()# 循环每秒更新一次时间while True:# 获取当前时间current_time = time.strftime("%H:%M:%S")# 清空屏幕win.clear()# 画时钟的边框clock_turtle.penup()clock_turtle.goto(-200, -200)clock_turtle.pendown()clock_turtle.circle(400)# 画时钟的小时数clock_turtle.penup()clock_turtle.goto(-100, -150)clock_turtle.pendown()clock_turtle.setheading(0)clock_turtle.forward(200)clock_turtle.setheading(90)clock_turtle.forward(100)clock_turtle.setheading(180)clock_turtle.forward(200)clock_turtle.setheading(270)clock_turtle.forward(100)# 画时钟的分钟数clock_turtle.penup()clock_turtle.goto(-50, -150)clock_turtle.pendown()clock_turtle.setheading(0)clock_turtle.forward(150)clock_turtle.setheading(90)clock_turtle.forward(100)clock_turtle.setheading(180)clock_turtle.forward(150)clock_turtle.setheading(270)clock_turtle.forward(100)# 画时钟的秒钟数clock_turtle.penup()clock_turtle.goto(0, -150)clock_turtle.pendown()clock_turtle.setheading(0)clock_turtle.forward(120)clock_turtle.setheading(90)clock_turtle.forward(100)clock_turtle.setheading(180)clock_turtle.forward(120)clock_turtle.setheading(270)clock_turtle.forward(100)# 显示时间文本clock_turtle.penup()clock_turtle.goto(-150, -80)clock_turtle.pendown()clock_turtle.color("white")clock_turtle.write(current_time, font=("Arial", 24, "normal")) # 显示时间文本,字体大小为24,正常样式显示文本。
《Windows CE嵌入式系统》课程设计报告题目:Windows CE设备应用程序开发——图像处理专业名称:电子信息工程班级:学号:姓名:二零一零年五月Windows CE设备应用程序开发——图像处理中文摘要:众所周知图像处理在我们的生活中演绎着重要的角色,而基于windows mobile操作系统的图像处理软件相对较少,毫无疑问手机上的应用软件可以带给我们更大的方便,本设计就是基于Visual Studio2005环境中语言开发出来适合在手机上运行的图像处理软件,可以对特定的图像进行特殊处理,使图像显得更加生动、有趣。
关键词:浮雕柔化反转 1.1.1设计环境Windows XPVisual Studio20051.1.2设计目标利用Visual Studio 2005开发出适合在有windows mobile操作系统手机上运行的图像处理软件,软件应包括对图像的浮雕、柔化、反转等处理;为人们的生活提供方便。
1.2设计过程1.2.1浮雕处理在图像中烘托图形的边缘,淡化平淡区就产生了浮雕的效果。
要实现浮雕效果,可以用像素及其相邻像素之间的差值来替换该像素的值。
对于图像中的边缘,差值较大,产生的效果变得比较突出,而对于图像中的平坦部分,差值很小接近于0,图像变的很黑而看不清一次在算法中给每个差值加上一个常数,使图像整体变亮。
设计代码如附件中的浮雕处理部分;运行后的效果如下:1.2.2柔化处理柔化后图像比原图更加柔和,有点像降低图像的对比度效果。
要实现柔化,可以用像素周围相邻像素的平均值作为该图像的新值,即可减少像素间的差别,从而带到柔化的效果。
例如,相邻像素的访问可以取3*3像素块,计算平均值时,用像素块的9哥像素计算平均。
若要增加柔化效果可取较大的像素块。
设计代码如附件中的柔化处理部分;运行后的效果如下:1.2.3发转处理反转处理就是将图像中的每个像素的颜色改为其互补色。
例如,黑色的互补色为白色,彩色的互补色是将其红、绿、蓝三色分别计算互补色。
《基于Windows CE数控系统软件的设计与实现》一、引言随着制造业的快速发展,数控系统在工业生产中扮演着越来越重要的角色。
Windows CE作为一种专为嵌入式系统设计的操作系统,具有体积小、功耗低、运行稳定等优点,被广泛应用于数控系统软件开发中。
本文将详细介绍基于Windows CE数控系统软件的设计与实现过程。
二、系统需求分析在开始设计之前,我们需要对数控系统软件的需求进行详细的分析。
这些需求包括但不限于:系统的稳定性、可扩展性、用户界面友好性、硬件兼容性等。
同时,还需要考虑到数控系统的具体应用场景,如加工中心、车床、铣床等。
通过对这些需求的深入分析,我们可以为后续的设计和实现工作提供明确的指导。
三、系统设计1. 整体架构设计:基于Windows CE的数控系统软件整体架构包括硬件层、操作系统层、应用软件层和用户界面层。
硬件层负责与数控机床的硬件设备进行通信;操作系统层为Windows CE;应用软件层负责实现数控系统的核心功能;用户界面层则提供友好的操作界面。
2. 数据库设计:为满足数控系统的数据管理需求,我们需要设计一套合适的数据库系统。
该数据库应能存储加工工艺、设备参数、产品信息等数据,并支持数据的查询、修改、删除等操作。
3. 模块化设计:为提高系统的可维护性和可扩展性,我们采用模块化设计方法。
将系统划分为若干个功能模块,每个模块负责实现特定的功能,模块之间通过接口进行通信。
四、系统实现1. 开发环境搭建:在搭建开发环境时,我们需要安装Windows CE操作系统、开发工具(如Visual Studio)以及必要的驱动程序和库文件。
2. 硬件通信:通过编写驱动程序或使用现有的通信协议,实现数控系统软件与硬件设备的通信。
这包括与PLC(可编程逻辑控制器)、伺服电机、传感器等设备的通信。
3. 功能实现:根据需求分析结果和整体架构设计,实现数控系统的各项功能。
这包括加工工艺管理、设备参数设置、产品信息查询、程序编辑等。
案例五模拟时钟应用程序以实例为背景学习基于MFC的WINDOWS应用程序设计,编写一个模拟时钟程序,此程序在屏幕左边有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。
用菜单选项或按钮设置时间和秒表。
时间不必与机器系统时间相同,可任意设置。
模拟时钟示意图1 编程要求(1)为该程序设计一个美观大方的图标。
(2)程序界面设计合理,色彩得体大方,显示正确。
(3)时针、分针和秒针形象美观,即使各指针重合也可辨认。
(4)各指针运动规律正确。
为便于演示,时钟速度应比实际时间快20倍,即1小时相当于3分钟。
(5)数字式时钟的时间显示与指针式时钟显示一致。
(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前的时间和日期。
(7)按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。
再次按下秒表控制按钮后计时停止,该窗口显示累计时间。
2 问题分析本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。
指针运动算法和屏幕重绘方法是本程序主要难点所在。
不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。
三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指针的运动。
若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。
采用一个定时器消息可以很容易实现指针联动算法。
由于屏幕的重绘速度很快(50 ms一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
《基于Windows CE数控系统的运动与PLC控制器的设计与实现》一、引言随着工业自动化技术的快速发展,数控系统在制造业中扮演着越来越重要的角色。
Windows CE数控系统以其强大的功能、灵活的配置和友好的界面,逐渐成为现代制造业的首选。
本文将详细介绍基于Windows CE数控系统的运动与PLC控制器的设计与实现过程。
二、系统概述本系统基于Windows CE操作系统,结合数控技术和PLC控制技术,实现机床的精确运动控制和自动化生产。
系统主要由运动控制模块、PLC控制器模块、人机交互界面以及通信模块等部分组成。
三、运动控制模块设计1. 硬件设计:运动控制模块主要包括电机驱动器、传感器、执行器等硬件设备。
电机驱动器负责驱动机床的运动,传感器用于检测机床的实时状态,执行器则根据控制指令进行动作。
2. 软件设计:软件部分主要负责控制算法的实现。
通过编写控制程序,实现对机床的精确运动控制。
同时,软件还需与PLC 控制器进行通信,实现数据共享和协同工作。
四、PLC控制器模块设计1. 硬件设计:PLC控制器模块主要包括CPU、内存、输入输出接口等硬件设备。
CPU负责执行程序指令,内存用于存储程序和数据,输入输出接口则用于与外部设备进行通信。
2. 软件设计:软件部分主要包括PLC编程软件和控制程序。
编程软件用于编写和控制PLC的逻辑程序,控制程序则根据机床的运动状态和工艺要求,对PLC进行控制。
五、人机交互界面设计人机交互界面是系统的重要组成部分,主要用于显示机床的实时状态和接收操作人员的指令。
界面设计应考虑到易用性、直观性和灵活性等因素,以提供良好的用户体验。
六、通信模块设计通信模块负责系统各部分之间的数据传输和通信。
采用适当的通信协议和接口,确保数据传输的可靠性和实时性。
同时,还需考虑通信速度和抗干扰能力等因素,以满足工业现场的需求。
七、系统实现1. 硬件实现:根据设计要求,选择合适的硬件设备,完成电路板的制作和组装。
基于Win CE的嵌入式虚拟仪表显示系统研制摘要:本文研究和设计一种能够应用在WinCE设备平台的OBD 汽车虚拟仪表方案,将OBD的诊断结果以虚拟仪表图形的方式在WinCE平台上显示。
通过对OBD系统所使用的通信协议、九种诊断模式,以及WinCE平台的系统架构和应用程序结构的研究,为设计方案打下基础。
关键词:车载诊断系统WINCE 汽车虚拟仪表OBD是英文On Board Diagnostics的缩写,中文翻译为“车载诊断系统”[1],装载OBD协议的汽车能够自动监测汽车各项运行参数,具有很高的安全性。
WindowsCE是微软公司嵌入式、移动计算平台的基础,它是一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它是精简的Windows 95,Windows CE的图形用户界面相当出色。
本文介绍一种能够应用在WinCE设备平台的OBD汽车虚拟仪表设计方案。
1 需求分析与总体设计OBD系统能够输出汽车ECU(Electronic Control Unit)电子控制单元通过车载传感器获得的燃油系统、温度系统、点火系统、动力系统以及废气控制辅助装置系统运行状态数据,在发生故障的情况下则输出故障码。
硬件设计方面,设计了以ELM327为主控芯片的硬件连接电路和以PL2303芯片为主控芯片的电平转换电路,扩展OBD接口的功能,与OBD接口通信,解析报文数据流,将OBD接口输出信号转换为WinCE 平台设备能够识别的信号并输入。
软件设计方面,本文具体阐述了在WinCE SDK环境下开发的设计方案。
采用模块化的设计方法,将虚拟仪表软件分为通信初始化模块、OBD数据解析模块、计算与显示模块进行设计和研究,实现了将发动机状态、发动机转速、当前时速、剩余油量、发动机温度等行车信息在WinCE平台上以汽车虚拟仪表图形显示。
2 硬件连接器设计2.1 连接器设计连接器的作用时信号转换,因为系统终端与ECU的通信码均为串口信号,只是与RS-232标准串口信号的电压不同,标准串口信号的“1”用-12V表示,“0”用+12V表示,而K线的“0”用0~1.3V表示,“1”用12V表示,所以需要设计一块转换卡,把K线的串口信号转换为标准的串口信号,即可实现利用计算机串口来读取嵌入式系统终端与ECU 的通信码。
《基于Windows CE数控系统的运动与PLC控制器的设计与实现》一、引言随着制造业的快速发展,数控系统在自动化生产线上扮演着越来越重要的角色。
而基于Windows CE数控系统的运动与PLC 控制器的设计与实现,更是成为了现代制造业的关键技术之一。
本文将详细介绍该系统的设计思路、实现方法以及应用效果。
二、系统设计1. 运动控制设计运动控制是数控系统的核心部分,主要涉及到电机驱动、传感器检测以及运动轨迹规划等方面。
在Windows CE数控系统中,我们采用了高性能的电机驱动器和传感器,配合精确的运动控制算法,实现了高精度的运动控制。
同时,我们利用了多线程技术,使得运动控制和系统界面能够并行工作,提高了系统的响应速度。
2. PLC控制器设计PLC控制器是实现自动化生产线的关键部分。
在Windows CE数控系统中,我们采用了先进的PLC控制器设计理念,实现了高度的可配置性和可扩展性。
我们采用了模块化设计,将PLC 控制器的各个功能模块化,使得系统在满足基本功能的同时,还能根据实际需求进行定制化开发。
此外,我们还采用了实时操作系统,保证了PLC控制器的实时性和稳定性。
三、实现方法1. 硬件实现在硬件方面,我们选用了高性能的处理器、内存和存储设备,以保证系统的运行速度和数据处理能力。
同时,我们还选用了高精度的电机驱动器和传感器,以确保运动控制的精度和稳定性。
此外,我们还采用了工业级的设计和制造工艺,保证了系统的可靠性和稳定性。
2. 软件实现在软件方面,我们采用了Windows CE操作系统作为系统的核心平台。
我们根据实际需求,开发了相应的驱动程序和应用程序,实现了运动控制和PLC控制器的功能。
同时,我们还采用了图形化界面设计,使得操作人员能够直观地了解系统的工作状态和运行情况。
此外,我们还开发了相应的调试和维护工具,方便操作人员进行系统的调试和维护。
四、应用效果基于Windows CE数控系统的运动与PLC控制器的设计与实现,在实际应用中取得了显著的效果。
用C++编写的仿WINDOWS窗体时钟程序发表日期:2004年4月11日出处:eastboy 作者:eastboy 已经有1235位读者读过此文这是我在大学里学习C++时的课程设计,具有以下特点:1)仿WINDOWS界面,但无鼠标操作2)具整点报时功能,几点报几声3)可设置时间和日期当然还有一些地方做得不行,比如输入时的光标闪烁,放在这里的目的就是与大家共同学习,欢迎批评指正。
程序中注释的地方不是很多,但是我相信各位还是能看得明白的,呵呵!本人在此声明:此程序为本人原创,请还在上学的朋友勿抄袭!发表此程序完全为了交流经验,互相学习、探讨之用。
非常希望大家给我能提出宝贵意见。
源代码:/*******************************//* 时钟源程序 *//* 仿WINDOWS界面设计 *//* Turboc3下调试通过 *//* 包含两个源文件: *//* clock.cpp win.cpp *//*******************************/#include"stdio.h"#include"stdlib.h"#include"conio.h"#include"time.h"#include"string.h"#include"math.h"#include"dos.h"#include"bios.h"#include"win.cpp" //调用窗体显示#define TRUE 1#define FALSE 0#define PI 3.1415926void cursor(int x,int y) //光标{int count=0;while(count<=10){delay(20);count++;if(count<=5)setcolor(9);elsesetcolor(7);line(x,y,x,y+12);line(x+1,y,x+1,y+12);}}int keyscancode() //检测按键{int key;while(bioskey(1)==0) return 0;key=bioskey(0);key=key&0xff ? key&0xff:key;return(key);}void message(int x,int y,int n) //状态栏信息{char *msg[6]={"Press ESC to quit clock.", "Press T or t to set time.","Press D or d to set date.","Press ESC to cancel set.","Press Enter to confirm set.","Press BackSpace to delete a number."};setfillstyle(SOLID_FILL,LIGHTGRAY);bar(x,y,x+50*8,y+12);setcolor(10);outtextxy(x,y+2,msg[n]);}class CLOCK:public WIN //定义CLOCK为WIN的继承类{int hour,min,sec;int year,mon,day;int x,y,radio;float ak,aj,ai;int xs,ys,xm,ym,xh,yh;public:CLOCK(char *,int,int,int,int);int isleapyear(int);int isweek(int,int);void showclock();void runclock();void setclock();void inittodaydate();void initnowtime();void showdate();void hidedate();void pip();void showtime();void setdates();};//构造函数CLOCK::CLOCK(char *n,int a,int b,int c,int d):WIN(n,a,b,c,d){ x=a+130;y=b+155;radio=120;}int CLOCK::isleapyear(int year) //判断是否闰年{if(year%100!=0&&year%4==0)return TRUE;if(year%400==0)return TRUE;return FALSE;}int CLOCK::isweek(int year,int mon) //计算year年mon月1号的星期数{int days=0,week=0;int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};if(isleapyear(year)) month[1]=29;else month[1]=28;for(int i=1;i<year;i++){days=365;if(isleapyear(i)) days=366;week=(days+week)%7;}for(i=0;i<mon-1;i++)week=(month[i]+week)%7;return week;}void CLOCK::setdates() //设置日期{struct date set;int key=0,count=0,index=0;int textx=x+140,texty=y+42,tcnt=0;char text[2];int dateset[10];setfillstyle(SOLID_FILL,LIGHTGRAY);bar(textx,texty,textx+150,texty+12);do{message(80+6,380-12,index+3);count++;index=count/10;if(count==29) count=0;runclock();key=keyscancode();cursor(textx,texty);if((key>='0'&&key<='9')&&tcnt!=10){ //限制按键,防止误操作if(tcnt<4||(tcnt==5&&key<='1')||((tcnt==6&&dateset[tcnt-1]==1&&key<='2')||(tcnt==6&&da teset[tcnt-1]==0))||(tcnt==8&&key<='3')||(tcnt==9)){sprintf(text,"%c",key);text[1]='\0';setcolor(LIGHTBLUE);outtextxy(textx,texty+2,text);dateset[tcnt]=key-'0';textx+=10;tcnt++;if((tcnt==4||tcnt==7)&tcnt!=10){outtextxy(textx,texty+2,"-");textx+=10;tcnt++;}}}if(key==8&&tcnt>0){if(tcnt==5||tcnt==8){tcnt-=2;textx-=20;}else{tcnt--;textx-=10; }setfillstyle(SOLID_FILL,LIGHTGRAY);bar(textx,texty,textx+8,texty+12);}}while(key!=13&&key!=27);if(key==27) return; //如果是ESC键,则退出设置if(key==13) //如果ENTER键,则设置日期{set.da_year=dateset[0]*1000+dateset[1]*100+dateset[2]*10+dateset[3];set.da_mon=dateset[5]*10+dateset[6];set.da_day=dateset[8]*10+dateset[9];setdate(&set);}}void CLOCK::setclock() //设置时间{struct time set;int key=0,count=0,index=0;int textx=x+140,texty=y+6,tcnt=0;char text[2];int timeset[8];setfillstyle(SOLID_FILL,LIGHTGRAY);bar(textx,texty,textx+150,texty+12);do{message(80+6,380-12,index+3);count++;index=count/10;if(count==29) count=0;key=keyscancode();cursor(textx,texty);if((key>='0'&&key<='9')&&tcnt!=8){ //限制按键,防止误操作if((tcnt==0&&key<='2')||((tcnt==1&&key<='3'&×et[tcnt-1]==2)||(tcnt==1&×et[t cnt-1]!=2))||(tcnt==3&&key<='5')||(tcnt==6&&key<='5')||tcnt==4||tcnt==7){sprintf(text,"%c",key);text[1]='\0';setcolor(9);outtextxy(textx,texty+2,text);timeset[tcnt]=key-'0';textx+=10;tcnt++;if((tcnt==2||tcnt==5)&&tcnt!=8) {outtextxy(textx,texty+2,":");textx+=10;tcnt++;}}}if(key==8&&tcnt>0){if(tcnt==3||tcnt==6){tcnt-=2;textx-=20;}else{tcnt--;textx-=10;}setfillstyle(SOLID_FILL,LIGHTGRAY);bar(textx,texty,textx+8,texty+12);}}while(key!=13&&key!=27);if(key==27) return;if(key==13){set.ti_hour=timeset[0]*10+timeset[1];set.ti_min=timeset[3]*10+timeset[4];set.ti_sec=timeset[6]*10+timeset[7];settime(&set);}}void CLOCK::showdate() //在窗体上显示日期{char nowdate[15];char days[4];char *week[7]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};int dayx=x+135,dayy=y-88,todayweek=0,control;struct date d;getdate(&d);setcolor(12);for(int i=0;i<7;i++)outtextxy(x+i*8*4+135,y-100,week[i]);todayweek=isweek(d.da_year,d.da_mon); // 得到本月1号的星期数 if(todayweek+1!=7)for(i=1;i<=todayweek+1;i++) dayx=dayx+4*8;control=todayweek+1;if(isleapyear(d.da_year)) month[1]=29;else month[1]=28;setcolor(11);for(i=1;i<=month[d.da_mon-1];i++){control++;sprintf(days,"%3d",i);if(i==d.da_day) setcolor(LIGHTMAGENTA);outtextxy(dayx,dayy,days);setcolor(11);dayx=dayx+4*8;if(control%7==0) { dayx=x+135; dayy=dayy+12; } }todayweek=(todayweek+day)%7; //得到今天的星期数sprintf(nowdate,"%04d-%02d-%02d %s",d.da_year,d.da_mon,d.da_day, week[todayweek]);nowdate[14]='\0';setcolor(LIGHTBLUE);outtextxy(x+185,y-120,nowdate);if(d.da_year!=year||d.da_mon!=mon||d.da_day!=day) //如果日期改变了,则先隐藏日期,再显示hidedate();}void CLOCK::hidedate() //隐藏日期{inittodaydate();setfillstyle(SOLID_FILL,LIGHTGRAY); //抹去日期,如果日期改变了bar(x+135,y-90,x+135+6*8*4+3*8,y-90+12*6);bar(x+165,y-122,x+170+16*8+10,y-112);}void CLOCK::showtime() //显示时间{char nowtime[9];sprintf(nowtime,"%02d:%02d:%02d",hour,min,sec);nowtime[8]='\0';setcolor(14);outtextxy(x-30,y+82,nowtime);ak=(90+30*(12-hour)-min*5/60.*6)*PI/180; //时针角度aj=(90+6*(60-min))*PI/180; //分针角度ai=(90+6*(60-sec))*PI/180; //秒针角度xs=x+cos(ai)*(radio-10);ys=y-sin(ai)*(radio-10);xm=x+cos(aj)*(radio-25);ym=y-sin(aj)*(radio-25);xh=x+cos(ak)*(radio-45);yh=y-sin(ak)*(radio-45);setcolor(RED); //画时针setlinestyle(0,0,THICK_WIDTH);line(x-cos(ak)*(radio-118),y+sin(ak)*(radio-118),xh,yh);setlinestyle(0,0,NORM_WIDTH); //画时针在钟面上指示位置circle(x+cos(ak)*radio,y-sin(ak)*radio,2);setcolor(LIGHTGREEN);circle(x+cos(aj)*radio,y-sin(aj)*radio,2); //画分针在钟面上的指示位置line(x-cos(aj)*(radio-115),y+sin(aj)*(radio-115),xm,ym); //画分针setcolor(LIGHTBLUE);line(x-cos(ai)*(radio-110),y+sin(ai)*(radio-110),xs,ys); //画秒针circle(x+cos(ai)*radio,y-sin(ai)*radio,2); //画秒针在钟面上的指示位置}void CLOCK::runclock() //运行时钟{int h,m,s;float ah;struct time tim;gettime(&tim);s=tim.ti_sec;m=tim.ti_min;h=tim.ti_hour;ah=(90+30*(12-h)-m*5/60.*6)*PI/180;showdate();showtime();delay(200);nosound();if(ah!=ak) {setcolor(LIGHTGRAY);setlinestyle(0,0,THICK_WIDTH);line(x-cos(ak)*(radio-118),y+sin(ak)*(radio-118),xh,yh);setlinestyle(0,0,NORM_WIDTH);if(hour%5==0) setcolor(YELLOW);circle(x+cos(ak)*radio,y-sin(ak)*radio,2);setcolor(LIGHTGRAY);hour=h;}if(m!=min) {setcolor(LIGHTGRAY);line(x-cos(aj)*(radio-115),y+sin(aj)*(radio-115),xm,ym);if(min%5==0) setcolor(YELLOW);circle(x+cos(aj)*radio,y-sin(aj)*radio,2);min=m;}if(s!=sec) {setfillstyle(SOLID_FILL,LIGHTGRAY);bar(x-30,y+80,x-30+8*8,y+80+8);setcolor(LIGHTGRAY);if(sec%5==0) setcolor(YELLOW);circle(x+cos(ai)*radio,y-sin(ai)*radio,2);setcolor(LIGHTGRAY);line(x-cos(ai)*(radio-110),y+sin(ai)*(radio-110),xs,ys);sec=s;if(hour>=12) //整点报时h=hour-12;elseh=hour;if(min==59&&sec>=60-h)sound(392);if(min==00&&sec==00)sound(784);}showclock();}void CLOCK::inittodaydate() //初始化今天的日期{struct date initdate;getdate(&initdate);year=initdate.da_year;mon=initdate.da_mon;day=initdate.da_day;}void CLOCK::initnowtime() //初始化时间{struct time inittime;gettime(&inittime);hour=inittime.ti_hour;min=inittime.ti_min;sec=inittime.ti_sec;}void CLOCK::showclock() //显示时钟{float alpha;int x0,y0,i;char s[3];for(i=60;i>=1;i--) //显示钟面上数字{alpha=(90+6*(60-i))*PI/180;x0=x+cos(alpha)*radio;y0=y-sin(alpha)*radio;setcolor(14);if(i%5==0){circle(x0,y0,2);sprintf(s,"%d",i/5);outtextxy(x+cos(alpha)*(radio-10)-4,y-sin(alpha)*(radio-10)-2,s);}elsecircle(x0,y0,1);}}void about(int x,int y,int index) //关于与帮助信息{int i=0,t=0;char *abouttext[]={"You can get message from"," the status bar at the ","bottom.","When you set time,you just","input like this:080819.","The symbol ':' isn't needed.","Set date is the same.","This clock is designed by"," Nie Shiqiu.(C99102-07)", "I'm very interested in C/C++","This is my course design."};setfillstyle(SOLID_FILL,LIGHTGRAY);bar(x,y,x+27*8+6,y+4*12);t=index-3;if(index<4){y=y+(3-index)*12;t=0;}for(i=t;i<=index;i++){if(i<11){if(i==8) setcolor(RED); //名字着重显示else setcolor(LIGHTBLUE);outtextxy(x+2,y+2,abouttext[i]);}y+=12;}}void main() //主程序{int driver=DETECT,mode;int exitflag=FALSE,key,index=0,count=0,aboutindex=0,acnt=0;WIN winCLK("Clock",80,80,570,385); //创建窗体CLOCK c1("Clock",80,80,570,385);initgraph(&driver,&mode,"");winCLK.Form(FALSE);c1.showclock();c1.initnowtime();do{about(342,80+185+44,aboutindex);acnt++;aboutindex=acnt/10;if(acnt==139) acnt=0;message(80+6,380-12,index);count++;index=count/10;if(count==29) count=0;key=keyscancode();c1.runclock();if(key==27) exitflag=TRUE; //按ESC退出if(key=='T'||key=='t') {c1.showtime();c1.setclock();}if(key=='D'||key=='d') {c1.setdates();}}while(exitflag==FALSE);winCLK.draw_closebutton(570-18,80+4,BLACK,TRUE);delay(300);closegraph();}/*******************//* 窗体文件 win.cpp*//*******************/#include"graphics.h"#define TRUE 1#define FALSE 0class WIN{char title[20];protected:int left,top,right,bottom;public:WIN(char *n,int a,int b,int c,intd){strcpy(title,n);left=a;top=b;right=c;bottom=d;}void draw_minbutton(int left,int top,int color,int state);void draw_maxbutton(int left,int top,int color,int state);void draw_closebutton(int left,int top,int color,int state);void Form(int);void Button(int,int,int,int,int);void line3d(int,int,int,int,int);void Frame(int,int,int,int,char *);};void WIN::Frame(int left,int top,int right,int bottom,char *s){line3d(left,top+2,right,top+2,FALSE);line3d(left,top+3,left,bottom,FALSE);line3d(left,bottom,right,bottom,FALSE);line3d(right,top+2,right,bottom,FALSE);bar(left+4,top,left+4+8*strlen(s)+4,top+8);setcolor(10);outtextxy(left+5,top,s);}void WIN::line3d(int left,int top,int right,int bottom,int state) /*画有凹凸感的线条函数*/{if(state==FALSE){setcolor(0);line(left,top,right,bottom);setcolor(15);if(top==bottom){line(left,top+1,right,bottom+1);}if(left==right){line(left+1,top,right+1,bottom);} }else{ setcolor(15);line(left,top,right,bottom);setcolor(0);if(top==bottom){line(left,top+1,right,bottom+1);}if(left==right){line(left+1,top,right+1,bottom);} }}void WIN::Form(int state){Button(left,top,right,bottom,state);setfillstyle(1,1);bar(left+2,top+2,right-2,top+20);setcolor(YELLOW);circle(left+12,top+12,8);line(left+12,top+12,left+12,top+4);line(left+12,top+12,left+16,top+12);outtextxy(left+16+10,top+8,title);draw_minbutton(right-16*3-4,top+4,BLACK,FALSE);draw_maxbutton(right-16*2-3,top+4,BLACK,FALSE);draw_closebutton(right-18,top+4,BLACK,FALSE);Frame(left+5,top+25,left+255,top+278,"Time");Frame(left+260,top+25,right-5,top+25+20*6,"Date");line3d(left+280,top+25+20,right-25,top+25+20,FALSE);Frame(left+260,top+150,right-5,top+150+30,"SetTime(T)"); Button(left+265,top+160,right-8,top+150+25,TRUE);Frame(left+260,top+185,right-5,top+185+30,"SetDate(D)"); Button(left+265,top+195,right-8,top+185+25,TRUE);Button(left+4,bottom-20,right-4,bottom-4,TRUE);Frame(left+260,top+185+35,right-5,bottom-27,"About");}void WIN::Button(int left,int top,int right,int bottom,int state) {if(state==-1){setfillstyle(1,7);bar(left,top,right,bottom);}setfillstyle(1,7);bar(left,top,right,bottom);if(state==FALSE){setcolor(15);line(left,top,right,top);line(left,top,left,bottom);setcolor(0);line(left,bottom,right,bottom);line(right,top,right,bottom);setcolor(8);line(left+1,bottom-1,right-1,bottom-1);line(right-1,top+1,right-1,bottom-1);}if(state==TRUE){setcolor(8);line(left,top,right,top);line(left,top,left,bottom);setcolor(15);line(left,bottom,right,bottom);line(right,top,right,bottom);}}void WIN::draw_minbutton(int left,int top,int color,int state) {if(state==FALSE){Button(left,top,left+15,top+15,FALSE);setcolor(color);line(left+3,top+11,left+12,top+11);line(left+3,top+12,left+12,top+12);}else{Button(left,top,left+15,top+15,TRUE);setcolor(color);line(left+3,top+13,left+12,top+13);line(left+3,top+12,left+12,top+12);}}void WIN::draw_maxbutton(int left,int top,int color,int state) {if(state==FALSE){Button(left,top,left+15,top+15,FALSE);setcolor(color);rectangle(left+4,top+4,left+12,top+12);rectangle(left+4,top+5,left+12,top+12);}else{Button(left,top,left+15,top+15,TRUE);setcolor(color);rectangle(left+4,top+4,left+12,top+14);rectangle(left+4,top+3,left+12,top+14);}}void WIN::draw_closebutton(int left,int top,int color,int state) {if(state==FALSE){Button(left,top,left+15,top+15,FALSE);setcolor(color);line(left+4,top+4,left+12,top+12);line(left+5,top+4,left+13,top+12);line(left+4,top+12,left+12,top+4);line(left+5,top+12,left+13,top+4);}else{Button(left,top,left+15,top+15,TRUE);setcolor(color);line(left+4,top+4,left+12,top+12);line(left+5,top+4,left+13,top+12);line(left+4,top+12,left+12,top+4);line(left+5,top+12,left+13,top+4);}}为什么在我的电脑上运行时出现 BGI Error:Graphics not initialized (use 'initgraph') 请问怎样解决?把BGI驱动文件(如egavga.bgi)和编译后的程序拷到同一目录下就行了!写的不错,不过程序的可读性有待提高, 如这一行if(key==27) return; //如果是ESC键,则退出设置如果没有注解,没人知道key==27是在干什么不过我建议作者添加一个宏#define KEY_ESC 27谢谢!当时为了省事,图个简单,就忽略了!呵呵!。
计算机技术基础课程设计C语言设计报告题目:windows模拟时间日期学院:机电工程学院专业:工业工程班级:050109姓名:钱亮指导教师:顾煜新设计时间:2007年1月9日一、题目:windows模拟时间日期二、选题背景这是一个windows的模拟时间日期C程序,它具备了万年历等功能,可以满足我们方便的观看时间和查看日期等要求。
三、设计思路主要通过我们学习过的简单C语言程序,编辑windows的时间和日期程序,方便我们随时观看时间和查看日期等要求。
四、程序流程图五、程序清单#include<graphics.h> #include<stdio.h>#include<math.h>#include<dos.h>#define PI 3.1415926 #define UP 0x4800#define DOWN 0x5000 #define ESC 0x11b#define TAB 0xf09clock();date(int,int);int digitsec(double s)/*digital clock second*/{int i;for(i=0;i<=59;i++) if(s==i) return i;}int digithour(double h)/*digital clock hour*/{int i;for(i=0;i<=23;i++) if(h==i) return i;}int digitmin(double m)/*digital clock minute*/{int i;for(i=0;i<=59;i++) if(m==i) return i;}digitclock(int x,int y,int clock)/*整个digital clock*/{char buffer1[10];setfillstyle(0,2);bar(x,y,x+15,328);if(clock==60) clock=0;sprintf(buffer1,"%d",clock);outtextxy(x,y,buffer1);}cursor(int count) /*画一个光标函数*/ {switch(count){case 1:line(156,108,156,118);break; case 2:line(280,108,280,118);break; case 3:line(424,315,424,325);break; case 4:line(465,315,465,325);break; case 5:line(505,315,505,325);break; }}clear(int count) /*清除光标函数*/ {switch(count){case 2:line(156,108,156,118);break; case 3:line(280,108,280,118);break; case 4:line(424,315,424,325);break; case 5:line(465,315,465,325);break; case 1:line(505,315,505,325);break; }}int key(int,int);int dateupchange(int);int timeupchange(int);int timedownchange(int);double h,m,s;double x,x1,x2,y,y1,y2;char buffer[80];struct time t[1];struct date da[1];main(){int driver, mode=0,i,j;int year,mon;char *month[]={"SUN","MON","TUE","WEN","THU","FRI","SAT"}; driver=DETECT;initgraph(&driver, &mode, "");setlinestyle(0,0,3);setbkcolor(0);setcolor(7);line(82,430,558,430);line(70,62,70,418);line(82,50,558,50);line(570,62,570,418);line(70,62,570,62);line(76,56,297,56);line(340,56,564,56); /*画主体框架*/ setlinestyle(0,0,3);arc(82,62,90,180,12);setlinestyle(0,0,3);arc(558,62,0,90,12);setlinestyle(0,0,3);arc(82,418,180,279,12);setlinestyle(0,0,3);arc(558,418,270,360,12); /*画边角*/ setcolor(15);outtextxy(300,53,"CLOCK"); /*总标题*/setcolor(7);rectangle(80,72,332,360); /*月历的框架*/ rectangle(342,72,560,360); /*时钟的框架*/ for(j=78;j<=84;j+=6)line(80,j,332,j);setwritemode(1);line(190,78,225,78);setwritemode(0);setcolor(15);outtextxy(193,75,"DATE");setcolor(7);rectangle(90,106,160,120);outtextxy(163,110,"(M)"); /*打印月份标题*/ rectangle(190,106,290,120);outtextxy(293,110,"(Y)"); /*打印年标题*/for(i=0,j=90;i<7;i++,j+=35)outtextxy(j,145,month[i]);/*打印周一至周日*/ rectangle(88,140,323,330);line(88,158,323,158);/*月份的框架*/for(j=78;j<=84;j+=6)line(342,j,560,j);setwritemode(1);line(431,78,465,78);setwritemode(0);setcolor(15);outtextxy(433,75,"TIME");/*时钟的标题*/setcolor(7);line(392,310,510,310);line(392,330,510,330);arc(392,320,90,270,10);arc(510,320,270,90,10);for(i=431;i<=470;i+=39)for(j=317;j<=324;j+=7){setlinestyle(0,0,3);circle(i,j,1);} /*DIGITAL CLOCK*/line(156,108,156,118); /*cursor*/for(i=0,m=0,h=0;i<=11;i++,h++){ /*hour points*/x=100*sin((h*60+m)/360*PI)+451;y=200-100*cos((h*60+m)/360*PI);setlinestyle(0,0,3);circle(x,y,1);}for(i=0,m=0;i<=59;m++,i++){ /*minute points*/x=100*sin(m/30*PI)+451;y=200-100*cos(m/30*PI);setlinestyle(0,0,1);circle(x,y,1);}setcolor(9);outtextxy(83,380," CHANGCHUN UNIVERSITY OF TECHNOLOGY"); outtextxy(400,400,"DESIGNED BY lixiang ");outtextxy(500,410,"2005.12");setcolor(15);outtextxy(81,380," CHANGCHUN UNIVERSITY OF TECHNOLOGY"); outtextxy(398,400,"DESIGNED BY lixiang ");outtextxy(498,410,"2005.12");outtextxy(81,410,"Control:TAB,UP,DOWN,ESC"); getdate(da);mon=da[0].da_mon;year=da[0].da_year;date(year,mon);clock();closegraph();return 0;}clock(){int k=0,count;setcolor(15);gettime(t);h=t[0].ti_hour;m=t[0].ti_min;x=50*sin((h*60+m)/360*PI)+451;y=200-50*cos((h*60+m)/360*PI);line(452,200,x,y);x1=80*sin(m/30*PI)+451;y1=200-80*cos(m/30*PI);line(451,200,x1,y1);digitclock(408,318,digithour(h));digitclock(446,318,digitmin(m));setwritemode(1);for(count=2;k!=ESC;){ /*second hand*/setcolor(12);sound(500);delay(70);sound(200);delay(30);nosound();s=t[0].ti_sec;x2=98*sin(s/30*PI)+451;y2=200-98*cos(s/30*PI);line(451,200,x2,y2);s=t[0].ti_sec;while(t[0].ti_sec==s) {gettime(t);/*让时间静止一秒钟!!*/ if(bioskey(1)!=0){k=bioskey(0);count=key(k,count);if(count==6) count=1;} }setcolor(15);digitclock(485,318,digitsec(s)+1);setcolor(12);x2=98*sin(s/30*PI)+451;y2=200-98*cos(s/30*PI);line(451,200,x2,y2);if(t[0].ti_min!=m){ /*minute hand*/setcolor(15);x1=80*sin(m/30*PI)+451;y1=200-80*cos(m/30*PI);line(451,200,x1,y1);m=t[0].ti_min;digitclock(446,318,digitmin(m));x1=80*sin(m/30*PI)+451;y1=200-80*cos(m/30*PI);line(451,200,x1,y1);}if(t[0].ti_hour!=h){ /*hour hand*/ setcolor(15);x=50*sin((h*60+m)/360*PI)+451;y=200-50*cos((h*60+m)/360*PI);line(452,200,x,y);h=t[0].ti_hour;digitclock(408,318,digithour(h));x=50*sin((h*60+m)/360*PI)+451;y=200-50*cos((h*60+m)/360*PI);line(452,200,x,y);}}}date(int year,int month) /*万年历函数*/ {char buffer2[10];int a,b,c,d,e,judge,l;int year3;setcolor(15);year3=year;if(year>=2000) for(a=0,year--;year>=2000;year--) /*计算除当年外有几个闰年*/if((year%4==0&&year%100!=0)||(year%100==0&&year%400==0))a++;year=2000;if(year<2000) for(a=0,year++;year<=2000;year++)if((year%4==0&&year%100!=0)||(year%100==0&&year%400==0))a++;year=year3;if((year%4==0&&year%100!=0)||(year%100==0&&year%400==0))judge=1;/*判断当年是否为闰年*/else judge=0;if(month==1) d=0;if(month==2) d=31;if(month==3&&judge==0) {b=1; d=59+judge;}if(month==3&&judge==1) {b=0; d=59;}if(month==4) d=90+judge;if(month==5) d=120+judge;if(month==6) d=151+judge;if(month==7) d=181+judge;if(month==8) d=212+judge;if(month==9) d=243+judge;if(month==10) d=273+judge;if(month==11) d=304+judge;if(month==12) d=334+judge; /*计算月份的天数差*/ /*计算当月一日是星期几*/if(year<2000) c=((2000-year)*365+a+d)%7;else c=((year-2000)*365+a+d)%7;if(c==0) c=7;if(month==1||month==3||month==5||month==7||month==8||month= =10||month==12)/*判断每月的天数*/e=31;if(month==4||month==6||month==9||month==11)e=30;if(month==2&&judge==0) e=29;if(month==2&&judge==1) e=28;setfillstyle(1,0);bar(90,160,321,328);/*清空前一个月份*/for(l=1,y=162;l<=e;l++,c++){ / *画出月历*/if(c>7) {y+=32;c=1;}sprintf(buffer2,"%d",l);outtextxy((c-1)*35+92,y,buffer2);}setfillstyle(1,0);bar(140,110,155,118);sprintf(buffer2,"%d",month);outtextxy(140,110,buffer2);setfillstyle(1,0);bar(250,110,279,118);sprintf(buffer2,"%d",year);outtextxy(250,110,buffer2);}int key(int key,int count) /*键盘控制 */ {switch(key){case UP:dateupchange(count-1);date(da[0].da_year,da[0].da_mon);timeupchange(count-1);break;case DOWN:datedownchange(count-1);date(da[0].da_year,da[0].da_mon);timedownchange(count-1);break;case TAB:setcolor(15);clear(count);cursor(count);count++;break;}return count;}int dateupchange(int count) {if(count==1) {da[0].da_mon++; if(da[0].da_mon==13) da[0].da_mon=1;}if(count==2) da[0].da_year++; setdate(da);}int datedownchange(int count) {if(count==1) {da[0].da_mon--; if(da[0].da_mon==0)da[0].da_mon=12;}if(count==2) da[0].da_year--; setdate(da);}int timeupchange(int count) {if(count==3) {t[0].ti_hour++; settime(t);}if(count==4) {t[0].ti_min++; settime(t);}if(count==5) {t[0].ti_sec++; settime(t);}}int timedownchange(int count) {if(count==3) {t[0].ti_hour--; settime(t);}if(count==4) {t[0].ti_min--; settime(t);}if(count==5) {t[0].ti_sec--; settime(t);}}六、主要解决问题的方法及技术关键1、要问题解决方法图形界面的绘制问题,主要是运用到C语言库函数自带的绘制图形的函数。
基于WindowsCE系统的模拟时钟设计
【摘要】本文介绍了一种基于Windows CE 6.0操作系统的模拟时钟的设计方法,该设计以三星公司的S3C2440为核心,基于MFC编程,实现了钟面上时分秒针的实时显示。
本设计编译生成的.exe文件可做为Windows CE系统的一个应用程序使用。
【关键词】ARM;S3C2440;Windows CE;模拟时钟
1.引言
随着科学技术的发展,嵌入式设备广泛应用于商业管理和工业控制等领域。
本设计以ARM9嵌入式微处理器S3C2440为核心,基于MFC编程,在开发板的液晶显示屏上显示模拟时钟,实现了时分秒针的实时显示。
2.硬件平台
本设计以ARM9嵌入式微处理器S3C2440开发板为核心,主要利用S3C2440内置的RTC模块,通过读取系统时间来实时绘制时针,实现模拟时钟的实时走动。
3.软件设计
3.1 对话框设计
建立工程之后,在Resource View中设计模拟时钟的界面,选定一个与S3C2440触摸屏相符的对话框界面。
模拟时钟的显示用程序实现,在对话框下方放置从Toolbox中选择的控件。
本设计总共用到九个控件:对话框控件,显示时分秒的静态文本控件,用于显示数字的动态控件,更改时间的控件和确定控件等。
3.2 程序设计
首先添加一个OnTimer()函数读取系统时间并用作计时器的消息处理函数,用于通知moniDlg类中的画表盘刻度和指针的函数重新绘图。
添加设置时间按钮函数,用于导出软键盘,设置时间;确认按钮函数用于关闭软键盘,此时屏幕刷新。
3.2.1 表盘刻度画法
在moniDlg类中添加画表盘刻度的函数。
程序创建两种画笔,设置不同的颜色和粗细,来区分整点时刻和分点时刻。
由于S3C2440开发板显示屏默认的原点在左上角,根据S3C2440触摸屏的大小确定圆心位置,这样就确定了表盘的位置,表盘上的刻度都在以圆心为中心的圆环上。
其坐标可以通过三角函数推导出来。
设圆心坐标为(X,Y),半径为R,表盘上其他点的坐标为(X1,Y1),该点与圆心X轴夹角为A(0~360度),该点坐标为(X1=X+RcosA,Y1=Y+RsinA)。
由于我们习惯上使用逆时针的角度,而表针是顺时针转动,即在S3C2440上,坐标跟我们实际用到的坐标方向不同,所以我们应先算出从12点开始的每个刻度的正余弦值,即有60个数组元素的正余弦数组,为计算每个刻度跟时分秒针在表盘中的位置做准备。
校正后的角度值,按顺时针重新排列三角函数值,得到如下正余弦数组:
时钟表盘画法流程图:见图1。
画表盘核心代码:
3.2.2 指针画法
在moniDlg类中添加刻画指针的函数。
时分秒针主要用长短和粗细区分,亦
可设置指针颜色。
绘制指针以角度值为控制变量,根据前面画表盘计算出的校正后的角度值及定义的时分秒针的长度,算出时分秒针起始的坐标值。
利用读取的系统时间算出坐标,用函数MoveTo(x1,y1)和LineTo(x2,y2)实现指针的连接并实时显示。
为了让模拟时钟看起来更加平滑美观,本文设计每2分钟,时针移动1度;每10秒钟,分针移动1度;秒针则是每秒移动一格即6度。
因此要计算时分秒针的坐标位置,还需在校正后角度的三角函数正余弦数组中加入一定的数组元素,构成新的三角函数正余弦数组:
(1)时针的取值只有1~12这12个数字,本文设计每2分钟,时针移动1度。
此处用读取的分钟数和小时数来计算时针的顶点和终点坐标。
设读取系统时间的小时数为st.wHour,分钟数为st.wMinute,时针移动的度数为H。
由于S3C2440系统时间采用24小时制,当读取系统小时数小于等于12,则H=st.wHour*30+st.wMinute/2;当系统小时数大于12,则H=(st.wHour—12)*30+st.wMinute/2。
若得到的H=360,则取H为0;若H<360,则H取式中算出的值。
将算出的H代入下列公式,即可算出时针的顶点和终点坐标。
其中x和y 为表盘圆心坐标,下同。
(2)分针的取值是60个数字,本设计为每10秒分针移动1度。
用读取的分钟数和秒钟数来计算分针的顶点和终点坐标。
设读取的分钟数为st.wMinute,秒钟数为st.wSecond,分针移动的度数为M。
由于要使得每10秒分针移动1度,因此计算时要加上st.wSecond/10。
M=st.wMinute*6+st.wSecond/10,当计算后M=360,则取M为0。
将算出的M代入下列公式,即可算出分针的顶点和终点坐标。
(3)秒针的取值亦为60个数字,本设计为每过1秒钟,秒针移动1格。
设读取系统的秒钟数为st.wSecond,秒针移动的度数为S。
S=st.wSecond*6,当计算出的S=360时,S取0;否则取计算出的值。
将算出的S代入下列公式,即可算出秒针的顶点和终点坐标。
时钟指针画法流程图:见图2。
绘制指针的核心代码:
程序界面设计结构为上方显示模拟钟,下方显示数字钟和时间调整按钮。
本设计程序在一个显示界面下实现了模拟钟、数字钟和时间调整的功能。
程序运行效果如图3所示。
指针和刻度颜色可根据个人喜好设定,笔者设置为黑色。
5.结语
本文的设计在Windows CE操作系统下,实现了模拟钟的全部显示功能,同时还具有数字钟的显示和时间调整功能。
编译形成的可执行文件,可用于智能手机、PDA、带触屏的开发板等具有Windows CE系统的微型设备中,对嵌入式初学者也有很大的帮助。
参考文献
[1]blogercn的专栏一个模拟时钟[EB/OL].http:///Blog/Detail_RD.Blog_blogercn_20940.html,2009—8—9/2012—9—20.
刘炜(1963—),男,副教授,硕士生导师,主要研究方向:智能仪器。