(完整word版)基于STM32的万年历设计_第1页
(完整word版)基于STM32的万年历设计_第2页
(完整word版)基于STM32的万年历设计_第3页
(完整word版)基于STM32的万年历设计_第4页
(完整word版)基于STM32的万年历设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、2*基于STM3的万年历设计电子通信工程系题目:基于STM32的万年历设计随着科技的快速发展,时间的流逝 , 至从观太阳、摆钟到现在电子钟,人类 不断研究,不断创新纪录。美国 DALLAS公司推出的具有涓细电流充电能的低功 耗实时时钟电路DS12C887它可以对年、月、日、周日、时、分、秒进行计时, 还具有闰年补偿等多种功能,而且 DS12C887勺使用寿命长,误差小。对于数字 电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒 和温度等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,采用数字式温度传感器 DS18B2(提取外界温度,功耗小,能在 3V的

2、低压工作, 电压可选用35V电压供电。进入新世纪LCD显示屏的技术和产业都取得了长足的发展,作为重要的现代 信息发布媒体之一,LCD显示屏在证券交易、金融、交通、体育、广告等领域被 广泛的应用。伴随社会信息化进程的推进,LCD显示屏技术也在不断的推陈出新, 应用领域愈加广阔。基于STM32勺LCD显示可以更好的满足各种需求,也更便于 操作和实现。现基于STM32在液晶显示屏幕上显示文本及图形。目前,显示技术和显示工业的发展迅速。显示技术是传递视觉的信息技术。液晶显示器件 LCD 是当今最有发展前途的一种平板显示器件, 它具有很多独到的优异特性。 它具有 显示信息多、 易于多彩化、 体积小、 重

3、量轻、功耗低、 寿命长、 价格低、 无辐射、 无污染、接口控制方便等优点。截至目前,我国在液晶显示取得较大进步,我国 LCD产业已经走过了近30 年的历程. 经历几次大的投资浪潮之后, 我国内地已 经成为世界最大的 TN-LCD扭曲液晶显示器)生产基地和主要的 STN-LCD超扭曲液晶显示器)生产 基地,并且从2003年开始,涉足TFT-LCD薄膜晶体管液晶显示器)领域.本课题设 计采用STM32F103V开发板,实现在LCD显示屏上显示由按键可操控的万年历功 能。本实验用到的硬件部分主要有 STM32开发板、USB线、LCD液晶模块,在LCD 显示屏上显示相关内容。综上所述万年历应具有读取方

4、便、 显示直观、 功能多样、 电路简洁等诸多优 点,符合电子仪器仪表的发展趋势, 具有广阔的市场前景。 本课题利用 STM32 的 RTC 实现一个简易的电子时钟,在液晶显示屏中显示时间值。显示时间格式为XX:XX:XX(时:分:秒),当时间计数为:23 : 59 : 59时 将刷新为: 00 : 00 : 00 。1. 功能描述1.1 设计要求1. 具有数字时钟功能。2. 具有简单日历功能。3. 具有手动校准时间功能。4. 具有闰年识别功能。1.2 RTC (实时时钟)简介实时时钟是一个独立的定时器。 RTC 模块拥有一组连续计数的计数器,在 相应软件配置下, 可提供时钟日历的功能。 修改计

5、数器的值可以重新设置系统当 前的时间和日期。RTC模块和时钟配置系统(RCC_BDC寄存器)是在后备区域,即在系统复位 或从待机模式唤醒后 RTC 的设置和时间维持不变。系统复位后,禁止访问后备 寄存器和RTC,防止对后备区域(BKP)的意外写操作。执行以下操作使能对后备 寄存器和 RTC 的访问:1. 设置寄存器RCC_APB1EN的PWREN和BKPEN位来使能电源和后备接口 时钟。2. 设置寄存器PWR_CF的DBP位使能对后备寄存器和 RTC的访问。当我们 需要在掉电之后,又需要 RTC 时钟正常运行的话,单片机的 VBAT 脚需外接 3.3V 的锂电池。当我们重新上电的时候,主电源给

