基于单片机的电子日历时钟系统
基于单片机的万年历设计

基于单片机的万年历设计一、系统总体设计基于单片机的万年历系统主要由单片机控制模块、时钟模块、显示模块、按键模块和电源模块等组成。
单片机控制模块是整个系统的核心,负责处理和协调各个模块之间的数据传输和控制信号。
通常选用具有较高性能和稳定性的单片机,如 STC89C52 等。
时钟模块用于提供准确的时间信息,常见的有 DS1302 等芯片,能够实现年、月、日、时、分、秒的精确计时。
显示模块用于将时间等信息直观地展示给用户,可采用液晶显示屏(LCD)或数码管。
LCD 显示效果清晰、美观,但成本相对较高;数码管则价格低廉,显示简单明了。
按键模块用于用户对万年历进行设置和操作,如调整时间、设置闹钟等。
电源模块为整个系统提供稳定的电源供应,保证系统的正常运行。
二、硬件设计1、单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。
晶振电路为单片机提供时钟信号,保证其正常工作;复位电路则用于在系统出现异常时将单片机恢复到初始状态。
2、时钟模块电路DS1302 时钟芯片通过串行方式与单片机进行通信,其引脚连接到单片机的相应 I/O 口。
通过对 DS1302 进行读写操作,可以获取和设置时间信息。
3、显示模块电路若采用 LCD1602 液晶显示屏,其数据线和控制线与单片机的 I/O 口相连。
通过编程控制单片机向 LCD 发送指令和数据,实现时间等信息的显示。
4、按键模块电路通常使用独立按键,将按键的一端接地,另一端连接到单片机的I/O 口,并通过上拉电阻保证在按键未按下时引脚处于高电平。
当按键按下时,引脚电平被拉低,单片机通过检测引脚电平的变化来判断按键的操作。
三、软件设计软件设计主要包括主程序、时钟模块驱动程序、显示模块驱动程序和按键处理程序等。
主程序负责初始化各个模块,并进行循环检测和处理。
在循环中,不断读取时钟模块的时间数据,然后通过显示模块进行显示,并检测按键是否有操作。
时钟模块驱动程序根据 DS1302 的通信协议,实现对时钟芯片的读写操作,从而获取和设置时间。
基于单片机的电子万年历

论文题目基于单片机的电子万年历(英文)Design of Electronic Calendar basedon single Chip Microcomputer摘要现今信息技术飞速发展,时间和每一个人都有非常密切的相互联系,时间对任何人都有着非常重要的影响。
随着科技的快速发展,流逝的时间,我们从根据太阳来判断时间,发展到了用钟摆看时间,到现在又有了各种电子表等。
当各类电子表在我们生活中广泛应用的时候,电子万年历的的出现又把我们引入到一个全新的时代。
电子万年历是一种使用非常广泛的日常计时工具,对现代社会越来越流行。
它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,还具有时间校准等功能。
本设计是基于51系列的单片机进行的电子万年历设计,主要由时钟芯片DS1302采集数据到单片机进行处理再通过LCD1602显示出来。
电子万年历的软件部分是使用c语言编写,主要用到的硬件电路有时钟芯片DS1302、液晶显示LCD1602,主控制芯片AT89C51,还有按键。
关键词:单片机, LCD602, AT89C51 ,DS302AbstractNowadays information technology develops rapidly, and time and everyone have very close interconnections, and time has a very important influence on anyone. With the rapid development of science and technology, the time elapsed, we judge the time according to the sun, develop to use the pendulum to watch the time, and now have all kinds of electronic watches and so on. When all kinds of electronic watches are widely used in our lives, the advent of electronic calendar brings us to a whole new era. Electronic calendar is a kind of widely used daily timing tool, which is becoming more and more popular in modern society. It can time the year, month, day, Sunday, hour, minute, second, also have leap year compensation and so on many functions, still have time calibration and so on function.This design is based on the electronic calendar design of 51 series of single-chip microcomputer, mainly by the clock chip DS1302 collecting data to the single chip microcomputer for processing and then through LCD1602. The software part of the electronic calendar is written in c language. The main hardware circuits used are clock chip DS1302, liquid crystal display LCD1602, master control chip AT89C51, and buttons.Key words:Microcontroller;LCD1602;AT89C51;DS1302目录目录 (3)第1章绪论 (4)1.1背景及目的 (4)1.1.1课题研究背景 (4)1.1.2选题的意义及目的 (4)1.2 国内外发展现状及水平 (4)第2章系统的方案选择及论证 (6)2.1 单片机芯片选择 (6)2.2 时钟芯片的选择与论证 (6)2.3 显示模块的选择与论证 (6)2.4 电路设计最终方案 (7)第3章系统的硬件设计与实现 (8)3.1 电路设计框图 (8)3.2系统硬件概述 (8)3.3 系统的电路设计 (8)3.3.1 系统总体电路设计图 (9)3.3.2单片机主控制模块 (9)3.3.3 时钟电路模块 (12)3.3.4 显示模块 (16)第4章系统的软件设计 (19)4.1 程序流程框图: (19)第5章Proteus软件仿真与测试 (22)5.1 仿真软件介绍 (22)5.2 Proteus 仿真效果 (22)第6章总结与体会 (24)参考文献 (25)附录1:程序 ..................................................... 错误!未定义书签。
基于单片机的电子万年历设计

