视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
基于LCD1602液晶显示屏的电子万年历设计【两个C程序】
2025-09-30 23:24:48 责编:小OO
文档
基于LCD1602液晶显示屏的电子万年历设计

 基于LCD1602液晶显示屏的电子万年历设计

摘  要

  现在是一个知识爆炸的新时代,新产品、新技术层出不穷,电子技术的发展更是日新月异。可以毫不夸张的说,电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。因此我们需要一个定时系统来提醒这些忙碌的人,而数字化的钟表给人们带来了极大的方便。由于单片机具有灵活性强、成本低、功耗低、保密性好等特点,所以电子日历时钟一般都以单片机为核心,外加一些外围设备来实现。

   本设计是一种基于液晶显示屏的电子万年历,该系统结合了LCD显示技术,断电时间保护技术和语音录放技术,系统用点阵式液晶显示时间和日期,具有人性化和美观的页面效果,除具备传统的万年历所具有的时间显示和调整功能之外,该系统还兼有语音报时,闰年补偿等功能;以单片机的C51语言进行软件设计,增加了程序的可读性和可移植性,为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。实际使用中该设计能准确地显示时间和日期,能准确清晰地完成语音报时功能。

 

关键词:  单片机,LCD,语音报时,万年历

 

引言  

    万年历是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。因此,研究万年历及扩大其应用,有着非常现实的意义。

市场上有许多电子钟的专用芯片如:LM8363、LM8365等,但它们功能单一,电路连接复杂,不便于调试制作!但是考虑到用单片机配合时钟芯片,可制成功能任意的电子钟,而且可以做到硬件简单、成本低廉。所以本系统采用了以广泛使用的单片机ATC51技术为核心,配合时钟芯片DS1302。软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行,此外结合音乐闹铃电路、看门狗和供电电路。本方案设计出的数字钟可以显示时间、设置闹铃功能之外。

本设计中我重点研究实现了单片机+时钟芯片这种模式的万年历,从原理上对单片机和时钟芯片有了深一步的认识,这些基本功能完成后,在软件基础上实现世界时,农历功能。

本设计在很多场合都能用到,可以把此万年历装在镜框中或其它工艺品中,以便更加实用。

第一章     概论  1.1系统总体框图

本设计的核心部分为单片机控制器,系统的各项功能由其它各部分单元电路来完成,单元电路主要包括:时钟电路部分、显示部分、语音部分、人机交互控制接口部分等,单片机通过程序来控制其它各部分统一协调地来完成系统的各项功能,本设计硬件电路较简单,但软件部分较复杂,所有功能都要通过软件来实现,系统总体设计如图1-1所示。

 SHAPE  \\* MERGEFORMAT 

图1-1  系统总体设计框图

1.2 主控制器单片机的选择

采用比较流行的ATS52作为电路的控制核心,ATS52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程(具有ISP功能),亦适于常规编程器。在单芯上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得ATS52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

采用ATC55,它是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含20kbytes 的可反复擦写的Flash只读程序存储器(ROM)和256*8bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8 位处理器(CPU)和Flash存储单元,功能强大ATC55单片机适合于许多较为复杂控制应用场合。

虽然ATS52的ISP下载功能非常优秀,但它只有8KROM,由于本设计的程序代码比较多,所以选用ATC55(具有20KROM)。

1.3 时钟电路的选择

采用时钟芯片DS1302,DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM指示决定采用24或12小时格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三根口线:⑴RES(复位),⑵I/O(数据线),⑶SCLK(串行时钟)。时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW[1]。

DS1302是由DS1202改进而来的,增加了以下的特性:双电源管脚用于主电源和备份电源供应,Vcc1为可编程涓流充电电源,附加七个字节存储器。它广泛应用于电话、传真、便携式仪器以及电池供电的仪器仪表等产品领域。

●实时时钟具有能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年自动调整和补偿的能力;

●31×8位RAM;

●串行I/O口方式使得管脚数量最少;

●宽范围工作电压:2.0-5.5V;

●工作电流:2.0V 时,小于300nA;

●读/写时钟或RAM数据时,有两种传送方式:单字节传送和多字节传送(字符组方式);

●8脚DIP 封装或可选8脚SOIC;

●简单3 线接口;

●与TTL 兼容(Vcc=5V);

●可选工业级温度范围:-40℃-+85℃;

