万年历课程设计报告

时间:2024.4.27

 

计算机信息工程学院

2011/2012第一学期嵌入式系统应用课程设计

题目基于mClinuxMINIGUI的万年历系统设计                     

    

20##年12月23日

基于mClinuxMINIGUI的万年历系统设计

摘  要

万年历系统是以S3C44B0芯片为控制核心,采用mClinux操作系统和MINIGUI ,在S3C44B0嵌入式实验箱上实现一个有图形用户界面的万年历软件,能够实现时间和日期的显示,还增加了设置时间的功能;设计S3C44B0定时程序,采用RTC,实现时分秒周年月日的定时;设计基于mClinux的MINIGUI 界面程序,可实时显示时分秒周年月日数据。

关键字:S3C44B0;mClinux;MINIGUI;RTC

Abstract

mClinux operating systemmCalendar system is S3C44B0 chip as control core, using  and MINIGUI, in S3C44B0 embedded experiment box on achieving a graphical user interface is the calendar software, will be able to realize the time and date of the display, but also increased the set time function; Design S3C44B0 timing program, the RTC, implementation date of the timing determined weeks; Design  mClinux MINIGUI interface of the program can real-time displaymbased on the  provides a week when the date of data

Key word: S3c44B0; mClinux;MINIGUI;RTC

目录

摘  要... 2

第一章 引言... 4

第二章 硬件系统设计... 5

2.1 ARM硬件系统... 5

2.2 ARM核心模块... 5

2.3时钟振荡电路... 6

2.4 LCD显示频模块... 7

2.5 RS232通讯模块... 7

2.6键盘模块... 8

第三章 软件系统设计... 10

3.1 参数信息... 10

3.2 程序设计... 11

3.2.1 主程序设计... 11

3.2.2 用户界面设计... 12

3.2.3 万年历程序设计... 16

3.2.4 RTC程序设计... 17

第四章 性能测试与结果分析... 19

4.1日期时间显示... 19

4.2日期时间设置... 19

第五章 课程设计总结... 21

5.1 问题与解决... 21

5.2心得体会... 21

参考文献... 22

附录... 22

第一章 引言

随着社会的快速发展,时间的流逝,从观察太阳、摆钟到现在的电子钟,人类不断研究,不断创造新纪录,电子万年历已成为当今人类准确、快速获取时间信息的重要工具之一。

根据国际电气和电子工程师协会(IEEE)的定义,嵌入式系统是“用来控制、监视和辅助设备、机器和对象的装置”。业内一个普遍被认同的定义是:以应用为中心、以计算机技术为基础、软件硬件可剪裁、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

本课题是设计一个万年历系统。其原理是以S3C44B0芯片为控制核心,采用mClinux操作系统和MINIGUI ,在S3C44B0嵌入式实验箱上实现一个有图形用户界面的万年历软件,能够实现时间和日期的显示,还增加了设置时间的功能;设计S3C44B0定时程序,采用RTC,实现时分秒周年月日的定时;设计基于mClinux的MINIGUI 界面程序,可实时显示时分秒周年月日数据;从而构成万年历系统。

本设计的主要内容分为两部分:硬件部分和软件部分。硬件部分内容分为:S3C44B0芯片、LCD显示频等。软件部分分为:基于mClinux操作系统的任务调控和基于MINIGUI图形用户界面的设计。

第一章为引言,粗略地介绍此次课设的主要内容。第二章为硬件系统设计,主要介绍硬件构成图和各硬件部分的功能,硬件系统中对应芯片接线、工作方式以及初始化编程。第三章为软件系统设计,主要介绍各种参数、流程图以及代码。第四章为课程设计总结,主要包括心得体会、问题与解决和程序清单。

第二章 硬件系统设计

2.1 ARM硬件系统

万年历系统硬件系统由以下六个模块组成:ARM核心模块、LCD显示频模块、电源模块、键盘模块、RS232通讯模块、触摸屏模块。ARM核心模块采用S3C44B0芯片,键盘模块采用小键盘,用于调整时间,显示模块采用LCD显示频,实现对时间,日期的显示。

硬件系统原理图如图2-1-1所示:

 

图2-1  硬件系统原理图

2.2 ARM核心模块

Samsung S3C44B0X微处理器是三星公司专为手持设备和一般应用提供的高性价比和高性能的微控制器解决方案,它使用ARM7TDMI核,工作在66MHZ。为了降低系统总成本和减少外围器件,这款芯片中还集成了下列部件:

8KB Cache、外部存储器控制器、LCD控制器、4个DMA通道、2通道UART、1个多主I2C总线控制器、1个IIS总线控制器,5通道PWM定时器及一个内部定时器、71个通用I/O口、8个外部中断源、实时时钟、8通道10位ADC等。

