万年历(时钟芯片和液晶显示)
单片机实训报告万年历

一、实训目的随着科技的发展,单片机在各个领域的应用越来越广泛。
本次实训旨在通过万年历的设计与实现,让学生深入了解单片机的编程与应用,提高学生的实践能力和创新意识。
通过万年历的设计,使学生掌握单片机的基本原理、编程技巧以及相关外设的使用。
二、实训内容本次实训以AT89C51单片机为核心,结合DS1302时钟芯片、LCD1602液晶显示屏和独立键盘,设计并实现一个具有年、月、日、星期、时分秒显示以及闰年判断功能的万年历。
三、实训步骤1. 需求分析- 显示当前日期和时间,包括年、月、日、星期、时分秒。
- 判断闰年,正确显示2月的天数。
- 允许用户通过按键调整日期和时间。
- 具有电源掉电保护功能,保证数据不丢失。
2. 硬件设计- 核心模块:AT89C51单片机- 时钟模块:DS1302时钟芯片,提供精确的日期和时间。
- 显示模块:LCD1602液晶显示屏,用于显示日期、时间和星期。
- 按键模块:独立键盘,用于调整日期和时间。
- 电源模块:锂电池,提供稳定的电源。
3. 软件设计- 主程序:负责初始化硬件、读取时间、显示时间和日期、处理按键输入等。
- 时钟模块:读取DS1302芯片中的时间,并进行处理。
- 显示模块:将时间、日期和星期显示在LCD1602液晶显示屏上。
- 按键处理模块:根据按键输入调整日期和时间。
4. 程序编写- 使用C语言进行程序编写,利用Keil软件进行编译和烧录。
5. 调试与测试- 对程序进行调试,确保功能正常。
- 对万年历进行测试,验证其准确性。
四、实训结果经过设计、编程、调试和测试,成功实现了万年历的功能。
万年历能够准确显示当前日期和时间,并具有闰年判断功能。
用户可以通过按键调整日期和时间,且在电源掉电的情况下,万年历仍能保持时间。
五、实训心得1. 实践出真知:通过本次实训,深刻体会到理论知识与实践应用相结合的重要性。
只有将所学知识运用到实际项目中,才能真正掌握单片机的编程与应用。
6、用DS1302与LCD1602可调数字万年历实验设计报告

利用时钟芯片DS1302实现万年历系别电子通信工程系组别第十组专业名称电子信息工程指导教师组内成员2013年8月19日用DS1302与LCD1602设计的可调式电子日历时钟一、总体设计1.1、设计目的为巩固所学的单片机知识,把所学理论运用到实践中,用LCD1602与DS1302 设计可调式电子日历时钟。
1.2、设计要求(1)显示:年、月、日、时、分、秒和星期;(2)设置年、月、日、时、分、秒和星期的初始状态;(3)能够用4个按键调整日历时钟的年、月、日、时、分、秒和星期;完成可调式电子日历时钟的硬件和软件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。
控制程序的编写等。
备注:本程序另外添加了每到上午8:10和下午2:10的闹钟提醒功能。
1.3、系统基本方案选择和论证1.3.1、单片机芯片的选择方案方案一:采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容。
方案二:采用STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
但造价较高。
1.3.2 、显示模块选择方案和论证:方案一:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用显示数字显得太浪费,且价格也相对较高。
所以不用此种作为显示。
方案二:采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,显示出来的只是拼音,而不是汉字。
所以也不用此种作为显示。
方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量字符,且视觉效果较好,外形美观。
基于PCF8563时钟芯片的万年历制作