●与DS1202 兼容。

1.4 语音报音电路的选择

直接使用语音芯片,语音芯片具有使用方便,外围元件少,只需少量元件就可以组成一个功能齐全的固体录放机,重放时音质好,没有常见的背景噪音,提供零功率信息存储,无需备用电源,掉电后录音内容可永久保留等优点。

ISD1420P语音芯片采用 CMOS 技术,单片录放时间20秒,音质好,内含震荡器、话筒前置放大、自动增益控制、防混淆滤波器、平滑滤波器、扬声器驱动及 EEPROM 阵列。最小的录放系统仅需麦克风、喇叭、两个按钮、电源及少数电阻电容。在录放操作结束后,芯片自动进入低功耗节电模式、功耗仅 0.5uA,芯片采用多电平直接模拟量存储专利技术,每个采样直接存储在片内单个 EEPROM 单元中,因此能够非常真实、自然地再现语音、音乐、音调等各种效果,避免了一般固体录音因电路量化和压缩造成的量化噪声和“金属声”。采样频率从 5.3,6.4 到 8.0KHz,对音质仅有轻微影响。片内信息可保存 100 年(无需电源),EEPROM 单片可反复录音十万次,能直接驱动16Ω以上的喇叭[2]。

1.5 显示电路和键盘的选择

显示采用1602液晶屏,它能显示2行,每行显示16个数字或字母(5*7字型),也可显示一行,每行16个字(5*10字型),可显示的内容比较多(包括数字,字母和很多符号),采用并行数据传送,这样1602LCD共占用单片机11个口线,相对于数码管,占用口线少,电路简单,无需外围驱动电路,占用PCB面积也较少;但对于编程来说,液晶显示的编程比较复杂,而且亮度也比较差,只能在近距离看到时间和日期,能见度不如数码管好。

键盘部分比较简单,只用到4个按键,采用式非编码键盘。

第二章  系统硬件电路设计 2.1 系统整体硬件电路设计

本设计采用时钟芯片作为时钟的基准,并且该芯片具有断电保护时间功能(断电后采用3.5v电子供电),显示部分采用LCD显示,可以显示年月日时分秒星期等等,该万年历具有随时可调整时分秒年月日的功能,最明显的功能是具有语音报时的功能,比已有的单调的闹钟声音更具有亲和力,具体的调整,录音和功能设置采用4个按键和LCD显示屏共同来实现。总体硬件设计框图如图2-1所示:

 SHAPE  \\* MERGEFORMAT 

图2-1 语音万年历系统原理框图

2.2 硬件单元电路设计

单元电路主要由单片机最小系统、时钟芯片电路、LCD显示电路、功能键电路、语音电路等组成。

2.2.1 单片机最小系统设计

ATC55单片机有40脚PDIP、42脚PDIP等,本系统采用40脚PDIP的封装,其引脚如图2-2所示,ATC55是ATC5×系列单片机中性能居中、很有代表性的产品,其主要特性如下:(1)兼容MCS–51产品;(2)20K字节可擦写1000次以上Flash ROM;(3)工作电压为+4V~+5.5V;(4)有256*8字节RAM;(5)32个可编程I/O口;(6)3个16位定时/计数器;(7)8个中断源;(8)一个全双工UART串行通信口;(9)静态工作频率在0~33Mhz;(10)休眠和节电保持两种省电模式;(11)中断唤醒省电模式功能;(12)看门狗定时器;(13)双数据指针(DPTR);(14)电源关闭标志。它相对ATC51、C52增加了ROM空间,内部看门狗定时器、双数据指针,全新的加密算法等功能,但价格基本不变,甚至更低。

对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路。电路如图2-3所示。

图2-2   ATC55单片机引脚图                   图2-3   ATC55单片机最小系统图

2.2.2 时钟电路设计

一、 DS1302 的管脚排列及描述

管脚描述:(管脚排列如图2-4所示)

图2-4  DS1302管脚配置图

Vcc1:主电源;

Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电;

SCLK:串行时钟输入;

I/O:双向数据线;     

RST:复位信号,在读、写数据期间,必须为高;   

X1,X2:晶振输入端

二、DS1302 的内部原理图