基于单片机的电子万年历设计一、概述随着科技的快速发展和人们对生活品质的追求,电子设备在日常生活中扮演着越来越重要的角色。
电子万年历作为一种集日期、时间显示于一体的实用电子产品,已经深入到人们的日常生活和工作中。
传统的机械式日历已经无法满足现代人对时间精确性和功能多样性的需求,基于单片机的电子万年历设计应运而生,成为了当前研究的热点之一。
基于单片机的电子万年历设计,旨在利用单片机(如STC89CAT89C51等)的强大计算和控制能力,结合液晶显示屏(LCD)、按键输入等外设,实现时间的准确显示、日期的自动更新、闹钟提醒、温度显示等多样化功能。
该设计不仅具有高度的集成性和可靠性,而且能够通过编程实现各种定制化的功能,满足不同用户的需求。
本文将对基于单片机的电子万年历设计进行详细的介绍和分析,包括设计思路、硬件组成、软件编程等方面。
通过本文的阅读,读者可以了解电子万年历的基本原理和设计方法,掌握单片机在电子万年历设计中的应用技巧,为实际的开发工作提供有益的参考和借鉴。
1.1 研究背景与意义随着科技的不断进步,人们日常生活和工作中对于时间的精度和便捷性的要求日益提高。
传统的机械式日历和简单的电子时钟已经无法满足现代生活的需求。
电子万年历作为一种集时间显示、日历查询、定时提醒等多功能于一体的电子装置,在日常生活、工作乃至科研领域都具有广泛的应用价值。
基于单片机的电子万年历设计,不仅可以提供准确的时间显示,还能实现复杂的日期计算、农历显示、节假日提示等功能,极大地提高了时间管理的效率和便捷性。
单片机作为一种集成度高、功耗低、价格适中的微型计算机,非常适合用于小型化、智能化的电子产品设计,如电子万年历。
本研究的意义在于,通过对基于单片机的电子万年历的设计研究,可以推动微型计算机技术和电子时钟技术的融合发展,提升电子产品的智能化水平,满足人们日益增长的生活和工作需求。
同时,该研究还可以为相关领域的技术人员提供参考和借鉴,推动电子万年历产品的不断创新和优化。
基于单片机的万年历设计