万年历是一种能够显示日期、星期和时间的工具,它不仅能够告诉我们当天是几号,还能显示星期几和当前时间。
在这个项目中,我们将使用PCF8563时钟芯片来制作一个基于PCF8563的万年历。
PCF8563是一种CMOS实时时钟和日历芯片,它可以提供年、月、日、星期和小时、分钟、秒的数据。
它具有电源管理功能,可以通过一个电源低于2V脉冲输入来切换系统电源供电方式。
为了制作这个基于PCF8563的万年历,我们需要以下材料和工具:1. Arduino主控板2.PCF8563时钟芯片3.16x2液晶显示屏4.面包板5.杜邦线6.10k电阻接下来,我们将按照以下步骤来制作基于PCF8563的万年历:第一步:连接电路首先,将Arduino主控板插入面包板。
接着,连接PCF8563时钟芯片到Arduino主控板上的I2C总线。
将SDA引脚连接到A4引脚,将SCL引脚连接到A5引脚。
此外,还需要使用10k电阻将VCC引脚连接到VCC引脚上。
接下来,将16x2液晶显示屏连接到面包板。
连接液晶屏的RS引脚到Arduino主控板的D12引脚,RW引脚到GND引脚,和E引脚到D11引脚。
将液晶屏的D4到D7引脚连接到Arduino主控板的D5到D2引脚。
第二步:编写代码打开Arduino IDE并创建一个新的项目。
然后,编写以下代码:#include <Wire.h>#include <LiquidCrystal_I2C.h>//定义PCF8563的地址#define PCF8563_ADDR 0x51//定义显示屏的尺寸#define LCD_COLUMNS 16#define LCD_ROWS 2LiquidCrystal_I2C lcd(0x27, LCD_COLUMNS, LCD_ROWS);void setup//初始化I2C总线Wire.begin(;//设置时钟芯片为24小时模式Wire.beginTransmission(PCF8563_ADDR);Wire.write(0x02);Wire.write(0x00);Wire.endTransmission(;//初始化液晶显示屏lcd.begin(LCD_COLUMNS, LCD_ROWS);lcd.setCursor(0, 0);lcd.print("Date: ");lcd.setCursor(0, 1);lcd.print("Time: ");void loop//读取PCF8563的日期和时间Wire.beginTransmission(PCF8563_ADDR); Wire.write(0x02);Wire.endTransmission(;Wire.requestFrom(PCF8563_ADDR, 7);int second = bcdToDec(Wire.read( & 0x7F); int minute = bcdToDec(Wire.read();int hour = bcdToDec(Wire.read( & 0x3F); int dayOfWeek = bcdToDec(Wire.read();int dayOfMonth = bcdToDec(Wire.read();int month = bcdToDec(Wire.read( & 0x1F); int year = bcdToDec(Wire.read();//显示日期和时间lcd.setCursor(6, 0); printWithLeadingZero(dayOfMonth);lcd.print("/");printWithLeadingZero(month);lcd.print("/");lcd.print(2000 + year);lcd.setCursor(6, 1); printWithLeadingZero(hour);lcd.print(":");printWithLeadingZero(minute);lcd.print(":");printWithLeadingZero(second);delay(1000);//将BCD码转换为十进制int bcdToDec(int bcd)return (bcd / 16 * 10) + (bcd % 16);//打印带有前导零的数字void printWithLeadingZero(int number)if (number < 10)lcd.print('0');}lcd.print(number);第三步:上传代码将Arduino主控板连接到电脑,并根据需要选择正确的端口和板类型。
基于51单片机的1602万年历