6、 VBAT 供电,当系统掉电之 后 VBAT 给 RTC 时钟工作, RTC 中的数据都会保持在后备寄存器当中。野火 STM32开发板的VBAT引脚接了 3.3V的锂电。3.STM32自带了 RTC时钟计数器,从0开始计数到232。每一个计数代表秒 计数,每六十个计数代表分计数,以此类推。 24(小时)*60(分钟)*60(秒钟) =86400代表一天的计数时间。假设当前计数为 count , count/86400 得到计数的 天数,根据这个得到年月日。Cou nt%86400得到时分秒。4.根据 1 中得到的年月日时分秒, 进行计算的程序有: 闰年判断, 星期几计 算,当前月有多少天等等。

7、另外,秒表为 RTC一秒钟定时计数1.3 设计方案的选择1.3.1 可选择的芯片方案整个系统用STM32F103VEI片机作为中央控制器,由单片机执行采集内部 RTC值,时钟信号通过单片机I/O 口传给LCD12864单片机模块控制驱动模块驱 动显示模块,通过显示模块来实现信号的输出、 LCD12864的显示及相关的控制 功能。系统设有按键模块用于对时间进行调整及扩展多个小键盘。方案一:采用89C51芯片采用89C51芯片作为硬件核心,采用Flash ROM内部具有4KBROM存储空 间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路 设计中时由于不具备ISP在线编

8、程技术,当在对电路进行调试时,由于程序的错 误修改或对程序的新增功能需要烧入程序时, 对芯片的多次拔插会对芯片造成一 定的损坏。方案二:采用AT89S52芯片片内ROM全都采用Flash ROM能以3V的超底压工作;同时也与 MCS-51系 列单片机完全该芯片内部存储器为 8KB ROM存储空间,同样具有89C51的功能, 且具有在线编程可擦除技术, 当在对电路进行调试时, 由于程序的错误修改或对 程序的新增功能需要烧入程序时, 不需要对芯片多次拔插, 所以不会对芯片造成 损坏。不使用时钟芯片,而直接用AT89S52单片机来实现电子万年历设计。AT89S52是一种带8K字节闪烁可编程可擦除只读

9、存储器的低电压,高性能CMOS 位微处理器, 俗称单片机。 单片机的可擦除只读存储器可以反复擦写 1 000余次。 由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATME的 AT89S52是一 种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。若采用单片机计时,利用它的一个 16位定时器/计数器每50ms产生一个中 断信号,中断 20次后产生一个秒信号,然后根据时间进制关系依次向分、时、 日、星期、月、年进位。这样就实现了直接用单片机来实现电子万年历设计。方案三:采用STM32单片机STM32是 一个低功耗,高性能32位单片机,片内含4k Bytes ISP (I n-

10、system programmable)的可反复擦写1000次的Flash只读程序存储器。主要性能有:与 MCS-51单片机产品兼容、全静态操作:OHz33Hz、三级加密程序存储器、32 个可编程I/O 口线、三个16位定时器/计数器、八个中断源、全双工 UART串行 通道、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符、易编程。从单片机芯片主要性能角度出发, 本数字电子钟单片机芯片选择设计采用方 案采用 STM32F103VE1.3.2 显示模块选择方案和论证:方案一:采用 ILI9341LED 液晶显示屏采用 LED 液晶显示屏 , 液晶显示屏的显示功能强大 , 可显示大量文字 ,

11、 图形, 显示多样 , 清晰可见,显示质量高,没有电磁辐射,可视面积大,应用范围广,画面效果好,数字式接口,匀称小巧,功耗小。方案二:采用点阵式数码管显示动态显示, 即各位数码管轮流点亮, 对于显示器各位数码管, 每隔一段延时 时间循环点亮一次。 利用人的视觉暂留功能可以看到整个显示, 但须保证扫描速 度足够快,人的视觉暂留功能才可察觉不到字符闪烁。 显示器的亮度与导通电流、 点亮时间及间隔时间的比例有关。 调整参数可以实现较高稳定度的显示。 动态显 示节省了 I/O 口,降低了能耗。点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合, 如采用在显示数字显得太浪费 ,且价格也相对较