支持数据存储的大/小端选择(通过外部引脚进行选择)

地址空间:具有8个存储体,每个存储体可达32Mb,总共可达256Mb。

对所有存储体的访问大小均可进行改变(8位/16位/32位)

8个存储体中,Bank0-Bank5可支持ROM、SRAM;Bank6、Bank7可支持ROM、SRAM和FP/EDO/SDRAM等。

7个存储体的起始地址固定,1个存储体的起始地址可变。

ARM核心模块电路原理图如图2-1-2所示:

图2-2 单片机模块电路图

2.3时钟振荡电路

时钟振荡电路图5所示,时钟振荡电路用于产生S3C44B0X正常工作时所需要的时钟信号,电路由两个22pF的瓷片电容和一个6MHz的晶振组成,并接入到单片机的XTAL1和XTAL2引脚处,使单片机工作于内部振荡模式。此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。电路中两个电容C16、C17的作用使电路快速起振,提高电路的运行速度。

时钟振荡电路如图2-3所示:

图2-3 时钟振荡电路

2.4 LCD显示频模块

显示电路采用LCD1602液晶显示,图中只画出了其相应的接口。 3脚用于调节LCD1602的背光,4、5、6为LCD1602的控制口,用于控制其写入或是读出指令,7至14脚为LCD1602的数据口,将数传送到LCD1602中。

LCD显示频模块如图2-4所示:

图2-4  LCD显示频模块

2.5 RS232通讯模块

MAX232芯片具有功耗低、工作电源为单电源、外接电容仅为0.1uF或1uF、采用双列直插封装形式、接收器输出为三态TTL/CMOS、两路接收器和发送器等特点。

RS232电路原理图如图2-5所示:

图2-6  MAX232电路图

通过这个模块,我们可以实现万年历系统与计算机之间的串口通信,实现数据交换,日期、时间的显示。

2.6键盘模块

独立式按键就是各按键相互独立、每个按键各接一根输入线,一根输入线上的按键是否按下不会影响其他输入线上的工作状态。因此,通过检测输入线的电平状态可以很容易判断哪个按键被按下了。独立式按键电路配置灵活,软件结构简单。但每个按键需占用一根输入线,在按键数量较多时,输入口浪费大,电路结构显得很繁杂。故此种键盘适用于按键较少或操作速度较高的场合。若采用此方式,,各按键开关均采用上拉电阻,这是为了保证在按键断开时,各IO口线有确定的高电平。当然如输入口线内部已有上拉电阻,则外电路的上拉电阻可省去。

矩阵式键盘适用于按键数量较多的场合,它由行线和列线组成,按键位于行、列的交叉点上,一个4*4的行、列结构可以构成一个含有16个按键的键盘。很明显,在按键数量较多的场合,矩阵键盘与独立式按键键盘相比,要节省很多的I/O口。行、列线分别接到按键的两端。行线通过上拉电阻接到+5V上。平时无按键时,行、列线处于高电平状态,而当有键按下时,行、列线将导通,因此行线电平状态将由与此行线相连的列线电平决定。按键的识别在此课设中采用扫描法。让所有的列线处于低电平,当有键按下时,按键所在的行电平将被拉成低电平,根据此行电平的变化,便能判定此行有键被按下。为了进一步判定到底哪一列的键被按下,可在某一时刻只让一条列线处于低电平,而其余所有列线处于高电平。

键盘模块如图2-7所示:

图2-7  键盘模块

第三章 软件系统设计

3.1 参数信息

/* 主窗口起始位置及大小 */

#define  MWINDOW_LX    0             /* 窗口左边框的x值 */

#define  MWINDOW_TY    0             /* 窗口上边框的y值 */

#define  MWINDOW_RX   320     /* 窗口右边框的x值 */

#define  MWINDOW_BY   240     /* 窗口下边框的y值 */

/* 包含各图片资源文件 */

#include  "no01.c"

HWND hMainWnd;      // 主窗口句柄

MAINWINCREATE  window_info;

/*登陆参数*/

#define login 300

#define user 301

#define pass 302

#define user2 401

#define pass2 402

/*时间显示参数*/

#define nian 403

#define yue 404

#define ri 405

#define enian 406

#define eyue 407

#define eri 408

#define shi 409

#define fen 410

#define miao 411

#define eshi 412

#define efen 413

#define emiao 414

//|RTC读写使能,选择BCD时钟、计数器,无复位,1/32768

#define  RTC_RW_EN()  rRTCCON = 1          

//RTC读写禁止(降低功率消耗),选择BCD时钟、计数器,无复位,1/32768

#define  RTC_RW_DS()   rRTCCON &= 0xfe

