基于单片机的液晶时钟显示毕业论文_第1页
基于单片机的液晶时钟显示毕业论文_第2页
基于单片机的液晶时钟显示毕业论文_第3页
基于单片机的液晶时钟显示毕业论文_第4页
基于单片机的液晶时钟显示毕业论文_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE32基于单片机的液晶时钟显示摘要:本文记述了采用STC89C52单片机在时钟芯片DS12C887设计一个电子时钟,并用液晶显示时间、日期,具有闹钟设定及报警功能,利用实时时钟芯片DS12C887走时准确,自身掉电可继续走时的特性,设计实现断电不停,再上电是时间仍然准确显示在液晶上的功能。关键词:单片机时钟芯片2行液晶屏C语言一前言近年来,随着我国科技的不断进步,我国的电子产品生产技术也已达到很高的水平,特别是液晶显示技术也得到了蓬勃的长足发展。为了跟上这个伟大的时代潮流,我查阅大量文档并询问了数名老师,创作这篇论文,并自己动手制作实物,当你看到这个实物的时候,我的汗水与心血终于结晶为成果。我做这个论文的创意是为了检验自己所学的单片机知识,也是为了适应科学技术的不断进步。本次设计的课题主要是在学习完电工技师单片机模块和单片机高级应用班后进行的课题设计。这个设计在现实生活中是实际应用的产品的模拟,目前在嵌入式系统、电表、安全监控系统中应用十分广泛。设计任务是:(1)在1602液晶屏是显示年、月、日、星期、时、分、秒,而且按实时更新跳变。(2)具有闹钟设定和报警,报警响起时按任何键可以取消报警;(3)能够使用按键随时调节各个参数,按键设计4个有效键,分别为功能选择键、数值增大键、数据减少键和闹钟查看键;(4)每次有按键按下是,蜂鸣器都以短“滴”声报警;(5)利用DS12C887自身掉电可继续走时的特性,设计实现断电时间不停,再次上电时时间仍然准确显示在液晶屏上的功能。二方案论证及选择在许多智能化电子设备中,通常进行一些与时间有关的控制,如果用系统的定时器来设计时钟的话,偶然的掉电或晶振的无耻都会造成时间的错乱,更糟糕的是,若完全用程序设计时钟还会占用大量的系统资源,从而严重影响系统的其他功能。为此,很多芯片制造公司都设计出来各种各样的实时时钟芯片,如DS1302、DS12C887、MAC7111和PCF8583等。常见的芯片有两种。一种是非常体积小的表面贴片式,通常用在高端的小型手持式仪器或设备上,如手机、MP4播放器、GPS导航仪等。这种芯片在使用时需要接备份电池和外部晶振,电池用来保持主系统在意外掉电时为时钟芯片提供电源,外部晶振用来提供时钟芯片所必须的振荡频率来源,标准频率为32.768kHz,这种芯片体积小,所以引脚很少,操作起来非常方便,比如,DALLAS公司生产的串行实时时钟芯片DS1302。另一种体积相对较大,一般为直插式,它的内部集成有可充电锂电池,同时内部还集成了32.768kHz的标准晶振,一旦设定好时间,即使系统的主电源掉电,该时钟芯片仍然可以靠它内部集成的锂电池走数年,当系统重新上电是,有可为锂电池重新充电,这样一来可以非常有效的保持时间的有效性,使用时非常方便。这类芯片如DALLAS公司生产的DS12C887.设计方案一:DS1302+数码管应该说这个方案在电子时钟制作中应用最多:DS1302的使用非常方便,而且价格也不贵,同时数码管显示的也很清楚,特别是显示时间很直观,但我在查阅了很多资料后发现一些问题,DS1302是不自带电池的,虽然可以通过外接纽扣电池来达到断电时继续走时的目的,但在实际应用中还是比较困难的,因为DS1302上电需要复位,而复位就会把正确的走时清零,如果不复位,DS1302会出现各种各样的问题,如不走时、读出乱码等;要解决这个问题需要增加如2402等存储器,上电后先储存时间值,再复位;这木做无疑增加了电路设计和软件设计的复杂度。设计方案二:DS12C887+液晶显示采用DS12C887作为实时时钟芯片,1602液晶作为显示输出;DS12C887不仅自带锂电池而且内部带有标准晶振,无需外接,使用方便;走时精度较高,并具有与微处理器的并行接口,可方便地用于对时钟精度要求较高的智能化仪表仪器中。采用液晶显示功耗低,轻便防震。设计方案三:单片机定时器+数码管这种设计如今基本已被淘汰,最大的问题在于一旦断电就无法继续走时,而且由于是依靠软件编程利用定时器实现走时,所以走时精度不高。当然这个方案也有它的优点,就是价格便宜。为了达到最好的走时显示效果,同时也为了提高自己运用单片机设计项目的能力,我决定选择设计方案二进行制作。本文主要介绍了电子时钟的功能和设计过程。重点数名硬件设计和软件设计。三硬件设计1总体方案本设计以单片机STC89C52为控制核心,由实时时钟模块、按键调整时钟输出模块、闹钟报警模块和显示模块组成。可以实现时间显示、闹钟设置、闹钟到时报警等功能。闹钟报警模块由蜂鸣器和DS12C887组成。可实现闹钟控制和到时报警功能,调整输入采用电平方式单个控制按键控制,时钟芯片采用DS12C887来控制实时时钟的运转。此系统结构简单,使用方便,具有精度高、体积小、功耗低和成本低等特点,使用于我们日常生活和工、农业生产中的时间显示,还可应用于智能化电子产品中,具有广泛的应用前景。总体电路结构框图如下:时钟显示时钟显示DS12C887STC89C52主控制器键扫描电路1602液晶显示屏闹钟报警2主控制器主控制器我们采用价格便宜、体积小、性能强大,而且能与DS12C887直接通信的单片机STC89C52作为主控制器。电子钟对主控制器的要求并不高,51系列单片机完全可以胜任。考虑到下载程序方便和价格等因素,我选择了STC公司的51单片机作为系统的控制芯片。STC的STC89C52RC兼容51单片机,价格便宜,抗干扰强;与其它51单片机相比它最大的特点是具有ISP下载功能,通过一片MAX232就可以很方便的实现程序的下载。电源+5V电源+5V单片机STC89C52RCLCD1602PC机通讯MAX232软件程序C语言编写数据传输原理图其数据传输过程如下:MAX232的11脚T1in接单片机TXD端P3.1,TTL电平从单片机的TXD端发出,经过MAX232转换为RS-232电平后从MAX232的14脚TIout发出,再连接到实验板上串口座的3脚,再经过交叉串口线后,连接至PC机的串口座的第2脚,至此计算机接收到数据;PC机发送数据时从PC机串口座第3脚TXD发出数据,再逆向流向单片机的RXD端P3.0接收数据。2液晶显示模块本文使用的1602液晶为+5V电压驱动,带背光,背光亮度和显示对比度可调,是一种功能较简单、价格较便宜的液晶显示器件。它由液晶显示屏和驱动器两部分组成,单片机听你哥哥写控制字的方式访问驱动器来实现对显示屏的控制,并有并行接口,无串行接口;采用液晶显示界面清晰,操作方便,具有两行显示,每行16个字符,内置128个字符的ASCII字符集字库,第一行显示实时时钟,第二行显示闹钟,还具有闹钟功能和液晶亮度调节功能,并且可以对其方便的进行程序控制,完全能满足设计的要求。(1)1602接口信号如下图所示:字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样。(2)1602的基本操作时序:读状态