DS1302 的内部原理图如图2-5所示,主要由电源控制、晶体振荡、输入移位寄存器、通讯与控制逻辑和RAM组成,晶体振荡负责产生最小时钟单位,输入移位寄存器负责数据的输入与输出,RAM用来存储数据。

 SHAPE  \\* MERGEFORMAT 

图2-5  DS1302 的内部原理图

2.2.3 语音电路设计

一、ISD1420P 的内部结构及管脚排列

ISD1420P内部结构图如图2-7所示,主要由时钟发生器(Internal Clock)、定时器(Timing)、 取样信号发生器(Sarnpling Clock)、话筒前置放大、自动增益控制(AGC)、防混淆滤波器、平滑滤波器、电源调节器(Power Conbltlonlng)、地址缓冲器(Address Buffers)、扬声器驱动(Amp)及EEPROM 阵列几部分组成.

图2-7  ISD1420P 内部结框图

管脚排列如图2-8所示;

A0~A7:地址输入端; 

VCCA,VSSA:分别为模拟电路正,负电源端;

VCCD,VSSD:分别为数字电路正,负电源端;

SP+,SP-:分别为喇叭正,负端,能驱动 16Ω以上的喇叭;

XCLK:外部时钟;

ANA IN,ANA OUT:分别为模拟输入,模拟输出;

MIC:驻极体话筒输入;

MIC REF:驻极体话筒参考输入;

AGC:自动增益控制;

/REC:录音触发(低电平有效);

/PLAYE:边沿触发放音,此端出现下降沿时,芯片开始放音;                                            图2-8  ISD1420P 引脚图[11]

/PLAYL:电平触发放音,此端出现下降沿时,芯片开始放音;     

/RECLED:录音指示,处于录音状态时,此端为低,可驱动 LED [4]。

图2-8  ISD1420P 引脚图

二,ISD1420P与单片机的连接

ISD1420P的电路图如图 2-9所示,图中LED用做录音和放音的指示灯;R8、R10和C6起到上拉的作用;通过R14和C11的时间常数来决定自动增益控制的释放时间,470KΩ和4.7uF 的标称值在绝对大多数场合下可获得满意的效果;C7为电源和地之间的去耦电容;C9和C10为话筒的耦合电容.

图2-9  ISD1420P电路图

2.2.4显示电路设计

一、LCD1602 内部结构及管脚排列

LCD1602 内部结构如图2-10所示

图2-10  LCD1602 内部结构

●     忙碌标志:本标志(BF)用以表示当时LCD的状态,若BF=1,则表示处于忙碌状态,无法接受外部指令或数据;若BF=0,则可接受外部指令或数据。

●     显示数据存储器:本存储器(DDRAM)存储所要显示的数据。实际上本存储器里存放的是要显示数据的ASCII码,再以ASCII码为地址,到CGRAM里找到该字型的显示编码。

此外还包括字型产生器,光标闪烁控制电路,偏压电路,时序电路等等[6]。LCD1602管脚排列及功能说明如表 2-1所示。

表 2-1  LCD1602管脚排列及功能说明

二、LCD1602电路图

LCD1602电路图如图2-11所示,其中J2为8*10k欧姆的排阻作为P0口的上拉电阻,J14为1602液晶显示器件,左边的SIP16封装接口与液晶对应,电位器R7是用来调节液晶背光的对比度的,液晶的4、5、6脚与单片机相连作为控制信号,7-14脚与单片机P0口相连作为数据信号传送。

图2-11  LCD1602电路图

第三章 系统软件设计 3.1软件整体设计

系统软件主要包括以下几个模块:LCD显示模块,DS1302时钟芯片模块,ISD1420P语音芯片模块,按键处理模块等,通过这几个模块的有机结合和互相调用来完系统任务,软件总体框架结构如图 3-1所示,主程序流程图如图 3-2所示。

 SHAPE  \\* MERGEFORMAT  图3-1软件总体框架结构图

图3-2 主程序流程图及中断服务程序流程

3.2 软件子模块设计 3.2.1时钟芯片DS1302软件设计

一、DS1302编程原理

1.DS1302内部寄存器组织

DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD码形式,如表3-1所示。表 3-1  DS1302有关日历、时间的寄存器 。            

小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是,当为1时,表示PM。在24小时模式时,位5是第二个10小时位。

秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。

控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。

  DS1302中附加31字节静态RAM的地址如表4-2所示。

表3-2 DS1302数据RAM地址