static char *checkuser2[]={"***","///","---"}; //   用户名

static char *checkpass2[]={"***","///","---"};//   密码

3.2 程序设计

此部分包括主程序流程图,用户界面程序流程图,万年历程序流程图, RTC程序设计流程图,以及软件设置各模块能实现的功能。

3.2.1 主程序设计

1.主程序流程图如图3-2-1所示:

图3-2-1主程序流程图

2.主程序

int  MiniGUIMain(int argc, const char *argv[])

{   MSG Msg;

#ifdef _LITE_VERSION

    SetDesktopRect(0,0, 800,600);

#endif

    InitMainWindow();       // 建立主窗口

    ShowWindow(hMainWnd, SW_SHOWNORMAL);    // 显示主窗口

    /* 消息循环 */

    while(GetMessage(&Msg, hMainWnd))

    {   TranslateMessage(&Msg);

        DispatchMessage(&Msg);

    }

    MainWindowThreadCleanup(hMainWnd);

    return(0);

}

3.2.2 用户界面设计

1.用户界面程序

static  DLGTEMPLATE  aaa =

{   WS_BORDER | WS_CAPTION,

    WS_EX_NONE,

    0, 0, 320, 240,

    "登陆",

    0,

    0,

    6,

    NULL,

    0   

};

static  DLGTEMPLATE  ddd =

{   WS_BORDER | WS_CAPTION,

    WS_EX_NONE,

    40, 80, 240, 180,

    "设置时间",

    0,

    0,

    13,

    NULL,

    0   

};

static  DLGTEMPLATE  ggg =

{   WS_BORDER | WS_CAPTION,

    WS_EX_NONE,

    0, 0, 320, 240,

    "万年历",

    0,

    0,

    1,

    NULL,

    0   

};

static CTRLDATA bbb[] =

{  

    {   "static",

        WS_VISIBLE | SS_SIMPLE,

              25,10,  200, 16,

              login,

              "          输入用户名   密码",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              10,40,  60, 16,

              user,

              "用户名",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              10,80,  60, 16,

              pass,

              "密码",

              0,

              WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       70,40, 140,25,

       user2,

       "",

       0,

       WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | ES_PASSWORD | WS_TABSTOP,

       70,80, 140,25,

       pass2,

       "",

       0,

       WS_EX_NONE

    },

    {  "button",

       WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,

       100,120,  80,25,

       IDOK,

       "确定",

       0,

       WS_EX_NONE

    }

};

static CTRLDATA eee[] =

{  

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              20,40,  40, 20,

              nian,

              "年",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              20,60,  40, 20,

              yue,

              "月",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              20,80,  40, 20,

              ri,

              "日",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              140,40,  40, 20,

              shi,

              "时",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              140,60,  40, 20,

              fen,

              "分",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              140,80,  40, 20,

              miao,

              "秒",

              0,

              WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       60,40, 40,20,

       enian,

       "",

       0,

       WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       60,60, 40,20,

       eyue,

       "",

       0,

       WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       180,40, 40,20,

       eshi,

       "",

       0,

       WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       180,60, 40,20,

       efen,

       "",

       0,

       WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       180,80, 40,20,

       emiao,

       "",

       0,

       WS_EX_NONE

    },

    {  "button",

       WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,

       90,120,  80,25,

       IDOK,

       "确定",

       0,

       WS_EX_NONE

    }

2.用户界面程序流程图如图3-2-2所示:

图3-2-2 用户界面程序流程图

3.2.3 万年历程序设计

1.万年历程序流程图如图3-2-3所示:

图3-2-3 万年历程序流程图

2. 万年历程序见附录。

3.2.4 RTC程序设计

1. RTC程序

void rtcGetTime (PTIME pTime)

{

  U8 byVal;

  RTC_RW_EN();           //RTC读写使能

  pTime->wYear = 20## + rBCDYEAR;

  byVal = rBCDMON;   

  pTime->byMonth = (byVal>>4)*10 + (byVal&0xf);     //BCD码转十进制

  byVal = rBCDDAY;    

  pTime->byDay = (byVal>>4)*10 + (byVal&0xf);

  byVal = rBCDHOUR; 

  pTime->byHour = (byVal>>4)*10 + (byVal&0xf);

  byVal = rBCDMIN;     

  pTime->byMin = (byVal>>4)*10 + (byVal&0xf);

  byVal = rBCDSEC;                   

  pTime->bySec = (byVal>>4)*10 + (byVal&0xf);

RTC_RW_DS ();  //RTC读写禁止,选择BCD时钟、计数器,无复位,  

}

void rtcShowTime ()