输入:RS=L,RW=H,E=H

输出:DB0~DB7=状态字

写指令

输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码

输出:无

读数据

输入:RS=H,RW=H,E=H

输出:DB0~DB7=数据

写数据

输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据

输出:无(3)1602的地址映射图l602的核心芯片是HD44780。HD44780内置了DDRAM、CGROM和CGRAM。DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表:(4)指令说明初始化设置指令码如表所示:初始化指令码与功能对照表指令码00111000设置显示模式为16X200001DCBD:显示开/关(1/0)

C:光标显示/不显示(1/0)

B:光标闪烁/不闪烁(1/0)数据控制液晶控制器内部设有数据地址指针,用户通过它访问80B的显示RAM,关系如表所示:数据指针设置指令码功能80H+地址码(0~27,40~67H)设置数据地址指针初始化过程a延时15msb写指令38H;设置显示模式c延时5msd写指令38H;设置显示模式e延时5msf写指令38H;设置显示模式g写指令06H;显示光标移动设置h写指令0CH;显示开及光标设置i写指令01H;显示清屏j写指令80H;定位数据指针到80H数据RAM读写a读显示RAM首先,写指令码(指令码为目标RAM地址)。然后,从D0~D7口获得数据。b写显示RAM首先,写指令码(指令码为目标RAM地址)。然后,写数据到D0-D7。例如让LCD的第一行第二个位置(RAM地址0x81)显示字符“1”(ASCII0x31)的实现过程如下:E=高脉冲,RS=L,RW=L,D0~D7=0x81E=高脉冲,RS=L,RW=L,D0~D7=0x311602与CPU连接图如下图所示:1602与CPU连接图3实时时钟芯片DS12887DS12887是DALLAS半导体公司新推出的实时时钟芯片RTC(RealTimeClock),可直接取代DS1287,它功能丰富,应用广泛。DS12887内部自带晶体振荡器及锂电池,可计算到2100年前的秒、分、小时、星期、日、月、年七种日历信息并带闰年补偿,断电后能运行10年之久不丢失数据。可选用夏令时,具有24小时或12小时两种制式。它在工业控制及智能仪器仪表中有广泛用途,如PC机内的时钟信号就是由DS12887提供的。DS12887的结构框图(见图1)DS12887的特点◆可作为个人计算机的时钟和日历;◆与MCl46818B和DS1287的管脚兼容◆在没有外部电源的情况下可工作10年◆自带晶体振荡器及锂电池◆可计算到2100年前的秒、分、小时、星期、日、月、年七种日历信息并带闰年补偿◆有二进制码或BCD码代表日历和闹钟信息◆有12和24小时两种制式,12小时制时有AM和PM提示◆可选用夏令时模式◆可以应用于MOTOROLA和INTEL两种总线◆数据/地址总线复用◆内建128字节RAM ◆14字节时钟控制寄存器◆114字节通用RAM◆可编程方波输出◆总线兼容中断(/IRQ)◆三种可编程中断◆时间性中断,可产生每秒一次直到每天一次中断◆周期性中断122mS到500mS◆时钟更新结束中断DS12887的引脚排列(见图2)DS12887的引脚功能介绍:GND、VCC:直流电源,其中VCC接+5V输入,GND接地,当VCC输入为+5V时,用户可以访问DS12C887内RAM中的数据,并可对其进行读、写操作;当VCC的输入小于RAM进行读、写操作,此时用户不能正确获取芯片内的时间信+4.25V时,禁止用户对内部息;当VCC的输入小于+3V时,DS12C887会自动将电源发换到内部自带的锂电池上,以保证内部的电路能够正常工作。MOT:模式选择脚,DA12C887有两种工作模式,即Motorola模式和Intel模式,当MOT接VCC时,选用的工作模式是Motorola模式,当MOT接GND时,选用的是Intel模式。本文主要讨论Intel模式。SQW:方波输出脚,当供电电压VCC大于4.25V时,SQW脚可进行方波输出,此时用户可以通过对控制寄存器编程来得到13种方波信号的输出。AD0~AD7:复用地址数据总线,该总线采用时分复用技术,在总线周期的前半部分,出现在AD0~AD7上的是地址信息,可用以选通DS12C887内的RAM,总线周期的后半部分出现在AD0~AD7上的数据信息。AS:地址选通输入脚,在进行读写操作时,AS的上升沿将AD0~AD7上出现的地址信息锁存到DS12C887上,而下一个下降沿清除AD0~AD7上的地址信息,不论是否有效,DS12C887都将执行该操作。DS/RD:数据选择或读输入脚,该引脚有两种工作模式,当MOT接VCC时,选用Motorola工作模式,在这种工作模式中,每个总线周期的后一部分的DS为高电平,被称为数据选通。在读操作中,DS的上升沿使DS12C887将内部数据送往总线AD0~AD7上,以供外部读取。在写操作中,DS的下降沿将使总线AD0~AD7上的数据锁存在DS12C887中;当MOT接GND时,选用Intel工作模式,在该模式中,该引脚是读允许输入脚,即ReadEnable。R/W:读/写输入端,该管脚也有2种工作模式,当MOT接VCC时,R/W工作在Motorola模式。此时,该引脚的作用是区分进行的是读操作还是写操作,当R/W为高电平时为读操作,R/W为低电平时为写操作;当MOT接GND时,该脚工作在Intle模式,此时该作为写允许输入,即WriteEnable。CS:片选输入,低电平有效。IRQ:中断请求输入,低电平有效,该脚有效对DS12C887内的时钟、日历和RAM中的内容没有任何影响,仅对内部的控制寄存器有影响,在典型的应用中,RESET可以直接接VCC,这样可以保证DS12C887在掉电时,其内部控制寄存器不受影响。在DS12C887内有11字节RAM用来存储时间信息,4字节用来存储控制信息,其具体地址及取值如表1所列。由表1可以看出:DS12C887内部有控制寄存器的A-B等4个控制寄存器,用户都可以在任何时候对其进行访问以对DS12C887进行控制操作。DS12887上电时,当Vcc高于4.25V200mS后,芯片可以被外部程序操作。当Vcc低于4.25V时,芯片处于写保护状态(所有的输入均无效),同时所有输出呈高阻状态。当Vcc低于3V时,芯片将自动把供电方式切换为由内部电池供电。DS12887有128个RAM单元。其中4个单元用作控制寄存器,10个单元用作存放时钟字节,114字节为通用RAM。其主要寄存器如下:DS12887内部寄存器A:UIPDV2DV1DV0RS3RS2RS1RS0UIP=l:更新已到,不能读/写DSl2887;UIP=0:更新末到,能读/写DS12887。DV2,DV1,DV0应设置为010,表示打开晶振,允许计时。RS3,RS2,RS1,RS0为方波频率选择位,产生方波周期中断。DS12887内部寄存器B:SETPIEAIEUIESQWEDM24/12DSESET=0:时间更新正常进行,每秒计数1次;SET=1:禁止更新,程序可初始化时间和日历。PIE=l:允许周期中断;PIE=0:禁止周期中断。AIE=1:允许报警中断;AIE=0:禁止报警中断。UIE=1:允许更新结束中断;UIE=0:禁止更新结束中断。SQWE为方波允许位。SQWE=1:将RS3,RS2,RS1,RS0选定的方波输出。DM=1:BCD码;DM=0:二进制。该位不受复位信号影响24/12:1表示24[小]时制;0表示12[小]时制。DSE为夏时制允许位。DSE=l:采用夏时制;DSE=0:不采用夏时制。DS12887内部寄存器C:IRQFPFAFUF0000IRQF为中断申请标志。PF为方波周期中断标志。PF=1:方波周期结束,申请中断。AF为闹铃中断标志。AF=1:当前时间与闹铃时间匹配时即刻申请中断。UF为更新周期结束中断标志。UF二I:更新周期结束时申请中断。DS12887内部寄存器D:VRT0000000VRT为内部锂电池状态。VRT=1:锂电池正常;VRT=0:锂电池耗尽。DS12887内部存储器功能如附表所示:地址功能取值范围(十进制数)取值范围(二进制数)取值范围(BCD码)0秒0~5900~3B00~591秒闹铃0~5900~3B00~592分0~5900~3B00~593分闹铃0~5900~3B00~59412[小]时模式0~1201~0CAM81~8CPM01~12AM81~92PM24[小]时模式0~2300~1700~235时闹铃,12[小]时制1~1201~0CAM81~8CPM01~12AM81~92PM时闹铃,24[小]时制0~2300~1700~236星期(星期天=1)1~701~0701~077日1~3101~1F01~318月1~1201~0C01~129年0~9900~6300~9910控制寄存器A11控制寄存器B12控制寄存器C13控制寄存器D50世纪0~99NA19,20附表时序图时序分析及软件功能的实现DS12CR887有两种接口总线时序工作方式,此系统中DSl2CR887工作在Intel总线时序方式,其写命令时序如图3所示,读命令时序如图4所示。从DS12CR887的时序图可以看出,在一次读或写操作中,地址/数据复用总线上先出现地址,后出现数据。写操作时,当片选信号CS有效时,地址锁存信号AS的下降沿将AD0~AD7上的数据锁存作为地址(AS高电平的宽度PWASH不小于45ns时,锁存地址有效);随后读写信号R/W为低电平(低电平宽度PWEH不小于90ns),在R/W的上升沿将AD0~AD7上的数据写入DSl2CR887,在R/W的上升沿要求AD0~AD7的数据稳定时间不为小于70ns(即tdsw>70ns),通过上述时序,才完成一次写操作。读操作同样首先将数据线(AD0~AD7)上的信号锁存为DS12CR887需要的地址,然后DS12CR887才能在AD0~AD7上输出有效数据。DS12C887与单片机连接电路图如下图所示:1602的外形尺寸:4键盘输入按键调整是在输入模块,采用按键单个电平控制,工友4个按键。采用液晶显示,分别调整实时时钟的时、分和闹钟时、分,可实现时间调整,闹钟设置的功能。之间在其时钟运转的同时,在其上进行时间调节。P2.0P2.0P2.1P2.2P2.3GNDS1S2S3S4按键扫描电路图5闹钟报警闹钟报警电路,采用的时有液晶显示屏第二行所显示闹钟的设定时间为基准,有DS12C887时钟芯片来控制,判断液晶显示屏第一行所显示实时时钟是否与液晶屏第二行所显示闹钟的设定时间一致,如果相同则蜂鸣器鸣响,如不同则继续判断。P3.2P3.2R=1KGNDBEEPVCC+5VQ1(PNP)闹钟报警电路图如上所示。四程序设计1主程序流程图开始开始结束初始化DS12C887LCD显示时间和闹钟程序DS12C887开始振荡判断是否有按键按下判断闹钟是否到时调整时间和闹钟蜂鸣器闹钟响YYNN主程序流程图主程序因为使用了时钟芯片DS12C887,程序只需要从DS12C887各个寄存器中读出年、月、日、时、分、秒等数据,子啊处理即可。在首次对DS12C887进行操作前,必须对它初始化,然后从DS12C887中读出数据,再经过处理后,送给显示缓冲单元。控制按键有效,进入年调整程序等待按键程序控制按键有效,进入年调整程序等待按键程序+或-键有效年+或-1控制键有效,跳出时间调整程序进入主循环程序控制按键有效,进入月调整程序等待按键程序+或-键有效月+或-1控制按键有效,进入日调整程序等待按键程序+或-键有效日+或-1控制按键有效,进入星期调整程序等待按键程序+或-键有效星期+或-1控制按键有效,进入小时调整程序等待按键程序+或-键有效小时+或-1控制按键有效,进入分钟调整程序等待按键程序+或-键有效分+或-12时间调整流程图3C语言程序设计##include<reg52.h>#include"define.h"voiddelay(uintz)//延时zms函数{ uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}voiddi()//蜂鸣器报警声音{beep=0;delay(100);beep=1;}//=======================================voidwrite_com(ucharcom)//写液晶命令函数{ rs=0; P0=com; delay(1); lcden=1; delay(3); lcden=0; delay(1);}voidwrite_date(uchardate)//写液晶数据函数{ rs=1; P0=date; delay(1); lcden=1; delay(3); lcden=0; delay(1);}//======================================================voidinit()//初始化函数{ ucharnum; EA=1;//打开总中断 EX1=1;//打开外部中断1 IT1=1;//设置负跳变沿触发中断 flag1=0;//变量初始化 flag=0; s1num=0; lcden=0; dsas=0;/*************************以下几行在首次设置DS12C887时使用,** write_ds(0x0B,0xa6);//set=1,设置24h,数据二进制,闹钟中断 write_ds(0x0A,0x20);//打开振荡器************************* if(!(read_ds(0x0d))){di();ceshi=0;}/***************************以后不必写入***********************/ delay(10); write_com(0x38);//1602液晶初始化 write_com(0x0C); write_com(0x06); write_com(0x01); write_com(0x80); for(num=0;num<15;num++)//写入液晶固定部分显示 { write_date(table[num]); delay(1); } write_com(0x80+0x40); for(num=0;num<12;num++) { write_date(table1[num]); delay(10); }}////****1602液晶刷新时分秒函数4为时,7为分,10为秒voidwrite_sfm(ucharadd,chardate){ ucharshi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge);}//****液晶年月日函数3为年,6为月,9为日voidwrite_nyr(ucharadd,chardate){ ucharshi,ge; shi=date/10; ge=date%10; write_com(0x80+add); write_date(0x30+shi); write_date(0x30+ge);}//****1602液晶刷新星期函数voidwrite_week(charwe){ write_com(0x80+12); switch(we) { case1: write_date('M');//delay(1); write_date('O');//delay(1); write_date('N');//delay(1); break; case2: write_date('T');//delay(1); write_date('U');//delay(1); write_date('E');//delay(1); break; case3: write_date('W');//delay(1); write_date('E');//delay(1); write_date('D');//delay(1); break; case4: write_date('T');//delay(1); write_date('H');//delay(1); write_date('U');//delay(1); break; case5: write_date('F');//delay(1); write_date('R');//delay(1); write_date('I');//delay(1); break; case6: write_date('S');//delay(1); write_date('A');//delay(1); write_date('T');//delay(1); break; case7: write_date('S');//delay(1); write_date('U');//delay(1); write_date('N');//delay(1); break; default:break;// write_date('e');delay(1);// write_date('r');delay(1);// write_date('r');delay(1); }}//voidkeyscan(){ if(flag_ri==1)//这里用来消除闹钟报警,按任一键取消 { if((s1==0)||(s2==0)||(s3==0)||(s4==0)) { delay(5); if((s1==0)||(s2==0)||(s3==0)||(s4==0)) { while(!(s1&&s2&&s3&&s4)); di();//消除报警标志 flag_ri=0; } } }//*****************检测s1_menu if(s1==0)//检测s1_menu { delay(5); if(s1==0) { while(!s1); di(); flag=1; s1num++;//记录按下次数 if(flag1==1){if(s1num==4)s1num=1;}//闹铃调整 switch(s1num)//光标闪烁点定位 { case1:write_com(0x80+0x40+10);//flash_sec write_com(0x0f); break; case2:write_com(0x80+0x40+7);//flash_min break; case3:write_com(0x80+0x40+4);//flash_hour break; case4:write_com(0x80+12); //flash_week break; case5:write_com(0x80+9); //flash_day break; case6:write_com(0x80+6); //flash_mon break; case7:write_com(0x80+3); //flsah_year break; case8:s1num=0; write_com(0x0c); flag=0; break; }}}//****************检测按键S2 if(s1num!=0)//只有当s1按下后,才检测s2和s3 { if(s2==0)//检测s2 { delay(5); if(s2==0) { di(); while(!s2); switch(s1num)//根据功能键次数调节相应数值 { case1: if(flag1) { amiao++;if(amiao>59)amiao=0; write_sfm(10,amiao); write_com(0x80+0x40+10); write_ds(1,amiao); } else { miao++; if(miao>59)miao=0; write_sfm(10,miao); write_com(0x80+0x40+10); write_ds(0,miao); } break; case2: if(flag1) { afen++; if(afen>59)afen=0; write_sfm(7,afen); write_com(0x80+0x40+7); write_ds(3,afen); } else { fen++; if(fen>59)fen=0; write_sfm(7,fen); write_com(0x80+0x40+7); write_ds(2,fen); } break; case3: if(flag1) { ashi++; if(ashi>23)ashi=0; write_sfm(4,ashi); write_com(0x80+0x40+4); write_ds(5,ashi); } else { shi++; if(shi>23)shi=0; write_sfm(4,shi); write_com(0x80+0x40+4); write_ds(4,shi); } break; case4:week++; if(week>7)week=1; write_week(week); write_com(0x80+12); write_ds(6,week); break; case5:day++; if(day>31)day=1;write_nyr(9,day);write_com(0x80+9); write_ds(7,day);break; case6:month++; if(month>12)month=1;write_nyr(6,month);write_com(0x80+6); write_ds(8,month);break; case7:year++; if(year>99)year=0; write_ds(9,year); write_nyr(3,year);write_com(0x80+3);break; } } }//***************check_s3-- if(s3==0); { delay(1); if(s3==0) { di(); while(!s3); switch(s1num)//根据功能键次数调节相应数值 { case1: if(flag1) { amiao--; if(amiao<0)amiao=59; write_sfm(10,amiao); write_com(0x80+0x40+10); write_ds(1,amiao); } else { miao--; if(miao<0)miao=59; write_sfm(10,miao); write_com(0x80+0x40+10); write_ds(0,miao); } break; case2: if(flag1) { afen--; if(afen<0)afen=59; write_sfm(7,afen); write_com(0x80+0x40+7); write_ds(3,afen); } else { fen--; if(fen<0)fen=59; write_sfm(7,fen); write_com(0x80+0x40+7); write_ds(2,fen); } break; case3: if(flag1) { ashi--; if(ashi<0)ashi=23; write_sfm(4,ashi); write_com(0x80+0x40+4); write_ds(5,ashi); } else { shi--; if(shi<0)shi=23; write_sfm(4,shi); write_com(0x80+0x40+4); write_ds(4,shi); } break; case4:week--; if(week<1)week=7; write_week(week); write_com(0x80+12); write_ds(6,week); break; case5:day--; if(day<1)day=31; write_nyr(9,day); write_com(0x80+9); write_ds(7,day); break; case6:month--; if(month<1)month=12; write_nyr(6,month); write_com(0x80+6); write_ds(8,month); break; case7:year--; if(year<0)year=99; write_ds(9,year); write_nyr(3,year); write_com(0x80+3); break; } } } }//******************检测s4_alarm if(s4==0)//检测s4 { delay(5); if(s4==0) { write_com(0x0c);flag=0;s1num=0; flag1=~flag1; while(!s4); di(); if(flag1==0)//退出闹钟设置时保存数值 { write_com(0x80+0x40); write_date(''); write_date(''); } else//进入闹钟设置 { read_alarm();//读取原始数据 write_com(0x80+0x40);write_date('R');//显示标志write_date('i');write_com(0x80+0x40+3);write_sfm(4,ashi);//送液晶显示闹钟时间write_sfm(7,afen); write_sfm(10,amiao); }}}}//=============================voidwrite_ds(ucharadd,uchardate)//写12C887函数{ dscs=0; dsrd=1;dswr=1; P0=add;//先写地址 dsas=0;delay(1);//锁存8位地址 P0=date; dswr=0; dsas=1; dscs=1;delay(1);}ucharread_ds(ucharadd){//读12C887函数 uchards_date; dscs=0; dsrd=1;dswr=1; P0=add;//if(add==2)i=47;//先写地址 dsas=0; //锁存8位地址 P0=0xff; dsrd=0;//delay(1); ds_date=P0;//再du数据// if(i==ds_date){ceshi=1;while(1);}// else{ceshi=0;di();} dsas=1; dscs=1;delay(1); returnds_date;}voidck_ds_uip()//set=0时,需要检测UIP位,确定是否可以读写{ uchari; dscs=0; dsrd=1;dswr=1; P0=0x0a;//先写地址 dsas=0; //锁存8位地址 P0=0xff; dsrd=0; while((P0&0x80)&(i++<255));//ceshi=!ceshi;//判断uip是否为0 dsas=1; dscs=1;delay(1);}/*首次操作12C887时给予寄存器初始化voidset_time(){//首次上电初始化时间函数write_ds(0,0);write_ds(1,0);write_ds(2,0);write_ds(3,0);write_ds(4,0);write_ds(5,0);write_ds(6,0);write_ds(7,0);write_ds(8,0);write_ds(9,0);}*/voidread_alarm()//读取12C887闹钟值{ amiao=read_ds(1); afen=read_ds(3); ashi=read_ds(5);}//***********************************************************voidmain()//主函数{ delay(100); init();//调用初始化函数 while(1){ if(flag_ri==1)//当闹钟中断时进入这里 { di(); delay(100); di(); delay(500);} keyscan();//按键扫描 if(flag==0&&flag1==0)//正常工作时进入这里{ keyscan();//按键扫描//**************读取12C887数据 miao=read_ds(0); fen=read_

温馨提示

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

最新文档

评论

0/150

提交评论