12、高 , 所以也不用此种作为显示 .方案三:采用LED数码管动态扫描LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机 连接时 , 占用的单片机口线少。从节省单片机芯片 I/O 口和降低能耗角度出发, 本数字电子钟数码管显示选 择设计采用方案一,既 ILI9341LED 显示。1.3.3 时钟芯片的选择方案和论证:方案一:直接采用单片机定时计数器 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、 时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的 时间误差较大。所以不采用此方案。方案二:采用DS1302时钟芯片实现时钟采用DS1302时钟芯

13、片实现时钟,DS1302芯片是一种高性能的时钟芯片,可 自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高 , 位的RAM做为数据暂存区,工作电压2.5V5.5V范围内,2.5V时耗电小于300nA.方案三:采用STM32的RTC定时器由于STM32自带了实现计时功能的RTC时钟计数器,可以直接使用。1.3.4 电路设计最终方案综上各方案所述,对本课题方案选定:采用STM32F103V昨为主控制芯片; STM32自带的RTC提供时钟;LCD液晶显示作为显示。1.4 电源电路本设计所需电源电压为直流、电压值大小5V的电压源。从硬件实物设计简 易程度与经费方面考虑,用两节电压值大

14、小 2.5V 干电池与电路电压源引脚相连 接即可达到硬件设计要求。即本设计可采用两节电压值大小 2.5V 干电池做硬件 电路电压源。为了方便改写程序,本次实验采用 USB线连接电脑进行操作。1.5按键电路本设计所需按键用于进行显示时间的调整与设置扩展的小键盘。单片机芯片4个I/O 口可与按键直接相连,通过编程,单片机芯片即可控制按键接口电平 的高低,即按键的开与关,以达到用按键进行显示时间的调整与设置扩展的小键 盘的设计要求。2.硬件设计2.1设计组成框图USBSTM32开发板LCD液晶按键模块区图设计的组成框图2.2 STM32F103VE实验板STM32F10系列属于中低端的32位ARM微