DS1302的工作模式寄存器

所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。突发模式寄存器如表3-3所示。

表3-3 突发模式寄存器

此外,DS1302还有充电寄存器等。

2.读写时序说明

DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。

要想与DS1302通信,首先要了解DS1302的控制字。DS1302的控制字如图 3-3所示。

图 3-3   控制字(即地址及命令字节)

控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中;

位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;

位5至位1(A4~A0):指示操作单元的地址;

位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。

控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。数据读写时序如图 3-4所示,数据可分为单字节传送和多字节传送。

图 3-4   数据读写时序

二、DS1302软件设计模块图

DS1302软件设计模块图如图3-5所示,具体可以包括三个模块:写入数据模块、读出数据模块、初始化时间模块,每个模块又可以包含几个子函数.

 SHAPE  \\* MERGEFORMAT 

图 3-5   DS1302程序流程图

3.2.2 LCD1602显示软件设计及显示说明

LCD1602液晶显示屏是以若干个5* 8或5* 11点阵块组成的显示字符群。每个点阵块为一个字符位,字符间距和行距都为一个点的宽度,主控制驱动电路为HD44780 (HITACHI ),具有字符发生器ROM可显示192种字符160个5 *7点阵字符和32个5* 10点阵字符,具有个字节的自定义字符RAM,可自定义8个5* 8点阵字符或4个5* 11点阵字符,具有80个字节的RAM,标准的接口特性适配M6800系列MPU的操作时序,低功耗长寿命高可靠性。

一、LCD1602编程原理

1.控制器接口信号说明

控制器接口信号说明如表3-4所示

2.LCD指令说明

LCD指令说明如表3-5所示。

表3-5  LCD指令表

指令指令 码功能
RSR/WD7D6D5D4D3D2D1D0
清除

显示

0000000001将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H"
地址

归位

000000001X设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容
显示状态开/关0000001DCBD=1: 整体显示 ON,C=1: 游标ON ,   B=1:游标位置反白允许
进入点设定00000001I/DS指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位
游标或显示移位控制000001S/CR/LXX设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容
 功能

,  设定

00001DLXREXX,

DL=0/1:4/8位数据

RE=1: 扩充指令操作,

RE=0: 基本指令操作

 , ;设定CGRAM

 地址

0001AC5AC4AC3AC2AC1AC0设定CGRAM 地址
 设定DDRAM

 地址

0010AC5AC4AC3AC2AC1AC0设定DDRAM 地址(显示位址)

第一行:80H-87H第二行:90H-97H

读取忙标志和地址01BFAC6AC5AC4AC3AC2AC1AC0读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值
写数据到RAM10数据将数据D7—D0写入到内部的RAM(DDRAM/CGRAM/IRAM/GRAM)
读出RAM的值11数据从内部RAM读取数据D7—D0

(DDRAM/CGRAM/IRAM/GRAM)

3.LCD字型编码表

LCD字型编码表如图 3-8所示。

图 3-8 LCD字型编码表

二、LCD1602显示软件设计流程图

LCD1602显示程序流程图如图 3-9所示,除了该流程图还有显示一个字符到指定位置函数,显示字符串到指定位置函数,写指令函数,写数据函数,判忙函数(内部等待函数),初试化函数等等。

图 3-9  LCD1602显示程序流

三 LCD1602显示说明

根据功能的不同,显示界面也不同,主要有以下几种显示界面:开机欢迎界面,正常显示和调整设置界面,闹钟设置界面,分段录音界面。

1.开机欢迎界面

开机欢迎界面如图 3-10所示。

12345678910111213141516
AWELCOME
BWELCOME
图 3-10 开机欢迎界面

  该界面是起了美化效果,使显示更具有亲和力,更具有人性化的设计。

2.正常显示和调整设置界面

正常显示和调整设置界面如图 3-11所示。

12345678910111213141516
ATime:00:00:00w?
BDate:00-00-00TT
图 3-11 正常显示和调整设置

界面显示说明:

⑴A6,A7显示小时,A9,A10显示分钟,A12,A13显示秒;

⑵A15的W是week的首字母表示星期的意思,A16的?是显示当天的星期,如该天为星期一则显示为1,以此类推;

⑶B6,B7显示小时,B9,B10显示分钟,B12,B13显示秒;

⑷B15为T(TRUE)则代表闹钟报音开,为F(false)则为关,