{

  TIME time;

  rtcGetTime (&time);

sprintf (msg_text,"Time is : %04d-%02d-%02d, %02d:%02d:%02d.",time.wYear, time.byMonth, time.byDay, time.byHour, time.byMin, time.bySec);

}

2. RTC程序设计流程图如图3-2-4所示:

图3-2-4 RTC程序设计流程图

第四章 性能测试与结果分析

4.1日期时间显示

日期时间显示如图4-1所示,显示日期时间,每隔一秒中刷新一次;点击“修改时间”按钮,跳出设置日期时间对话框。

图4-1 日期时间显示窗口

4.2日期时间设置

日期时间设置如图4-2所示,如果设置时间格式范围等正确,返回时间显示窗口,否则重新设置。

图4-2 日期时间设置窗口

第五章 课程设计总结

5.1 问题与解决

1. “年”设置问题

设置年份时(如2011),无法正确更改,原因在于:定义PTIME中的year为8bit,最大表示256,从寄存器读出之后,16位数变为8位出错。解决方法:设置“年”时输入小于256或者改变PTIME的定义。

2. 任意修改问题

有时往往不需要年月日,时分秒都设置,而只是修改其中一部分,开始的程序设置没有做到这一点,后来经过分析总结,罗列出来修改的8种状态,理清思路,做到了任意修改,并使之符合实际情况。

3. 基于minigui的用户界面

使用minigui设计界面时,掌握minigui各函数的功能与使用方法,理解窗体过程函数之间的关系,做到思路清晰。

5.2心得体会

通过此次课程设计,结合所学的嵌入式这门课程的知识,对其应用之一——基于mClinux和MINIGUI的万年历,进行设计与实现。总体感觉收获比较多,因为可以将书本上的知识应用到实践当中。刚开始的时候,翻阅了一些资料,还是没有什么头绪,后来在老师和同学的帮助下,终于找到了入口点,接下来的事情就相对的容易一些了。

首先,把握整个的设计的大概的流程,然后再对每一个分块进行设计,最后进行调试。在实现具体功能时尝试了多种算法,选择最合理的。如果时间允许,小组还准备加入数据库以期实现数据查询等功能。此次课程设计感觉收获很多,比如,翻阅资料提高了自学能力,和同学一起讨论汲取别人的长处。老师能够引导学生应该如何去把握、分析课程设计的主题,找出突破点,让学生积极主动进行课程设计,使学生很好地提高自学的能力,同时我也明白了在学习的道路上没有捷径,只有一步一个脚印,才能真正学到东西!

很快,课程设计就过去。我对硬件与软件的结合也有了基本的了解,产生了浓厚的兴趣,相信以后会有更深的理解。同时要感谢李老师在这几周中对我们的指点和帮助,感谢我们小组其他成员,感谢他们在这三周中的合作与帮助!

参考文献

[1] 任哲、潘树林、房红征.嵌入式操作系统基础 uc/os-II和Linux.北京航空航天大学出版社,2010:68-238

[2] 孟祥莲.嵌入式系统原理及应用教程.清华大学出版社,2010::60-200

[3] 北京飞漫软件技术有限公司.MiniGUI编程指南,2004:3-70

附录

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <minigui/common.h>

#include <minigui/minigui.h>

#include <minigui/gdi.h>

#include <minigui/window.h>

#include <minigui/control.h>

#include <minigui/uTypes.h>

#include <minigui/rtc.h>

#include "../../startup/44b.h"

static char msg_text [256];

static  DLGTEMPLATE  aaa =

{   WS_BORDER | WS_CAPTION,

    WS_EX_NONE,

    0, 0, 320, 240,

    "登陆",

    0,

    0,

    6,

    NULL,

    0   

};

static  DLGTEMPLATE  ddd =

{   WS_BORDER | WS_CAPTION,

    WS_EX_NONE,

    40, 80, 240, 180,

    "设置时间",

    0,

    0,

    13,

    NULL,

    0   

};

static  DLGTEMPLATE  ggg =

{   WS_BORDER | WS_CAPTION,

    WS_EX_NONE,

    0, 0, 320, 240,

    "万年历",

    0,

    0,

    1,

    NULL,

    0    

};

static CTRLDATA bbb[] =

{  

    {   "static",

        WS_VISIBLE | SS_SIMPLE,

              25,10,  200, 16,

              login,

              "          输入用户名   密码",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              10,40,  60, 16,

              user,

              "用户名",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              10,80,  60, 16,

              pass,

              "密码",

              0,

              WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       70,40, 140,25,

       user2,

       "",

       0,

       WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | ES_PASSWORD | WS_TABSTOP,

       70,80, 140,25,

       pass2,

       "",

       0,

       WS_EX_NONE

    },

    {  "button",

       WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,

       100,120,  80,25,

       IDOK,

       "确定",

       0,

       WS_EX_NONE

    }

};