一、引言万年历是一种显示当前日期和时间的器件或软件。
随着科技的发展,电子产品普及率愈来愈高,基于单片机的万年历设计成为了一种非常受欢迎的设计方案。
本文将介绍一种基于单片机的万年历设计。
二、设计原理1.显示模块:采用液晶显示屏作为显示模块,可以显示日期、时间等信息。
2.时钟模块:基于RTC(实时时钟)模块,用于获取当前日期和时间。
3.按键模块:采用按键模块作为输入模块,用于设置日期和时间、切换显示模式等。
4.控制模块:基于单片机,用于控制各个模块的工作,并进行相关的计算和显示。
三、硬件设计1.单片机选择在本设计中,选择了一款常用的单片机,STM32F103C8T6、它具有低功耗、高性能的特点,并且具备丰富的外设接口,非常适合用来设计万年历。
2.RTC模块选择在本设计中,选择了一款常用的RTC模块,DS1302、它具有低功耗、稳定性好的特点,并且具备SPI接口,非常适合用来获取当前日期和时间。
3.液晶显示屏选择在本设计中,选择了一款常用的液晶显示屏,1602液晶显示屏。
它具有较大的屏幕尺寸、低功耗的特点,并且可以显示多行字符,非常适合用来显示日期、时间等信息。
4.按键模块选择在本设计中,选择了一款常用的按键模块,4x4按键模块。
它具备4行4列的按键布局,可以满足设置日期和时间、切换显示模式等功能的需求。
五、软件设计1.初始化设置在软件设计中,首先需要对各个硬件模块进行初始化设置。
2.获取当前日期和时间使用RTC模块获取当前日期和时间,并将其存储在相应的变量中。
3.显示日期和时间使用液晶显示屏将当前日期和时间显示出来。
4.设置日期和时间通过按键模块获取用户的输入,并将对应的日期和时间设置到RTC模块中。
5.切换显示模式通过按键模块获取用户的输入,并根据用户的选择切换不同的显示模式,例如切换到年模式、月模式、日模式等等。
六、总结通过以上的设计,基于单片机的万年历完成了日期和时间的获取、显示和设置等功能。
基于单片机的多功能电子万年历设计

引言随着生活节奏的日益加快,人们的时间观也越来越重,同时对电子钟表、日历的需求也随之提高。
因此,研究实用电子时钟及其扩展应用,有着非常现实的意义,具有很大的实用价值。
本系统程序由主程序、中断服务函数和多个子函数构成。
主函数主要完成各子函数和中断函数的初始化。
定时中断函数主要完成时钟芯片的定时扫描及键盘扫描。
时钟芯片的读写函数主要是将时间、日历信息读出来,并把要修改具体值写入时钟芯片内部。
系统的硬件设计与电路原理电路设计框图系统硬件概述本电路是由AT89S52单片机为控制核心,具有在线编程功能、低功耗、能在3V的超低压工作。
时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
可产生年、月、日、周日、时、分、秒,具有使用寿命长、精度高和低功耗等特点,同时具有掉电自动保存功能。
主控制模块单片机主控制模块的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。
时钟电路模块时钟电路模块的设计DS1302的引脚排列如图3所示,其中Vcc1为后备电源,Vcc2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电;当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768KHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
基于单片机的多功能电子万年历系统

一、研究现状
一、研究现状
在国内外学者的研究中,单片机多功能电子万年历系统得到了广泛的。近年 来,国内外研究者纷纷致力于开发具有高精度、多功能、智能化等特点的电子万 年历系统。特别是在国内,单片机技术的快速发展为电子万年历系统的研究提供 了强有力的支持。同时,国外的发达国家如美国、日本等也在不断推进相关技术 的研发,电子万年历市场呈现出蓬勃的发展态势。
基于单片机的多功能电子万年 历系统
01 一、研究现状
目录
02 二、技术方案
03 三、系统实现
04 四、系统测试
05 五、创新点和成果
06 六、展望未来
内容摘要
随着科技的不断发展,单片机技术在电子产品中的应用越来越广泛。其中, 基于单片机的多功能电子万年历系统成为了国内外研究的热点。本次演示将详细 介绍基于单片机的多功能电子万年历系统的研究现状、技术方案、系统实现、系 统测试、创新点和成果以及展望未来。
六、展望未来
3、安全性更高:随着物联网技术的发展,未来的电子万年历可能会涉及更多 的隐私和安全问题,因此需要加强系统安全性的设计和保护。
谢谢观看
随着科技的不断发展,基于单片机的多功能电子万年历系统将会有着更加广 阔的发展前景和趋势。未来可能的发展方向和不足包括:
六、展望未来
1、功能更加强大:未来电子万年历可能会融入更多的智能家居技术,实现与 其他智能设备的互联互通,成为智能家居的一个重要组成部分。
六、展望未来
2、更加节能环保:未来的电子万年历将会更加注重节能和环保,采用更加先 进的节能技术,减少对环境的污染。
五、创新点和成果
2、多功能:除了显示时间、日期外,还具有闹钟、计步器等多种功能,满足 用户多样化的需求。
五、创新点和成果
基于单片机的电子时钟万年历设计