●功能描述:本设计完成基于DS1307作为时钟芯片,以HD44780为控制器的LCD万年历显示。
●原理概述:如图一,时钟信号由DS1307模块串行发送到单片机,单片机处理后,将内容通过并行通讯发送到LCD液晶DDRAM 上显示,此过程一直在主函数中循环,从而实现了将“年”、“月”、“日”、“时”、“分”、“秒”在液晶上显示的功能。
●端口说明单片机的P0作为LCD的并行通讯数据端口、P3口的P2.0、P2.1、P2.2作为LCD的控制端口,来控制LCD显示模式、功能以及内容;P1.0、P1.1、P1.2作为DS1302的串行通讯的数据端时钟端以及复位端,来获取时钟信息到单片机。
●效果显示●图一(电路总图及万年历仿真结果)●图二(DS1302时钟电路仿真结果)●图三(LCD1602液晶电路仿真结果)●图四(DS1302与液晶显示数据仿真结果)●程序清单/*************** writer:shopping.w ******************/#include <reg52.h>#include <intrins.h>#include <string.h>#define uint unsigned int#define uchar unsigned charsbit IO = P1^0;sbit SCLK = P1^1;sbit RST = P1^2;sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;uchar *WEEK[]={"SUN","***","MON","TUS","WEN","THU","FRI","SAT"};uchar LCD_DSY_BUFFER1[]={"DA TE 00-00-00 "};uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00 "};uchar DateTime[7];void DelayMS(uint ms){uchar i;while(ms--){for(i=0;i<120;i++);}}void Write_A_Byte_TO_DS1302(uchar x){uchar i;for(i=0;i<8;i++){IO=x&0x01;SCLK=1;SCLK=0;x>>=1;}}uchar Get_A_Byte_FROM_DS1302(){uchar i,b=0x00;for(i=0;i<8;i++){b |= _crol_((uchar)IO,i);SCLK=1;SCLK=0;}return b/16*10+b%16;}uchar Read_Data(uchar addr){uchar dat;RST = 0;SCLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);dat = Get_A_Byte_FROM_DS1302();SCLK=1;RST=0;return dat;}void GetTime(){uchar i,addr = 0x81;for(i=0;i<7;i++){DateTime[i]=Read_Data(addr);addr+=2;}}uchar Read_LCD_State(){uchar state;RS=0;RW=1;EN=1;DelayMS(1);state=P0;EN = 0;DelayMS(1);return state;}void LCD_Busy_Wait(){while((Read_LCD_State()&0x80)==0x80);DelayMS(5);}void Write_LCD_Data(uchar dat){LCD_Busy_Wait();RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0; }void Write_LCD_Command(uchar cmd){LCD_Busy_Wait();RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0; }void Init_LCD(){Write_LCD_Command(0x38);DelayMS(1);Write_LCD_Command(0x01);DelayMS(1);Write_LCD_Command(0x06);DelayMS(1);Write_LCD_Command(0x0c);DelayMS(1);}void Set_LCD_POS(uchar p){Write_LCD_Command(p|0x80);}void Display_LCD_String(uchar p,uchar *s){uchar i;Set_LCD_POS(p);for(i=0;i<16;i++){Write_LCD_Data(s[i]);DelayMS(1);}}void Format_DateTime(uchar d,uchar *a){a[0]=d/10+'0';a[1]=d%10+'0';}void main(){Init_LCD();while(1){GetTime();Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]]);Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5);Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8);Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+11);Display_LCD_String(0x00,LCD_DSY_BUFFER1);Display_LCD_String(0x40,LCD_DSY_BUFFER2);}}。
多功能电子万年历设计

多功能电子万年历设计作者:刘秀娟李朋龙邵娟王雪娜梁莉莉逯玉兰来源:《计算机时代》2022年第05期摘要:选用STC89C52单片机为核心元件,结合DS12C887时钟芯片、DHT11数字温湿度传感器和LCD1602液晶顯示屏等电子器件,采用模块化设计方法,完成整体功能设计。
利用Proteus仿真软件和Keil编译软件进行仿真,实现了集年、月、日、时、分、秒、农历、星期、温度、湿度、闹钟功能于一体的电子万年历。
关键词:电子万年历; STC89C52单片机; 时钟芯片; 温湿度传感器中图分类号:TP368.1 文献标识码:A 文章编号:1006-8228(2022)05-73-03Design of multi-function electronic calendarLiu Xiujuan, Li Penglong, Shao Juan, Wang Xuena, Liang Lili, Lu YulanAbstract: In this system, STC89C52 microcontroller was selected as the core component. Combined with electronic devices such as DS12C887 clock chip, DHT11 digital temperature and humidity sensor and LCD1602 liquid crystal display screen, the overall functional design was completed in the modular design method. Using Proteus simulation software and Keil compilation software for simulation, an electronic calendar with year, month, day, hour, minute,second, lunar calendar, week, temperature, humidity, and alarm clock functions was realized.Key words: electronic calendar; STC89C52 microcontroller; clock chip; temperature and humidity sensor引言近年来微电子技术发展迅速,以单片机为核心的智能电子产品层出不穷。
基于51单片机的万年历设计