static CTRLDATA eee[] =

{  

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              20,40,  40, 20,

              nian,

              "年",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              20,60,  40, 20,

              yue,

              "月",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              20,80,  40, 20,

              ri,

              "日",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              140,40,  40, 20,

              shi,

              "时",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              140,60,  40, 20,

              fen,

              "分",

              0,

              WS_EX_NONE

    },

       {   "static",

        WS_VISIBLE | SS_SIMPLE,

              140,80,  40, 20,

              miao,

              "秒",

              0,

              WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       60,40, 40,20,

       enian,

       "",

       0,

       WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       60,60, 40,20,

       eyue,

       "",

       0,

       WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       60,80, 40,20,

       eri,

       "",

       0,

       WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       180,40, 40,20,

       eshi,

       "",

       0,

       WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       180,60, 40,20,

       efen,

       "",

       0,

       WS_EX_NONE

    },

       {   "edit",

       WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,

       180,80, 40,20,

       emiao,

       "",

       0,

       WS_EX_NONE

    },

    {  "button",

       WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,

       90,120,  80,25,

       IDOK,

       "确定",

       0,

       WS_EX_NONE

    }

};

static CTRLDATA hhh[] =

{  

    {  "button",

       WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,

       100,120,  80,25,

       IDOK,

       "设置",

       0,

       WS_EX_NONE

    }

};

static BOOL check(char *yonghuming,char *mima)

{

       int i;

       if(number==0) return(1);

       for(i=0;i<number;i++)

       {

              if(strcmp(yonghuming,checkuser2[i])==0)

                     if(strcmp(mima,checkpass2[i])==0) return(1);

                     else return(0);

       }

       return 0;

}

void rtcGetTime (PTIME pTime)

{

  U8 byVal;

  RTC_RW_EN();        //RTC读写使能

  pTime->wYear = 20## + rBCDYEAR;

  pTime->byWeekday = rBCDDATE;

  byVal = rBCDMON; 

  pTime->byMonth = (byVal>>4)*10 + (byVal&0xf);       //BCD码转十进制

  byVal = rBCDHOUR;

  pTime->byHour = (byVal>>4)*10 + (byVal&0xf);

  byVal = rBCDMIN;   

  pTime->byMin = (byVal>>4)*10 + (byVal&0xf);

  byVal = rBCDSEC;                 

  pTime->bySec = (byVal>>4)*10 + (byVal&0xf);

  RTC_RW_DS ();        //RTC读写禁止(降低功率消耗),选择BCD时钟、计数器,无复位,

}

void rtcShowTime ()

{

  TIME time;

  rtcGetTime (&time);

sprintf (msg_text,"Time is : %04d-%02d-%02d, %02d:%02d:%02d.",

            time.wYear, time.byMonth, time.byDay, time.byHour, time.byMin, time.bySec);

}

static int  fff(HWND hDlg, int message, WPARAM wParam, LPARAM lParam)