(2)31 8 位暂存数据存储RAM(3)串行 I/O 口方式使得管脚数量最少(4)宽范围工作电压2.0 5.5V(5)工作电流 2.0V 时,小于300nA(6)读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式(7)8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配(8)简单 3 线接口(9)与 TTL 兼容Vcc=5V(10)可选工业级温度范围-40~+85优点:串行接口的日历时钟芯片,使用简单,接口容易,与微型计算机连线较少等特点,在单片机系统尤其是手持式信息设备中己得到了广泛的应用。
所以,最终选择串行时钟芯片DS1302,DS1302的管脚图如图2所示。
图2 DS1302管脚图1.2显示模块选择方案一:LED数码管显示数码管显示比较常用的是采用CD4511和74LS138实现数码转换,数码显示分动态显示和静态显示,静态显示具有锁存功能,可以使数据显示得很清楚,但浪费了一些资源。
目前单片机数码管普通采用动态显示。
编程简单,但只能显示数字,不能显示中文。
方案二:LCD1602能够显示英文和数字。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
所以最终选择LCD1602。
2.项目功能模块2.1 89C51模块Mcs-51单片机管脚图图如图3所示:单片机管脚图2.2 1602液晶显示模块1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
基于单片机控制的电子万年历.

基于单片机控制的电子万年历摘要本设计是一个带温度显示的万年历电路系统,该电路具有年、月、日、星期、时、分、秒、闹钟显示和调整功能,并且还包含显示温度功能。
其中显示部分采用LCD1602显示,时钟部分采用DS1302时钟芯片,温度部分采用DS18B20单线温度传感器。
软件方面我们采用C语言编程,利用Keil uVision3软件编写C语言程序并且生成HEX文件。
先将程序在Proteus 仿真,通过之后再烧录到单片机中。
该设计的优点是充分利用了LCD1602的显示功能完成了万年历应该具有的功能并且还扩展了温度;不足之处是收到LCD1602显示功能的限制没能显示农历日期。
电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。
它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。
该电路采用AT89S51单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。
关键词:万年历;AT89C51;液晶显示(LCD1602);温度传感器(DS18B20);时钟芯片(DS1302);proteus仿真;目录摘要 (1)目录 (1)1引言: (2)2设计方案 (3)2.2模块选择 (4)2.3方案框图 (4)3 软件实现 (5)3.1流程图 (5)3.2程序编写 (6)3.3运行程序生成hex文件 (12)4 proteus仿真 (13)4.1软件简介 (13)4.2 Proteus电路仿真与调试 (14)5 PCB制版 (21)5.1 绘制电路原理图并仿真调试 (21)5.2加载网络表及元件封装 (21)5.3规划电路板并设置相关参数 (23)5.4元件布局及调整 (24)5.5布线并调整 (25)5.6输出及制作PCB (26)总结 (27)参考文献 (28)致谢 (29)1引言:随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录一、设计任务二、设计方案三、硬件及电路设计四、程序设计及流程图五、设计体会一、设计任务利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个电子日历时钟系统。
使用液晶显示器将日期,时间实时显示出来,并且能够通过按钮修改日期,完成实时操作并具有闹铃功能。
二、设计方案硬件选择:单片机AT89C51,DS1302时钟芯片,SED1520液晶控制器接口芯片:74LS138,74LS373,片选CS0三、硬件及电路设计(一)实验所用芯片简要介绍1、主控芯片采用单片机AT89C51AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机,与AT80C51引脚和指令系统完全兼容,可擦除只读存储器可以反复擦除1000次。
AT89C51共有128×8位内部RAM ,32可编程I/O线,两个16位定时器/计数器,5个中断源,采用全静态工作,三级程序存储器锁定和可编程串行通道,工作频率为0Hz-24MHz。
另外片内内置振荡器和时钟电路,低功耗的闲置和掉电模式。
2、实时时钟部分采用DS1302DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 2.5V~5.5V。
采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
3、SED1520液晶控制器SED1520液晶显示驱动器是一种点阵图形式液晶显示驱动器,它可直接与8位微处理器相连,集行、列驱动器于一体,因此使用起来十分方便,作为内藏式控制器被广泛应用于点阵数较少的液晶显示模块,内置显示RAM区RAM容量为2560位,RAM中的1位数据控制液晶屏上一个点的亮灭状态:“1”表示亮,“0”表示暗,具有16个行驱动口和16个列驱动口,可直接与80系列微处理器相连,亦可直接与68系列微处理器相连。
驱动占空比为1/16或1/32。
可以与SED1520配合使用,以便扩展列驱动口数目。
(二)硬件设计(三)电路图四、程序设计实验执行程序如下:#include <reg51.h>#define uchar unsigned charY 132.76...#define uint unsigned int#define PD1 61unsigned char aa,bb,cc,s1num;unsigned char curtime[];void WriteSHU16x16(unsigned char,unsigned char,unsigned char);void WriteZHI16x16(unsigned char,unsigned char,unsigned char);void Delay(unsigned char);sbit t_clk=P1^0;sbit t_io=P1^1;sbit t_rst=P1^2;sbit s1=P1^5;sbit s2=P1^6;sbit s3=P1^7;sbit sv=reset;unsigned int i;unsigned char Column;unsigned char Page_ ;unsigned char Code_ ;unsigned char Column1;unsigned char Page;unsigned char Code1 ;unsigned char Command;unsigned char LCDData;xdata unsigned char CWADD1 _at_ 0x8000; xdata unsigned char DWADD1 _at_ 0x8001; xdata unsigned char CRADD1 _at_ 0x8002; xdata unsigned char DRADD1 _at_ 0x8003; xdata unsigned char CWADD2 _at_ 0x8004; xdata unsigned char DWADD2 _at_ 0x8005; xdata unsigned char CRADD2 _at_ 0x8006; xdata unsigned char DRADD2 _at_ 0x8007; code unsigned char SHUTAB[][16]={{0x3E,0x51,0x49,0x45,0x3E}, // -0- {0x00,0x42,0x7F,0x40,0x00}, // -1-{0x62,0x51,0x49,0x49,0x46}, // -2-{0x21,0x41,0x49,0x4D,0x33}, // -3-{0x18,0x14,0x12,0x7F,0x10}, // -4-{0x27,0x45,0x45,0x45,0x39}, // -5-{0x3C,0x4A,0x49,0x49,0x31}, // -6-{0x01,0x71,0x09,0x05,0x03}, // -7-{0x36,0x49,0x49,0x49,0x36}, // -8-{0x46,0x49,0x49,0x29,0x1E}, // -9-{0x00,0x08,0x08,0x08,0x00},// --- };code unsigned char CCTAB[][32] ={{0x00,0x20,0x10,0xCC,0x47,0x44,0x44,0xFC,0x44,0x44,0x44,0x64,0x46,0x04,0x00,0x00,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00},{0x00,0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0xFF,0x02,0x00,0x00,0x00,0x00,0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFF,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,0x00} };void wr_1302(unsigned char add,unsigned char date) { uchar i;t_rst=0;t_clk=0;t_rst=1;for(i=0;i<8;i++) { if(add&0x01)t_io=1;elset_io=0;t_clk=1;t_clk=0;add>>=1;}for(i=0;i<8;i++) { if(date&0x01)t_io=1;elset_io=0;t_clk=1;t_clk=0;date>>=1;}t_rst=0;}unsigned char re_1302(unsigned char add) { uchar date,i;t_rst=0;t_clk=0;t_rst=1;for(i=0;i<8;i++){ if(add&0x01)t_io=1;elset_io=0;t_clk=1;t_clk=0;add>>=1;}for(i=0;i<8;i++){ date>>=1;if(t_io)date=date|0x80;t_clk=1;t_clk=0;}t_rst=0;return(date);}void set_1302(){ wr_1302(0x8e,0x00);wr_1302(0x8c,curtime[6]);wr_1302(0x8a,curtime[5]);wr_1302(0x88,curtime[4]);wr_1302(0x86,curtime[3]);wr_1302(0x84,curtime[2]);wr_1302(0x82,curtime[1]);wr_1302(0x80,curtime[0]);wr_1302(0x8e,0x80);}void get_1302(){ cc=re_1302(0x81);aa=cc>>4;bb=cc&0x0f;WriteSHU16x16(0x04,0x30,aa);Delay(5);WriteSHU16x16(0x04,0x38,bb);curtime[0]=aa*10+bb;cc=re_1302(0x83);aa=cc>>4;bb=cc&0x0f;WriteSHU16x16(0x04,0x18,aa);Delay(5);WriteSHU16x16(0x04,0x20,bb);curtime[1]=aa*10+bb;cc=re_1302(0x85);aa=cc>>4;bb=cc&0x0f;WriteSHU16x16(0x04,0x00,aa);Delay(5);WriteSHU16x16(0x04,0x08,bb); curtime[2]=aa*10+bb;cc=re_1302(0x87);aa=cc>>4;bb=cc&0x0f;WriteSHU16x16(0x02,0x40,aa); Delay(5);WriteSHU16x16(0x02,0x48,bb); curtime[3]=aa*10+bb;cc=re_1302(0x89);aa=cc>>4;bb=cc&0x0f;WriteSHU16x16(0x02,0x20,aa); Delay(5);WriteSHU16x16(0x02,0x28,bb); curtime[4]=aa*10+bb;cc=re_1302(0x8d);aa=cc>>4;bb=cc&0x0f;WriteSHU16x16(0x02,0x00,aa);Delay(5);WriteSHU16x16(0x02,0x08,bb);curtime[6]=aa*10+bb;WriteSHU16x16(0x04,0x10,10);WriteSHU16x16(0x04,0x28,10);WriteZHI16x16(0x02,0x10,0);WriteZHI16x16(0x02,0x30,1);WriteZHI16x16(0x02,0x50,2);}void WriteCommandE1(unsigned char Command) {while(CRADD1 & 0x80);CWADD1 = Command;}void WriteDataE1(unsigned char LCDData){ while(CRADD1 & 0x80);DWADD1 = LCDData;}void ReadDataE1(unsigned char DRADD1){ while(CRADD1 & 0x80);LCDData = DRADD1;}void WriteCommandE2(unsigned char Command) { while(CRADD2 & 0x80);CWADD2 = Command;}void WriteDataE2(unsigned char LCDData){ while(CRADD2 & 0x80);DWADD2 = LCDData;}void ReadDataE2(unsigned char DRADD2){ while(CRADD2 & 0x80);LCDData = DRADD2;}void Init(){ WriteCommandE1(0xe2); WriteCommandE2(0xe2); WriteCommandE1(0xa4);WriteCommandE2(0xa4); WriteCommandE1(0xa9); WriteCommandE2(0xa9); WriteCommandE1(0xa0); WriteCommandE2(0xa0); WriteCommandE1(0xc0); WriteCommandE2(0xc0); WriteCommandE1(0xaf); WriteCommandE2(0xaf);}void Clear(){ unsigned char i,j;for(i=0;i<4;i++){ WriteCommandE1(i+0xb8);WriteCommandE2(i+0xb8);WriteCommandE1(0x00);WriteCommandE2(0x00);for(j=0;j<61;j++){ WriteDataE1(0x00);WriteDataE2(0x00);}}}void Delay(unsigned int z){unsigned int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void WriteSHU16x16(unsigned char Page_,unsigned char Column,unsigned char Code_){ unsigned int i,j,k;i = 0;j = 0;while(j<2){ WriteCommandE1(((Page_ + j) & 0x03) | 0xb8);WriteCommandE2(((Page_ + j) & 0x03) | 0xb8);k = Column;while(k<Column + 8){ if (k < PD1){ WriteCommandE1(k);LCDData = SHUTAB[Code_][i];WriteDataE1(LCDData);}else{ Command = k-PD1;WriteCommandE2(Command);LCDData = SHUTAB[Code_][i];WriteDataE2(LCDData);};i++;if( ++k >= PD1 * 2) break;} ;j++;};}void WriteZHI16x16(unsigned char Page,unsigned char Column1,unsigned char Code1){ unsigned int i,j,k;i = 0;j = 0;while(j<2){ WriteCommandE1(((Page + j) & 0x03) | 0xb8);WriteCommandE2(((Page + j) & 0x03) | 0xb8);k = Column1;while(k<Column1 + 16){ if (k < PD1){ WriteCommandE1(k);LCDData = CCTAB[Code1][i];WriteDataE1(LCDData);}else{ Command = k-PD1;WriteCommandE2(Command);LCDData = CCTAB[Code1][i];WriteDataE2(LCDData);};i++;if( ++k >= PD1 * 2) break;} ;j++;};}void keyscan(){s1num = 0;sv=0;if(s1==0){ Delay(5);if(s1==0){ s1num++;while(!s1);}}if(s1num!=0){ if(s1num==1){if(s2==0){Delay(5);if(s2==0){ if(curtime[0]==59){curtime[0]=0;}else curtime[0]++;}}if(s3==0){Delay(5);if(s3==0){ if(curtime[0]==0){curtime[0]=59;}else curtime[0]--;}}}if(s1num==2){ if(s2==0){Delay(5);if(s2==0){ if(curtime[1]==59){curtime[1]=0;}else curtime[1]++;}}if(s3==0){Delay(5);if(s3==0){ if(curtime[1]==0){curtime[1]=59;}else curtime[1]--;}}}if(s1num==3){ if(s2==0){Delay(5);if(s2==0){ if(curtime[2]==23){curtime[2]=0;}else curtime[2]++;}}if(s3==0){Delay(5);if(s3==0){ if(curtime[2]==0){curtime[2]=23;}else curtime[2]--;}}}if(s1num==4){ if(s2==0){Delay(5);if(s2==0){ if(curtime[3]==31){curtime[3]=1;}else curtime[3]++;}}if(s3==0){Delay(5);if(s3==0){ if(curtime[3]==1){curtime[3]=31;}else curtime[3]--;}}}if(s1num==5){ if(s2==0){Delay(5);if(s2==0){ if(curtime[4]==12){curtime[4]=1;}else curtime[4]++;}}if(s3==0){Delay(5);if(s3==0){ if(curtime[4]==1){curtime[4]=12;}else curtime[4]--;}}}if(s1num==6){ if(s2==0){Delay(5);if(s2==0){ if(curtime[6]==99){curtime[6]=0;}else curtime[6]++;}}if(s3==0){Delay(5);if(s3==0){ if(curtime[6]==0){curtime[6]=99;}else curtime[6]--;}}}if(s1num==7){s1num=0;}set_1302();get_1302();}}void main(){ Init();Clear();set_1302();while(1){keyscan();get_1302();}}.。