B16为T(TRUE)则代表整点报音开,为F(false)则为关;

⑸在该界面中以上提到的几位都可以通过按键来调整和设置。

3.闹钟设置界面

闹钟设置界面如图 3-12所示。

12345678910111213141516
ASETCLOCK
BTime:00:00:00O
图 3-12 闹钟设置界面

界面显示说明:

⑴B6,B7为闹钟小时设置位,B9,B10为闹钟分钟设置位,B12,B13为闹钟秒设置位;

⑵B15为周期性闹钟设置位,为O(once)则为临时性闹种,为R(repeat)则为周期性闹钟;

⑶在该界面中以上提到的几位都可以通过按键来调整和设置。

4.分段录音界面

分段录音界面如图 3-13、图 3-14、图 3-15所示。图 3-13为进入录音功能界面,图 3-14为录音开始界面,图 3-15为录音结束界面。

12345678910111213141516
AWELCOME
BRECORDER
图 3-13 进入录音功能界面

12345678910111213141516
ARecording:11S
B
图 3-14 录音开始界面

12345678910111213141516
ARecording:11S
BOVER
图 3-15 录音结束界面

录音界面显示说明:

⑴正在录音时显示A行,其中A11显示为录音的字段序号,A15为该段的录音时间长度,录音时不能超过该时间长度,超过部分录音无效;

⑵一个字段录音完成时显示图 3-15界面。

结论

本论文主要研究了液晶显示屏的电子万年历的设计,本系统采用了以广泛使用的单片机ATC51技术为核心,配合时钟芯片DS1302。以LCD1602为核心的液晶显示电路可以直接的显示结果。本设计的主要优点有分辨率高、设计简单,精度高,成本低等。

本次的设计使我从中学到了一些很重要的东西,那就是如何从理论到实践的转化,怎样将我所学到的知识运用到我以后的工作中去。在大学的课堂的学习只是在给我们灌输专业知识,而我们应把所学的用到我们现实的生活中去,此次的电子时钟设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应于以后的竞争。当然由于时间和条件的关系,不可避免的,本系统还存在一些不足之处也有缺点,系统的软件部分还需要进行相应的调整,使整个系统可靠性更高,使用更方便,更趋于完美。

谢   辞

在本论文的写作过程中,我非常感谢我的指导老师左现刚老师,无论是在课题分析、材料学习阶段还是在论文设计各个方面,左老师给予的指导和帮助。对论文的顺利完成其了很大的作用。每次的专业讲解使我钦佩,严谨认真精神更使我感动,从他那里我学习到的不仅有专业知识,还有踏实勤恳、认真求实的优良品质和工作作风。在此论文完成之际,首先向左老师表示衷心的感谢和深深的敬意。

此外,对所有在这四年里的学习和生活中,曾经教导过我帮助过我以及默默的地给予我无数的关心和帮助的老师以及和我一起生活一起学习一起走过四年人生路的同学们,在此向大家表示最诚挚的谢意和最美好的祝福。

参考源程序<一>

#include

 #define uchar unsigned char

 sbit rs=P1^2;    

 sbit rw=P1^1;

 sbit en=P1^0;

 uchar code table[]=" 2012-03-15 blue";

 uchar code table1[]="  10:34:56  sky";

 uchar code table2[]={31,28,31,30,31,30,31,30,30,31,30,31};  平年

 uchar code table3[]={31,29,31,30,31,30,31,30,30,31,30,31};  闰年

 uchar count=0;

 uchar hour=10;

uchar min=34;

uchar sec=56; 

uchar t;

uchar year1=20;

uchar year2=12;

uchar month=03;

uchar day=15;