{    

       int flag=0;

       static char kkk[256];

       int riqi[6];

       char snian[30];

       char syue[30];

       char sri[30];

       char sshi[30];

       char sfen[30];

       char smiao[30];

    switch(message)

    { 

              case MSG_CLOSE:

            EndDialog(hDlg,wParam);

                     DestroyAllControls(hDlg);

               break;

              case MSG_INITDIALOG:

            return(1);

        case MSG_COMMAND:

                   switch(LOWORD(wParam))

                     {  

                    case IDOK:

                                   GetWindowText(GetDlgItem(hDlg,enian),snian,22);

                                   GetWindowText(GetDlgItem(hDlg,eyue),syue,22);

                                   GetWindowText(GetDlgItem(hDlg,eri),sri,22);

                                   GetWindowText(GetDlgItem(hDlg,eshi),sshi,22);

                                   GetWindowText(GetDlgItem(hDlg,efen),sfen,22);

                                   GetWindowText(GetDlgItem(hDlg,emiao),smiao,22);

                                   //下面将取得的值转换为int 再调用setrtc函数

                                   len = atof(snian);                                // 转换为浮点数

                                   shunian = (int)len;

                                   len = atof(syue);                                 // 转换为浮点数

                                   shuyue = (int)len;

                                   len = atof(sri);                            // 转换为浮点数

                                   shuri = (int)len;

                                   len = atof(sshi);                                  // 转换为浮点数

                                   shushi = (int)len;

                                   len = atof(sfen);                                 // 转换为浮点数

                                   shufen = (int)len;

                                   len = atof(smiao);                               // 转换为浮点数

                                   shumiao = (int)len;

                                   if(shunian>=0&&shunian<=9999)

if((shuyue==1)||(shuyue==3)||(shuyue==5)||(shuyue==7)||(shuyue==8)||(shuyue==10)||(shuyue==12))

                                                        if(shuri>=0&&shuri<=31)

                                                               if(shushi>=0&&shushi<24)

                                                                      if(shufen>=0&&shufen<60)

                                                                             if(shumiao>=0&&shumiao<60)

                                                                                    flag=1;

                                     if((shuyue==4)||(shuyue==6)||(shuyue==9)||(shuyue==11))

                                                 if(shuri>=0&&shuri<=30)

                                                        if(shushi>=0&&shushi<24)

                                                               if(shufen>=0&&shufen<60)

                                                                      if(shumiao>=0&&shumiao<60)

                                                                             flag=1;

                                   if(shuyue==2)

                                        if((shunian%4==0&&shunian%100!=0)||(shunian%400==0))

                                                 if(shuri>=0&&shuri<=29)

                                                        if(shushi>=0&&shushi<24)

                                                               if(shufen>=0&&shufen<60)                                                                                                  if(shumiao>=0&&shumiao<60)

                                                                             flag=1;

                                                                      else if(shuri>=0&&shuri<=28)

                                                                             if(shushi>=0&&shushi<24)

                                                                                    if(shufen>=0&&shufen<60)

                                                                                           if(shumiao>=0&&shumiao<60)

                                                                                                  flag=1;

                                   if(flag==1)

                                   {

                     sprintf(kkk,"%d-%d-%d%d-%d-%d",riqi[0],riqi[1],riqi[2],riqi[3],riqi[4],riqi[5]);

                                          MessageBox(HWND_DESKTOP,kkk,"设置的时间是",MB_OK);

RTC_RW_EN();    

                                  rBCDYEAR  = riqi[0];        //年

                                 rBCDMON   = ((riqi[1] / 10)<<4) | (riqi[1] % 10);         //月

                                         rBCDDAY   = ((riqi[2] / 10) << 4) | (riqi[2] % 10);        //日

                                         rBCDHOUR = ((riqi[3] / 10) << 4) | (riqi[3] % 10);          //小时

                                         rBCDMIN   = ((riqi[4] / 10 ) << 4) |(riqi[4] % 10);        //分

                                         rBCDSEC   = ((riqi[5] / 10) << 4) | (riqi[5] % 10);         //秒

                                          RTC_RW_DS();

                                   }

                                   SetWindowText(GetDlgItem(hDlg,enian),"");

                                   SetWindowText(GetDlgItem(hDlg,eyue),"");

                                   SetWindowText(GetDlgItem(hDlg,eri),"");

                                   SetWindowText(GetDlgItem(hDlg,eshi),"");

                                   SetWindowText(GetDlgItem(hDlg,efen),"");

                                   SetWindowText(GetDlgItem(hDlg,emiao),"");

                                   if(flag==1)

                                   {

                                          flag=0;

                                          EndDialog(hDlg,wParam);

                                          DestroyAllControls(hDlg);

                                   }       

                        break;

              default:

               break;

          }

          break;

       default:

           break;

    }

    return(DefaultDialogProc(hDlg, message, wParam, lParam));

}

static void  init2(HWND hWnd)

{   ddd.controls = eee;

    DialogBoxIndirectParam(&ddd, hWnd, fff, 0L);

}

static int  iii(HWND hDlg, int message, WPARAM wParam, LPARAM lParam)

{

       static PLOGFONT s_font;

       HDC hdc;

s_font=CreateLogFont(NULL,"song","GB2312",FONT_WEIGHT_BOLD, FONT_SLANT_ITALIC,FONT_SETWIDTH_NORMAL,  FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE,  16, 0);

    switch(message)

    {   case MSG_CREATE:

                     SetTimer(hDlg,100,100);

                     break;

              case MSG_TIMER:

            UpdateWindow(hDlg,TRUE);

                     break;

              case MSG_PAINT:

                     rtcShowTime ();

            hdc = BeginPaint (hDlg);

                     SelectFont(hdc, s_font);

            TextOut (hdc, 20, 30, msg_text);

            EndPaint (hDlg, hdc);

            break;

              case MSG_INITDIALOG:

           return(1);

              case MSG_CLOSE:

            EndDialog(hDlg,wParam);

                     DestroyAllControls(hDlg);

                     InitMainWindow();

               break;

        case MSG_COMMAND:

                   switch(LOWORD(wParam))

                   { 

                      case       IDOK:

                                 init2(HWND_DESKTOP);

                                 break;

                       default:

                          break;

          }

          break;

       default:

       break;

    }

    return(DefaultDialogProc(hDlg, message, wParam, lParam));

}