基于51单片机的万年历设计一、系统设计方案本万年历系统主要由 51 单片机、时钟芯片、液晶显示屏、按键等部分组成。
51 单片机作为核心控制器,负责整个系统的运行和数据处理。
时钟芯片用于提供精确的时间信息,液晶显示屏用于显示万年历的相关内容,按键则用于设置时间和功能切换。
二、硬件设计1、单片机选型选用常见的 51 单片机,如 STC89C52 单片机,它具有性能稳定、价格低廉、易于编程等优点。
2、时钟芯片选择 DS1302 时钟芯片,该芯片能够提供高精度的实时时钟,具有闰年补偿功能,并且可以通过串行接口与单片机进行通信。
3、液晶显示屏采用 1602 液晶显示屏,能够清晰地显示字符和数字,满足万年历的显示需求。
4、按键电路设计四个按键,分别用于时间设置、功能切换、加和减操作。
三、软件设计1、主程序流程系统上电后,首先进行初始化操作,包括单片机端口初始化、时钟芯片初始化、液晶显示屏初始化等。
然后读取时钟芯片中的时间数据,并在液晶显示屏上显示出来。
接着进入循环,不断检测按键状态,根据按键操作执行相应的功能,如时间设置、功能切换等。
2、时钟芯片驱动程序通过单片机的串行接口向 DS1302 发送命令和数据,实现对时钟芯片的读写操作,获取准确的时间信息。
3、液晶显示屏驱动程序编写相应的函数,实现对1602 液晶显示屏的字符和数字显示控制。
4、按键处理程序采用扫描方式检测按键状态,当检测到按键按下时,执行相应的按键处理函数,实现时间设置和功能切换等操作。
四、时间设置功能通过按键操作进入时间设置模式,可以分别设置年、月、日、时、分、秒等信息。
在设置过程中,液晶显示屏会显示当前设置的项目和数值,并通过加、减按键进行调整。
设置完成后,将新的时间数据保存到时钟芯片中。
五、显示功能万年历的显示内容包括年、月、日、星期、时、分、秒等信息。
通过合理的排版和显示控制,使这些信息在液晶显示屏上清晰、直观地呈现给用户。
六、系统调试在完成硬件和软件设计后,需要对系统进行调试。
基于51单片机的12864液晶显示的万年历