void delay(uchar m)  延时子程序

  {

  }

 写命令子程序

  delay(1);

 写数据子程序

      

      

       

     P2=dat;

         delay(1);

     en=1;

     delay(5);

     en=0;

   设置16*2显示,5*7点阵,8位数据接口

  开显示,显示光标,光标闪烁

   当读或写一个字符后地址指针自动加1,整屏不移动

  数据指针清零,所有显示清零

   设置数据指针地址

   写入第一行数据

       wr_dat(table[t]);

       delay(1);

    写入第二行数据

      wr_dat(table1[t]);

       delay(1);

  }

     开定时器0 

 void hour_sfm(uchar add,uchar da)  刷新时间函数

   刷新时间函数

 

     void main()

     {

       init();

      timer_init();

      while(1)

      计数100次为一秒

           count=0;

          sec++;

      到一分了吗?

         {

              sec=0;

              min++;

    到一小时了吗

            {

           min=0;

           hour++;

             {

        到一天了吗

           

           day++;

              

          }

         }

          hour_sfm(5,min);

           }

        hour_sfm(8,sec);

      }

    是闰年吗

        {

        if(day>=table3[month-1])      天数到了吗

          {

          day=1;

          month++;

             月数到了吗

          {

           month=1;

           year2++;

            年的低位满了吗

            {

                   year2=0;

                 year1++;

         进入年高位刷新函数

             }

          

         进入年低位刷新函数

           }

           进入月刷新函数

         }

           进入年日刷新函数

        }

       else 

       {

        if(day>=table2[month-1])     天数到了吗

         {

          day=1;

          month++;

             月数到了吗

          {

           month=1;

          year2++;

         年的低位满了吗

           {

                year2=0;

                year1++;

          进入年高位刷新函数

                

          

          进入年低位刷新函数

          }

         进入月刷新函数

                    

            进入日刷新函数

           

      

     }

  }

  void timer0() interrupt 1    定时器服务程序

  {

   重装初值

       计数器加1

  }

参考源程序<二>

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

/*

此万年历程序由洪春峰同学自主编写,不妥之处,还请不吝赐教,谢谢!

(仅用于学习交流,谢绝他用)

*/

#include

#define uchar unsigned char

#define uint unsigned int

sbit  rs=P2^5;

sbit  rw=P2^6;

sbit  en=P2^7;

uchar code table[]="2011-08-15 MON ";

uchar code table1[]="17:53:00";

uchar code table2[]="SUNMONTUSWENTHRFRISAT";

uchar shi=15,fen=52,miao=0,time=0,a=2,ri=16,yue=8,nian=11,shiji=20;

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

void delay(uchar z)   延时函数

{

     for(x=110;x>0;x--);

             

}

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

void write_com(uchar com)  //写指令函数

{

     

}

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

void write_date(uchar date) 写数据函数

{

     

}

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

void init()     初始化函数

{    uchar num;

 0c);

     write_date(table[num]);

     delay(5);

     write_date(table1[num]);

     delay(5);

     

}

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

void jishi(uchar add,uchar hehe)  时分秒处理及显示函数

{

      

}

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

void suiyue(uchar add,uchar hehe) 日,月,年,世纪 处理及显示函数

{

      

}

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

void xingqi(uchar z)    星期显示函数

{

 0c);

}

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

uchar nianer(uchar b,uchar c)  闰年判断函数

{

     d=1;

     d=0;

        

}

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

uchar yueer(uchar e)    每个月都有几天呢?让这个函数来解决 !

{

     case 1: f=31;break;

     case 2: f=28;break;

     case 3: f=31;break;

     case 4: f=30;break;

     case 5: f=31;break;

     case 6: f=30;break;

     case 7: f=31;break;

     case 8: f=31;break;

     case 9: f=30;break;

     case 10: f=31;break;

     case 11: f=30;break;

     case 12: f=31;break;

     default: f=0;break;

}

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

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

void main()      函数的带头大哥--主函数!

{

     if(time==50)

     {

      time=0;

      miao++;

      if(miao>=60)

      {

       miao=0;

       fen++;

      }

      jishi(11,miao);

      if(fen>=60)

      {

       fen=0;

       shi++;

      }

      jishi(8,fen);

      if(shi>=24)

      {

       shi=0;

       a++;

        

      }

      jishi(5,shi);

      if(a>=7)

      a=0;

      xingqi(a);

     

      if(ri>=(yueer(yue)+nianer(nian,shiji)+1))

      {

       ri=1;

       yue++;

      }

      suiyue(10,ri);

      if(yue>=13)

      {

       yue=1;

       nian++;

      }

      suiyue(7,yue);

      if(nian>=100)

      {

       nian=0;

       shiji++;

      }

      suiyue(4,nian);

      if(shiji>=100)

      shiji=0;

      suiyue(2,shiji);

     }

}

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

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

void timer1() interrupt 1    定时器0中断处理函数

{

     

}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++下载本文

显示全文
专题