static void  init3(HWND hWnd)

{  

       ggg.controls = hhh;

    DialogBoxIndirectParam(&ggg, hWnd, iii, 0L);

}

static int  ccc(HWND hDlg, int message, WPARAM wParam, LPARAM lParam)

{

       char yonghuming[30];

       char mima[30];

    switch(message)

    {   case MSG_INITDIALOG:

           return(1);

              case MSG_CLOSE:

            EndDialog(hDlg,wParam);

                     DestroyAllControls(hDlg);

                     InitMainWindow();

        case MSG_COMMAND:

                   switch(LOWORD(wParam))

                   {   case user2:

                     case pass2:

                                if(HIWORD(wParam)!=EN_ENTER) break;  

                     case IDOK:

                                 GetWindowText(GetDlgItem(hDlg,user2),yonghuming,22);

                                 GetWindowText(GetDlgItem(hDlg,pass2),mima,22);

                                 if(check(yonghuming,mima))

                                 {

                                          SetWindowText(GetDlgItem(hDlg,user2),"");

                                          SetWindowText(GetDlgItem(hDlg,pass2),"");

                                          init3(HWND_DESKTOP);

                                          EndDialog(hDlg,wParam);

                                          DestroyAllControls(hDlg);

                                 }

                                 else

                                 {

                                         MessageBox(hDlg,"错误哦","!!!!",MB_OK|MB_ICONHAND);

                                        SetWindowText(GetDlgItem(hDlg,user2),"");

                                        SetWindowText(GetDlgItem(hDlg,pass2),"");

                                 }

                                 break;

                       default:

                          break;

                   }

                   break;

              default:

            break;

    }

    return(DefaultDialogProc(hDlg, message, wParam, lParam));

}

static void  init(HWND hWnd)

{   aaa.controls = bbb;

    DialogBoxIndirectParam(&aaa, hWnd, ccc, 0L);

}

/****************************************************************************

* 名称:WinProc()

* 功能:主窗口过程函数。

*       处理MSG_PAINT消息,在窗口中显示6个图标。

*       处理MSG_CHAR消息,进行图标菜单选择操作。

* 入口参数:hWnd        窗口句柄

*           message     消息

*           wParam      消息附加参数1(对于不同的消息,有不同的用途)

*           lParam      消息附加参数2(对于不同的消息,有不同的用途)

* 出口参数:消息已处理则返回0。

****************************************************************************/

static int  WinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)

{   static BITMAP  s_startbmp;

    static BITMAP  s_bmp[1];

       static PLOGFONT s_font;

    HDC  hdc;   // 定义一个图形设备上下文对象,输出字符时需要。

    switch(message)

    {  

              case MSG_CREATE:// 装载图片资源

            LoadBitmapFromMem(HDC_SCREEN, &s_bmp[0], no01_data, sz_no01, "bmp");

                     s_font=CreateLogFont(NULL,"song","GB2312",FONT_WEIGHT_BOLD, FONT_SLANT_ITALIC,FONT_SETWIDTH_NORMAL, T_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE,16, 0);                                            break;           

        case MSG_PAINT:

                     hdc = BeginPaint(hWnd);         // 获得设备hdc                       

                     FillBoxWithBitmap(hdc, 141, 81, 48,48, &s_bmp[0]);

                     Rectangle(hdc, 136,76, 194,134);                  

                     SelectFont(hdc, s_font);

                     TextOut(hdc, 141,139, "登陆");     

                     EndPaint(hWnd, hdc);            // 释放设备hdc

                     break;

           case MSG_CHAR:

                     init(HWND_DESKTOP);

                     DestroyMainWindow(hWnd);        // 销毁主窗口

                     PostQuitMessage(hWnd);      // 发送MSG_QUIT消息,通知"消息循环"结束

                  break;

        case MSG_CLOSE:

               DestroyMainWindow(hWnd);        // 销毁主窗口

               PostQuitMessage(hWnd);      // 发送MSG_QUIT消息,通知"消息循环"结束

               break;

       default:

               return(DefaultMainWinProc(hWnd, message, wParam, lParam));

    }

    return(0);

}

/****************************************************************************

* 名称:InitMainWindow()

* 功能:建立主窗口。

* 入口参数:无

* 出口参数:建立成功返回1,否则返回0。

****************************************************************************/

int InitMainWindow(void)