15、控制器,该系列芯片是意法半导 体(ST公司出品,其内核是Cortex-M3。该系列芯片按片内Flash的大小可分 为三大类:小容量(16K和32K)、中容量(64K和128K)、大容量(256K 384K 和512K。芯片集成定时器,CAN ADC SPI, I2C, USB UART等多种功能。 分 为三大类:LD(小于 64K),MD(小于 256K),HD (大于 256K),STM32F103VET6 类属第三类。STM32F103ZET芯片介绍:基于ARM Cortex-M3核心的32位微控制器 丄QFP-144封装. 512K片内FLASH相当于硬盘、,64K片内RAM相当于内存)

16、,片内FLASH 支持在线编程 (IAP).高达72M的频率,数据,指令分别走不同的流水线,以确保CPU运行速度 达到最大化 .通过片内BOOT区,可实现串口下载程序(ISP).片内双RC晶振,提供8M和 32K的频率.支持片外高速晶振 (8M), 和片外低速晶振 (32K). 其中片外低速晶振可用于 CPU的实时时钟,带后备电源引脚,用于掉电后的时钟行走. 42个16位的后备寄存器(可以理解为电池保存的RAM)利用外置的纽扣电 池, 和实现掉电数据保存功能 .支持JTAG,SWD调试.配合廉价的J-LINK,实现高速低成本的开发调试方 案。多达80个10(大部分兼容5V逻辑),4个通用定时器

17、,2个高级定时器,2 个基本定时器,3路SPI接口 ,2路I2S接口 ,2路I2C接口 ,5路USART一个USB 从设备接口,一个CAN接口 ,SDIO接口,可兼容SRAM,NO和NAND Flash接口的 16 位总线 -FSMC。 3路共16通道的12位AD输入,2路共2通道的12位DA输出.支持片外 独立电压基准 . CPL操作电压范围:2.0-3.6V2.3 USB 线USB开发涉及主机和设备,为了避免开发驱动程序,使用Win dows自带的驱动程序。所以设备枚举成HID类设备。USB鼠标就是标准的USB-HID设备。不过 操作系统阻止了应用程序直接访问USB鼠标返回的报告。所以本例

18、使用自定义HID设备。一来免去了开发驱动程序,二来自定义的 HID设备应用程序和设备可 以自由收发数据(仅指数据内容) 。USB是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。USB接口即插即用和热插拔功能。USB接口可连接127种外设,如鼠标和键盘等。USB 是在 1994年底由英特尔等多家公司联合在 1996年推出后,已成功替代串口和并 口,已成为当今电脑与大量智能设备的必配接口。USB版本经历了多年的发展,到如今已经发展为 3.0 版本。对于大多数工程师来说,开发 USB2.0 接口产品主要障碍在于:要面对复杂 的USB2.0协议、自己编写USB设备的驱动程序、熟悉单片机的编程。

19、这不仅要 求有相当的VC编程经验、还能够编写USB接口的硬件(固件)程序。所以大多 数人放弃了自己开发USB产品。为了将复杂的问题简单化,西安达泰电子特别设 计了 USB2.0协议转换模块。USB20D模块可以被看作是一个 USB2.0协议的转换器,将电脑的 USB2.0接 口转换为一个透明的并行总线, 就象单片机总线一样。 从而几天之内就可以完成 USB2.0产品的设计。2.4液晶显示器LCD控制器简介LCD液晶显示器(Liquid Crystal Dis play: LCD)的构造是在两片平行的玻璃当中放置液态的晶体, 两片玻璃中间有许多垂直和水平的细小电线, 透过通电 与否来控制杆状水晶

20、分子改变方向, 将光线折射出来产生画面。 LCM(LCDModule) 即LCD显示模组、液晶模块,是指将液晶显示器件,连接,控制与驱动等外围电 路,PCB电路板,背光源,结构件等装配在一起的组件。由于液晶显示屏功耗低、 体积小, 承载的信息量大, 因而被广泛用于信息输 出、与用户进行交互。由于 STM32 内部没有集成专用的液晶屏和触摸屏的控制 接口,所以在显示面板中应自带含有驱动芯片的驱动电路 (液晶屏和触摸屏的驱 动电路是独立的),STM32芯片通过驱动芯片来控制液晶屏和触摸屏。以本实验 3.2 寸液晶屏 (240*320) 为例, 它使用 ILI9341 芯片控制液晶屏, 通过 XPT

21、2046 芯片控制触摸屏。 LCD 为非发光性的显示装置,它需要借助背光 源才能达到显示功能, LED 控制器就是用来控制液晶屏中的 LED 背光源。2.4.1 液晶显示器在内部电路结构上主要构成1. 驱动板(也叫主板):主要是用以接收、处理从外部送进来的模拟( VGA) 或者数字(DVI)视频信号,并通过屏线送出信号去控制液晶屏(PANEL正常工 作。驱动板上含有MCI单元,它是液晶显示器的检测控制中心和大脑。2. 电源板:用于将90240V的交流电压转变为12V、5V、3V等的直流电供 给显示器工作。3. 背光板(也叫高压板):用于将主板或电源板输出的 12V 的直流电压转变 为PANEL

22、需要的高频的15001800V的高压交流电,用于点亮PANE啲背光灯。 电源板和背光板有时会做在一起也就是所谓的电源背光二合一板。4. 液晶屏:液晶显示用模块, 它是液晶显示器的核心部件, 其包含液晶板和 驱动电路。其中 , 液晶屏是液晶显示器内部最为关键的部件,它对液晶显示器的 性能和价格具有决定性的作用。2.4.2 IL19341 控制器结构 液晶屏的控制芯片内部结构非常复杂 , 最主要的是位于中间GRAM(Graphics RAM)可以理解为显存。GRAM中每个存储单元都对应着液晶面 板的一个像素点。它右侧的各种模块共同作用把 GRAM存储单元的数据转化成液 晶面板的控制信号, 使像素点

23、呈现特定的颜色, 而像素点组合起来则成为一幅完 整的图像。 接口与 MCU 进行通讯 ,MUC 通过 8080 接口与 ILI9341 进行通讯, 从而访问它的控制寄存器(CR)、地址计数器(AC)、及GRAM2.4.3 像素点的数据格式图像的像素点是由红、绿、蓝三原色组成,三原色根据其深浅程度被分为0255 个级别,它们按不同比例的混合可以得出各种色彩。 ILI9341 最高能够控 制18位LCD为了传输方便一般采用16位的控制模式。2.4.4 给整个屏幕上色再次回到 ILI9341_Init 函数,它调用完 ILI9341_REG_Config() 初始化了 液晶屏后,向ILI9341发送

24、了一个命令一一写GRA M内容,即后面发送的数据 都被解析为显示到屏幕像素点的数据。代码中使用 for 循环把语句 ILI9341_Write_Data(GBLUE) 执行了 320*240 次,即把所有像素点都显示为 GBLUE颜色。3. 软件设计3.1 程序流程框图图时间调整程序流程图3.2 字模的创建使用字模 III- 增强版 v3.91 软件来制作中文字库。打开软件,点击“自动 批量生成字库'按钮选项,点击选择“二级汉字库'按钮。在“源字体'选项里 面做如下设置,需要注意的是大小问题,因为我们本次的设计目标是实现 16*16 的汉字,所以在此选择小四字体。设置好

25、之后如下点击“开始转换进程'按钮 . 就会在安装目录下或者你设置 好的目录下生成.c后缀的字库文件。对LCD显示来说,只要能够在指定的位置 描写制定颜色的点, 那么就能够很好地根据汉字字模信息来描写汉字。 在此,为 了能够更好的清楚字模的取向和高低位的排列顺序,可以现先在 pc 测试刚才制 作好的库文件。回到“字模 III- 增强版 v3.91 ”软件,采用与之前同样的方式生成 bin 格式 的字库文件 (即“生成格式”选项设置为“ bin 文件格式” ) 。在软件安装目录下 会生成Font.dat文件,我们用“WinHeX'软件查看他的具体内容,与刚才制作的.c 字库的文件内

26、容是一致的。最后将生成的汉字字库拷贝到 SD卡根目录下并重命名为“ HZLIB.bin ”。3.3 程序的设计一共三个任务:主处理任务、触摸屏任务、秒更新任务。16void App_UCGUI_TaskCreate (void) CPU_INT08U os_err;/ 建立秒更新中断的信号量os_err = os_err;Clock_SEM=OSSemCreate(1);/ 硬件平台初始化BSP_Init();/ 主os_err = OSTaskCreateExt(AppTaskUserIF,(void *)0, (OS_STK*)&AppTaskUserIFStkAPP_TASK_U

27、SER_IF_STK_SIZE-1, APP_TASK_USER_IF_PRIO,APP_TASK_USER_IF_PRIO,(OS_STK *)&AppTaskUserIFStk0,APP_TASK_USER_IF_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);/os_err = OSTaskCreateExt(AppTaskKbd,(void *)0,(OS_STK*)&AppTaskKbdStkAPP_TASK_KBD_STK_SIZE-1,APP_TASK_KBD_PRIO,APP_TASK_KB

28、D_PRIO,(OS_STK *)&AppTaskKbdStk0,APP_TASK_KBD_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);/ 秒更新任务os_err = OSTaskCreateExt(Clock_Updata,(void *)0,(OS_STK*)&Clock_Updata_StkClock_Updata_STK_SIZE-1,Clock_Updata_PRIO,Clock_Updata_PRIO,(OS_STK *)&Clock_Updata_Stk0, Clock_Updat

29、a_STK_SIZE, (void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);万年历中的时间用的是 STM32自带的RTC实时时钟。3.4 程序设计3.4.1 界面背景初始化。static void AppTaskUserIF (void *p_arg) (void)p_arg;INT8U err;/ 界面初始化GUI_Init();/ucgui 初始化/* 触摸屏校准 */_ExecCalibration(); GUI_SetBkColor(GUI_WHITE);/设置背景色GUI_SetColor(GUI_GRAY);设置前景色GUI_Cle

30、ar();清屏Lcd_show_bmp(0, 0,"/RTC.bmp");显示万年历背景GUI_SetFont(&GUI_FontHZ_SimSun_16);GUI_DispStringAt("/ 显示星期一/",15,47);/GUI_DispStringAt("显示星期二GUI_DispStringAt("显示星期三",44,47);三",73,47);/GUI_DispStringAt("显示星期四GUI_DispStringAt("显示星期五四",102,47);五&q

31、uot;,131,47);/GUI_SetColor(GUI_RED);用红字显示周末GUI_DispStringAt(" 六 ",160,47);显示星期六GUI_DispStringAt(" 日 ",189,47);显示星期日to_tm(RTC_GetCounter(), &s_time);/根据RTC寸钟得到万年历时间的初值,注意,这个值是根据用户查询万年历变 化GUI_SetFont(&GUI_Font16_1 );/ 设置英文字体GUI_DispDecAt(s_time.tm_year,4,13,4);/ 显示万年历的年份GUI

32、_SetFont(&GUI_FontHZ_SimSun_16);/ 设置中文字体GUI_DispString(" 年");/ 显示年GUI_SetFont(&GUI_Font16_1 );/ 设置英文字体GUI_DispDec(s_time.tm_mon,2);/ 显示万年历的月份GUI_SetFont(&GUI_FontHZ_SimSun_16);/ 设置中文字体GUI_DispString("月");/ 显示月GUI_SetFont(&GUI_Font16_1 );/ 设置英文字体GUI_DispDec(s_time.

33、tm_mday,2);/ 显示万年历的日子GUI_SetFont(&GUI_FontHZ_SimSun_16);/ 设置中文字体GUI_DispString(" 日");/ 显示日 k=getWeekDay(s_time.tm_year,s_time.tm_mon,1);/ 得到某年某月的第一天的星期数GUI_GotoXY(18,69);/ 位置设定GUI_SetFont(&GUI_Font6x8);/ 主任务执行程序void RTC_Show(uint32_t TimeVar) u8 str15; /u8 i,k;字符串暂存static flag=0;#i

34、f (GUI_SUPPORT_CURSOR|GUI_SUPPORT_TOUCH) GUI_CURSOR_Show();/ 鼠标显示#endifWM_SetCreateFlags(WM_CF_MEMDEV); /* Automatically use memory devices on all windows */if(flag=0)/ 建立按键 F1-F5_ahButton0 =BUTTON_Create(5, 0, 32,13, WM_CF_STAYONTOP | WM_CF_MEMDEV); _ahButton1=BUTTON_Create(5, 29, 32,13, WM_CF_STAY

35、ONTOP | WM_CF_MEMDEV); _ahButton2=BUTTON_Create(53, 0, 16,13, WM_CF_STAYONTOP | WM_CF_MEMDEV); _ahButton3=BUTTON_Create(53,29,16,13, WM_CF_STAYONTOP | WM_CF_MEMDEV);GUI_KEY_F1 ,GUI_KEY_F2 ,GUI_KEY_F3 ,GUI_KEY_F4 ,WM_CF_SHO|WWM_CF_SHO|WWM_CF_SHO|WWM_CF_SHOW|/ 初始化按键,只执行一次。WM_CF_SHO|WWM_CF_SHOW|_ahButt

36、on4=BUTTON_Create(85, 0, 16,13, GUI_KEY_F5, WM_CF_STAYONTOP | WM_CF_MEMDEV);_ahButton5=BUTTON_Create(85,29, 16,13, GUI_KEY_F6, WM_CF_STAYONTOP | WM_CF_MEMDEV);/ 按键字体设置BUTTON_SetFont(_ahButton0,&GUI_Font6x8);/GUI_Font16_ASCIIBUTTON_SetFont(_ahButton1,&GUI_Font6x8);/GUI_Font16_ASCIIBUTTON_SetF

37、ont(_ahButton2,&GUI_Font6x8);/GUI_Font16_ASCIIBUTTON_SetFont(_ahButton3,&GUI_Font6x8);/GUI_Font16_ASCIIBUTTON_SetFont(_ahButton4,&GUI_Font6x8);/GUI_Font16_ASCIIBUTTON_SetFont(_ahButton5,&GUI_Font6x8);/GUI_Font16_ASCII/ 按键背景色设置BUTTON_SetBkColor(_ahButton0,0,GUI_DARKMAGENTA);/ 按键背景颜色BU

38、TTON_SetBkColor(_ahButton1,0,GUI_DARKMAGENTA);BUTTON_SetBkColor(_ahButton2,0,GUI_DARKMAGENTA);BUTTON_SetBkColor(_ahButton3,0,GUI_DARKMAGENTA);BUTTON_SetBkColor(_ahButton4,0,GUI_DARKMAGENTA);BUTTON_SetBkColor(_ahButton5,0,GUI_DARKMAGENTA); / 按键前景色设置BUTTON_SetTextColor(_ahButton0,0,GUI_WHITE);BUTTON_S

39、etTextColor(_ahButton1,0,GUI_WHITE);BUTTON_SetTextColor(_ahButton2,0,GUI_WHITE);BUTTON_SetTextColor(_ahButton3,0,GUI_WHITE);BUTTON_SetTextColor(_ahButton4,0,GUI_WHITE);BUTTON_SetTextColor(_ahButton5,0,GUI_WHITE);/ 按键显示字符BUTTON_SetText(_ahButton0, "+");BUTTON_SetText(_ahButton1, "-&quo

40、t;);BUTTON_SetText(_ahButton2, "+");BUTTON_SetText(_ahButton3, "-");BUTTON_SetText(_ahButton4, "+");BUTTON_SetText(_ahButton5, "-");flag=1;u8 key = GUI_GetKey();/ 实时获得触摸按键的值if(key=40)/ 年数增加按钮s_time.tm_year+;/F1if(s_time.tm_year>2099)/ 超过范围处理s_time.tm_year=1

41、970;else if(key=41)/ 年数减小按钮s_time.tm_year-;/F2if(s_time.tm_year<1900)/ 超过范围处理s_time.tm_year=2099;else if(key=42)/ 月数增加按钮s_time.tm_mon+;/F3if(s_time.tm_mon>12)/ 超过范围处理s_time.tm_mon=1;else if(key=43)/ 月数减小按钮s_time.tm_mon-;/F4if(s_time.tm_mon<0)/ 超过范围处理s_time.tm_mon=12;else if(key=44)30/ 日数增加按

42、钮s_time.tm_mday+;/F5if(s_time.tm_mday>getDays(s_time.tm_year,s_time.tm_mon)/ 超过范围处理s_time.tm_mday=1;else if(key=45)/ 日数减小按钮s_time.tm_mday-;/F6/if(s_time.tm_mday<0)超过范围处理 s_time.tm_mday=getDays(s_time.tm_year,s_time.tm_mon);GUI_SetFont(&GUI_Font16_1 );GUI_DispDecAt(s_time.tm_year,4,13,4);/

43、显示万年历的年数/GUI_SetFont(&GUI_FontHZ_SimSun_16);GUI_DispString(" 年");显示年GUI_SetFont(&GUI_Font16_1 );GUI_DispDec(s_time.tm_mon,2);/ 显示万年历的月数/GUI_SetFont(&GUI_FontHZ_SimSun_16);GUI_DispString(" 月");显示月GUI_SetFont(&GUI_Font16_1 );GUI_DispDec(s_time.tm_mday,2);/ 显示万年历的日数G

44、UI_SetFont(&GUI_FontHZ_SimSun_16);GUI_DispString(" 日");/ 显示日GUI_DispString(" ");GetChinaCalendarStr(u16)systmtime.tm_year,(u8)systmtime.tm_mon,( u8)systmtime.tm_mday,str);GUI_DispString(str);GUI_SetColor(GUI_RED);字体颜色GUI_DispString(" 万年历 "); k=getWeekDay(s_time.tm_y

45、ear,s_time.tm_mon,1);得到某年某月的第一天的星期数/阳历转阴历/ 显示阴历/GUI_GotoXY(18,69);位置设定GUI_SetFont(&GUI_Font6x8);/万年历日子显示for(i=1;i<=40;i+) 第一行最少显示一个,第六行最多显示二个, i 的上限只需要大于 37 即可 if(i<k+1|i>getDays(s_time.tm_year,s_time.tm_mon)+k) 本月 1 号前和最后一天后的格子显示清零GUI_DispString(" ");/ 显示空格,用于清除之前数据else if(i+

46、1)%7=0|i%7=0)/ 如果为星期六和星期天,字体设置为红色 GUI_SetColor(GUI_RED);else/ 否则为黑色GUI_SetColor(GUI_BLACK);/if(i=s_time.tm_mday+k)如果该天为所选日期,设置背景为黄色GUI_SetBkColor(GUI_YELLOW);GUI_DispDecSpace(i-k,2);/显示日子GUI_SetBkColor(GUI_WHITE);/恢复之前背景色GUI_GotoXY(GUI_GetDispPosX()+17,GUI_GetDispPosY(); 光标移动到下一个格子if(i%7=0)GUI_GotoX

47、Y(18,GUI_GetDispPosY()+27); /7 天换行显示 for(i=1;i<=40;i+) if(i<k+1|i>getDays(s_time.tm_year,s_time.tm_mon)+k)/ 本月 1 号前和最后一天后的格子显示清零GUI_DispString(" ");/ 显示两个中文空格,占两个中文字符else GUI_SetColor(GUI_BLUE);/ 正常显示蓝色/if(i=s_time.tm_mday+k) 如果该天为所选日期,设置背景为黄色GUI_SetBkColor(GUI_YELLOW); GUI_SetBkC

48、olor(GUI_WHITE);/恢复背景色 GUI_GotoXY(GUI_GetDispPosX()+7,GUI_GetDispPosY();if(i%7=0) GUI_GotoXY(12,GUI_GetDispPosY()+27); WM_ExecIdle();/刷新屏幕/* 输出公历时间 */GUI_SetFont(&GUI_Font16_1 );/GUI_DispDecAt(systmtime.tm_year, 240, 60,4); 显示当前年GUI_DispString("-");/GUI_DispDec(systmtime.tm_mon,2); 显示当

49、前月GUI_DispString("-");/GUI_DispDec(systmtime.tm_mday,2); 显示当前日/GUI_DispDecAt(systmtime.tm_hour,240,76,2); 显示当前时GUI_DispString(":");GUI_DispDec(systmtime.tm_min,2);/显示当前分GUI_DispString(":");GUI_DispDec(systmtime.tm_sec,2);/显示当前秒GUI_SetFont(&GUI_FontHZ_SimSun_16);GUI_

50、DispStringAt(" 星期 ",240,92);显示当前星期GUI_DispString(WEEK_STRsystmtime.tm_wday);3.4.2 指定年月日的星期数 u8 getWeekDay(u16 y, u8 m, u8 d)/ 得到指定年月日的星期数 if (m = 1) m = 13;if (m = 2) m = 14;u8 week = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7 + 1;return week;3.4.3 判断是否闰年 /*判断是否闰年* 参

51、数: y 整型, 接收年份值*返回值: 整型, 只为 0或 1, 0 代表假, 1 代表真 */ u8 isRunNian(u16 y)return (y % 4 = 0 && y % 100 != 0 | y % 400 = 0) ? 1 : 0; /*整型,接收年份值 ; m 整型,接收月份值 ;整型, 是 0, 28, 29, 30, 31之间的一个数返回值为 0, 表示你调用该函数时传递了不正确的年份值或月份值3.4.4 计算某个月的天数 * 参数 : y *返回值: *注意:*/u8 getDays(u16 y, u8 m)u8 days = 0;switch(m)c

52、ase 1:case 3:case 5:case 7:case 8:case 10:case 12:days = 31; break;case 4:case 6:case 9:case 11:days = 30; break;case 2:days = isRunNian(y) ? 29 : 28; break;default:;return days;3.4.5 判断是否为节气/函数名称 :GetJieQiDay功能描述 :输入公历日期得到 24 节气字符串/是否为节气/入 : year公历年/month公历月/day公历日/str输 出 : 1/储存 24 节气字符串地址成功失败5Byte

53、/ / u8 GetJieQiDay(u16 year,u8 month,u8 day,u8 *str) u8 JQdate,JQ;u8 NLyear4;StrCopy(&str0,(u8 *)"初一",5);if(GetJieQi(year,month,day,&JQdate)=0) JQ = (month-1) *2 ;(0 23if(day >= 15) JQ+;if(day=JQdate)气日/return 0;获得节气顺序标号判断是否是上半月今天正是一个节StrCopy(str,(u8 *)JieQiStrJQ,5);return 1; else/今天不是一个节气日GetChinaCalendar(year,month,day,(u8 *)NLyear);if(NLyear3>10)StrCopy(&str0,(u8*)nonglidayNLyear3/10,2);elseStrCopy(&str0,(u8 *)"初 ",2);StrCopy(&str2,(u8 *)mo

温馨提示

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

评论

0/150

提交评论