附录程序
/*****************说明*********************************** 基于 51 单片机的 12864 液晶显示的万年历
版权所有,如需转载请通知本人,不得用于商业用途 ,仅限学习交流之用
*****************************************************************/
3
图-1 主控制系统
2.3.2 时钟电路模块的设计 DS1302 是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、
时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进 行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一 个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容, 但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
//延时 1MS/次
unsigned char
{
sec,min,hour,day,month,year,cen,week,
unsigned char i;
next,aa,bb,cc,dd,mm,temp0,LunarMonth,
while(--a)
LunarDay,LunarYear;
{
int temp;
9三三系统的软件设计系统的软件设计3131程序流程框图程序流程框图图图aa主程序流程图主程序流程图10图b计算阳历程序流程图计算阳历程序流程图1112图图cc时间调整程序流程图时间调整程序流程图yynnyynnyy图图dd设置温度报警闹钟的数据保存到设置温度报警闹钟的数据保存到at24c02at24c02中中是否进入温度报警上下限温度设置设置是否进入设置闹钟时间设置报警温度上下限开始设置闹钟的时间开始报警闹钟的开关是否开起at24c02存设置的功能保蜂鸣器开启闹钟报警功能开启结束设置13五五作品功能实现作品功能实现通过硬件的焊接与程序的编写本电子万年历终于完成了实现的功能如下
51单片机万年历实验原理

51单片机万年历实验原理1. 概述51单片机万年历实验是一项基于51单片机的实验项目,用于模拟和显示日期和时间信息,使其具备一定的时钟和日历功能。
本文将详细介绍该实验的原理和实现方法。
2. 实验所需材料完成51单片机万年历实验需要以下材料: - 51单片机开发板 - LCD显示屏 - 时钟芯片(如DS1302) - 电容 - 电阻 - 键盘模块 - 连接线等3. 实验原理本实验的原理主要包括三个方面:51单片机的控制逻辑、时钟芯片的数据存储和显示屏的信息展示。
3.1 51单片机的控制逻辑在51单片机中,首先需要定义和初始化各个引脚和功能模块。
通过引脚的输入输出控制、时钟和定时器的设置,实现对时钟芯片和LCD显示屏的控制和数据传输。
3.2 时钟芯片的数据存储时钟芯片一般具有独立的电源供应和存储空间,用于储存日期和时间等信息。
通过与51单片机的通讯接口,读取和写入时钟芯片中的数据,实现对日期和时间信息的读取和更新。
3.3 显示屏的信息展示LCD显示屏作为用户界面,用于展示日期和时间等信息。
通过51单片机的输出控制,将读取到的日期和时间信息通过LCD显示屏进行展示。
具体的显示方式可以根据需求设计,如以年、月、日的格式显示,或者以星期和时间的格式显示等。
4. 实验步骤基于以上原理,可以按照以下步骤进行51单片机万年历实验:4.1 硬件连接按照实验所需材料,将51单片机开发板、LCD显示屏和时钟芯片等进行正确的连接。
根据引脚功能和电平要求,通过连接线将它们连接在一起。
4.2 编写程序使用合适的集成开发环境(如Keil)编写51单片机的程序。
程序主要包括引脚和功能模块的初始化设置、时钟芯片数据的读写和LCD显示屏信息的输出等。
4.3 载入程序将编写好的程序通过USB下载线或其他方式,将程序载入到开发板中。
确保程序可以正确地运行在51单片机上。
4.4 测试实验接通电源,观察LCD显示屏是否正常显示日期和时间信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Write_Ds1302(0x8E,0X00);//关闭写保护
Write_Ds1302(write_add[0],l_tmpdate[0]);
Write_Ds1302(0x8E,0x80);//打开写保护
}
write_com(0x80+0x40+11);
}
void write_lcd()//写时间函数
{
static uchar i,temp[2];
switch(i)
{
case 0: write_com(0x80+0x40+0x0b);break;//秒
case 1: write_com(0x80+0x40+8);break;//分
case 2: write_com(0x80+0x40+5);break;//时
}//写time0
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_data(time1[num]);
delay(5000);
}//写time1
}
void Write_Ds1302_Byte(uchar temp) //写一个字节
{
uchar i;
void Write_Ds1302(uchar add,uchar dat )//向寄存器写数据
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;//启动
_nop_();
Write_Ds1302_Byte(add); //发送地址
Write_Ds1302_Byte(dat); //发送数据
write_com(0x0f);//显示光标并且闪烁
}
if(setn==4)
{
write_com(0x80+15);
write_com(0x0f);
}
if(setn==5)
{
write_com(0x80+12);
write_com(0x0f);
}
if(setn==6)
{
write_com(0x80+9);
if(set==0)
{
//flag=1;//时间停止
delay(5000);//去键盘按下抖动
if(set==0)
{
delay(500);
while(!set);
delay(500);//去键盘抬起时抖动
while(!set);
delay(500);
flag=1;
setn++;
if(setn==1)
sbit set=P1^0;//定义按键端口
sbit s1=P1^1;
sbit s2=P1^2;
sbit s3=P1^3;
void keyscan1();void keyscan();
/************液晶口定义*******/
sbit RS=P2^0;//RS为数据/指令选择1/0
sbit RW=P2^1;//读写
Write_Ds1302(0x8E,0x80);//打开写保护
flag=0;//时钟正常运行
write_com(0x0c);//光标停止闪烁
}
}
}
if(setn!=0)//更改时间
{
if(s1==0)//增加时间
{
delay(5000);
if(s1==0)
{
while(!s1);
delay(5000);//去键盘抬起时抖动
extern uchar data dis_buf2[16];
void delay(uint z)
{
while(--z);
}
void write_com(uchar com)//液晶写命令函数
{
RS=0;//写命令使能
RW=0;//写
delay(5000);
/****在高脉冲下命令输入*****/
E=0;
case 3: write_com(0x80+0x0b);break;//日
case 4: write_com(0x80+8);break;//月
case 5: write_com(0x80+0x0e);break;//星期
case 6: write_com(0x80+5);break;//年
}
temp[0]=l_tmpdate[i]/16;//数据的转换
l_tmpdate[1]++;
if(l_tmpdate[1]==60)
l_tmpdate[1]=0;
{
tp=l_tmpdate[1]/10;
l_tmpdate[1]=l_tmpdate[1]%10;
l_tmpdate[1]=l_tmpdate[1]+tp*16;
}
uchar Read_Ds1302(uchar address )//从寄存器读数据
{
uchar date;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
date=Read_Ds1302_Byte();
RST=0;
void Set_RTC(void) //设定日历
{
uchar i,*p,tmp;
for(i=0;i<7;i++)
{ //BCD处理,将十六进制转换成十进制
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;
_nop_(); //以下为DS1302复位的稳定时间
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return (date);
}
/*********************************************************/
}
Write_Ds1302(0x8E,0x00);//关闭写保护
p=write_add;//传要写的寄存器地址
for(i=0;i<7;i++) //7次写入秒分时日月周年
{
Write_Ds1302(*p,l_tmpdate[i]);
p++;
}
Write_Ds1302(0x8E,0x80);//打开写保护
write_com(0x06);//光标移动设置整屏不移动
write_com(0x0c);//屏幕开、光标不闪(0)不显示(0)
delay(5000);
write_com(0x80);
for(num=0;num<16;num++)
{
write_data(time0[num]);
delay(5000);
write_com(0x0f);
}
if(setn==7)
{
write_com(0x80+6);
write_com(0x0f);
}
if(setn==8)
{
setn=0;
Write_Ds1302(0x8E,0X00);//关闭写保护
Write_Ds1302(write_add[0],l_tmpdate[0]); //写秒
RST=0; //恢复
}
uchar Read_Ds1302_Byte()//读一个字节
{
uchar i,temp=0x00;
for (i=0;i<8;i++) //循环8次读取数据
{
if(SDA)
temp|=0x80; //每次传输低字节
SCK=0;
temp>>=1; //右移一位
SCK=1;
}
return(temp);
{
write_com(0x80+0x40+12);//将光标移动到秒个位
write_com(0x0f);//显示光标并且闪烁
}
if(setn==2)
{
write_com(0x80+0x40+9);//将光标移动到分个位
write_com(0x0f);//显示光标并且闪烁
}
if(setn==3)
{
write_com(0x80+0x40+6);//将光标移动到时个位
{
write_data(dis_buf2[j]);
}
}
delay(500);
while(!s3);
delay(500);//去键盘抬起时抖动
while(!s3);
delay(500);
init();
Read_RTC();
write_lcd();
}
}
void keyscan()
{
uchar tem[2],tp,flag;//存储要更改的时间数据
P0=com;
delay(500);
E=1;
delay(500);
E=0;
}
void write_data(uchar dat)//液晶写数据函数
{பைடு நூலகம்
RS=1;//写数据使能