{  

    window_info.dwStyle = WS_VISIBLE; 

    window_info.dwExStyle = WS_EX_NONE;        

    window_info.spCaption = "";         

    window_info.hMenu = 0;                     

    window_info.hCursor = GetSystemCursor(0);  

    window_info.hIcon = 0;                     

    window_info.MainWindowProc = WinProc;      

    window_info.lx = MWINDOW_LX;               

    window_info.ty = MWINDOW_TY;

    window_info.rx = MWINDOW_RX;

    window_info.by = MWINDOW_BY;

    window_info.iBkColor = COLOR_lightwhite;  

    window_info.dwAddData = 0;

    window_info.hHosting = HWND_DESKTOP;       

    hMainWnd = CreateMainWindow(&window_info);

    if(hMainWnd == HWND_INVALID) return(0);

    else return(1);

}

/****************************************************************************

* 名称:MiniGUIMain()

* 功能:MiniGUI程序入口点。

* 入口参数:argc    参数个数

*           argv    参数字符串指针

* 出口参数:返回0。

****************************************************************************/

int  MiniGUIMain(int argc, const char *argv[])

{   MSG Msg;

#ifdef _LITE_VERSION

    SetDesktopRect(0,0, 800,600);

#endif

    InitMainWindow();       // 建立主窗口

    ShowWindow(hMainWnd, SW_SHOWNORMAL);    // 显示主窗口

    /* 消息循环 */

    while(GetMessage(&Msg, hMainWnd))

    {   TranslateMessage(&Msg);

        DispatchMessage(&Msg);

    }

    MainWindowThreadCleanup(hMainWnd);

    return(0);

}

/* 定义桌面接口函数 */

#ifndef _LITE_VERSION

#include <minigui/dti.c>

#endif

更多相关推荐:
C++万年历课程设计报告

武汉纺织大学课程设计报告书名称C++程序设计课程设计题目万年历专业班级指导教师20##年6月11日目录课程设计报告书...............................................…

万年历综合课程设计报告

目录目录1第一章设计目的与要求311设计目的312设计要求3第二章课程设计分析421设计背景422程序开发环境423课程设计主要内容4第三章总体设计531整体流程图532功能模块图633各模块功能详细说明633...

51单片机万年历课程设计报告

一设计任务1设计任务设计并制作一个数字钟2设计要求显示年月日时分秒及星期信息具有可调整日期和时间功能增加闰年计算功能显示部分由LCD1602完成二方案论证1显示部分显示部分是本次设计的重要部分一般有以下两种方案...

电子万年历设计报告

单片机课程设计课题:电子万年历设计系别:电气与电子工程系专业:电子信息工程姓名:**学号:**河南城建学院20**年12月28日摘要ⅠAbstract.Ⅰ1绪论(课题背景、概述、目的)..12设计要求与方案论述…

万年历课程设计报告

西安文理学院软件学院课程设计报告设计名称设计题目万年历学生学号1402110147专业班级软件工程一班学生姓名罗强强学生成绩指导教师职称课题工作时间20xx1115至20xx1129软件学院课程设计任务书指导教...

电子万年历课程设计报告

课程创新与综合课程设计电子与电气工程系实践教学环节说明书题目名称电子万年历院系电子与电气工程学院专业电子信息工程班级学号1109635010学生姓名11指导教师q1起止日期13周周一14周周五1电子万年历一设计...

万年历C++课程设计报告

徐州师范大学科文学院本科生课程设计课程名称计算机程序设计实训题目万年历的设计专业班级电子信息工程08电信学生姓名学生学号日期20xx1220指导教师姜芳艽科文学院教务部印制2指导教师签字年月日3徐州师范大学物理...

数电课程设计报告 万年历

北京工商大学数字电子技术基础课程设计报告学专院业计算机与信息工程学院信实薛子朦10040601211具有运算及存储功能的计算机2数字万年历学生姓名学号课程设计题目设计时间20xx1223至20xx1226题目要...

java课程设计报告—万年历——詹永堂

Java程序设计课程设计报告题目万年历学院计算机科学与工程学院专业信息管理与信息系统学生姓名学号1100340129指导教师汪华登20xx年6月30日目录目录前言21需求分析211需求分析212功能设计22概要...

java课程设计万年历程序设计报告

广东商学院华商学院实验报告课程名称Java程序设计课程设计实验项目名称万年历班级与班级代码XX专软件X班实验室名称或课室厚德楼B203专业任课教师刘X璐学号310010114姓名XXX实验日期20xx年12月日...

万年历综合课程设计报告

万年历课程设计报告目录第一章设计目的与要求........................................................11.1设计目的....................…

java课程设计报告之万年历程序设计报告(1)

徐州工业职业技术学院目录前言21需求分析211需求分析212功能设计22概要设计221程序设计思路222程序运行界面323流程图43各模块的功能及程序说明431初始化组件432初始化数据533绘制程序界面54测...

万年历课程设计报告(28篇)