1602液晶时钟+24C02
时间:10-02
整理:3721RD
点击:
各位大师有个问题请教下,为什么我这个程序掉电后数据可以保存,但是到了60秒进位时候会出现乱码是怎么回事,24C02是这样保存数据的吗?
#include"main.h"
#include"lcd1602.h"
#include"74hc595.h"
#include"key.h"
#include"time.h"
#include "boardinit.h"
#include"24c02.h"
#include"lcd1602.h"
void main()
{
lcdinit_1602();
boardinit();
time1();
//shi=At24c02Read(3);
//if(shi>24)
//shi=0;
// fen=At24c02Read(2);
// if(fen>60)
// fen=0;
miao=At24c02Read(3);
if(miao>60)
miao=0;
Disp_1602(1,1," 2017-06-08 ",16);
Disp_1602(1,2," 22:06:59 ",16);
while(1)
{
keyscan();
//shi=At24c02Read(3);
//write_dierhang_1602(5,shi);
miao=At24c02Read(3);
write_dierhang_1602(11,miao);
fen=At24c02Read(2);
write_dierhang_1602(8,fen);
}
}
#include"time.h"
#include"lcd1602.h"
#include"24c02.h"
#include"74hc595.h"
uchar time,shi,fen,miao;
void time1()
{
TMOD=0X10; //设置定时器方式1(16位定时器)
TH1=0X4c; //定时器高八位装初值
TL1=0X00; //定时器低八位装初值 定时50ms
ET1=1; //允许定时器 1 产生中断
TR1=1; //启动定时器 1
EA=1; //外部中断 0初始化
EX0=1; // 开外部中断零,EX1=1; 就是开外部中断 0
IT0=0; // 请求P3.2 跳沿触发方式
}
void zd()interrupt 3
{
TMOD=0X10; //设置定时器方式1(16位定时器)
TH1=0X4c; //定时器高八位装初值
time++;
if(time>=20)
{
time=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
At24c02Write(1,shi);
}
At24c02Write(2,fen);
}
At24c02Write(3,miao);
}
}
#include"24c02.h"
void Delay10us()
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
void I2cStart()
{
SDA=1;
Delay10us();
SCL=1;
Delay10us();//建立时间是SDA保持时间>4.7us
SDA=0;
Delay10us();//保持时间是>4us
SCL=0;
Delay10us();
}
void I2cStop()
{
SDA=0;
Delay10us();
SCL=1;
Delay10us();//建立时间大于4.7us
SDA=1;
Delay10us();
}
unsigned char I2cSendByte(unsigned char dat)
{
unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。
for(a=0;a<8;a++)//要发送8位,从最高位开始
{
SDA=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号
dat=dat<<1;
Delay10us();
SCL=1;
Delay10us();//建立时间>4.7us
SCL=0;
Delay10us();//时间大于4us
}
SDA=1;
Delay10us();
SCL=1;
while(SDA)//等待应答,也就是等待从设备把SDA拉低
{
b++;
if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
{
SCL=0;
Delay10us();
return 0;
}
}
SCL=0;
Delay10us();
return 1;
}
unsigned char I2cReadByte()
{
unsigned char a=0,dat=0;
SDA=1; //起始和发送一个字节之后SCL都是0
Delay10us();
for(a=0;a<8;a++)//接收8个字节
{
SCL=1;
Delay10us();
dat<<=1;
dat|=SDA;
Delay10us();
SCL=0;
Delay10us();
}
return dat;
}
void At24c02Write(unsigned char addr,unsigned char dat)
{
I2cStart();
I2cSendByte(0xa0);//发送写器件地址
I2cSendByte(addr);//发送要写入内存地址
I2cSendByte(dat); //发送数据
I2cStop();
}
unsigned char At24c02Read(unsigned char addr)
{
unsigned char num;
I2cStart();
I2cSendByte(0xa0); //发送写器件地址
I2cSendByte(addr); //发送要读取的地址
I2cStart();
I2cSendByte(0xa1); //发送读器件地址
num=I2cReadByte(); //读取数据
I2cStop();
return num;
}
#include"main.h"
#include"lcd1602.h"
#include"74hc595.h"
#include"key.h"
#include"time.h"
#include "boardinit.h"
#include"24c02.h"
#include"lcd1602.h"
void main()
{
lcdinit_1602();
boardinit();
time1();
//shi=At24c02Read(3);
//if(shi>24)
//shi=0;
// fen=At24c02Read(2);
// if(fen>60)
// fen=0;
miao=At24c02Read(3);
if(miao>60)
miao=0;
Disp_1602(1,1," 2017-06-08 ",16);
Disp_1602(1,2," 22:06:59 ",16);
while(1)
{
keyscan();
//shi=At24c02Read(3);
//write_dierhang_1602(5,shi);
miao=At24c02Read(3);
write_dierhang_1602(11,miao);
fen=At24c02Read(2);
write_dierhang_1602(8,fen);
}
}
#include"time.h"
#include"lcd1602.h"
#include"24c02.h"
#include"74hc595.h"
uchar time,shi,fen,miao;
void time1()
{
TMOD=0X10; //设置定时器方式1(16位定时器)
TH1=0X4c; //定时器高八位装初值
TL1=0X00; //定时器低八位装初值 定时50ms
ET1=1; //允许定时器 1 产生中断
TR1=1; //启动定时器 1
EA=1; //外部中断 0初始化
EX0=1; // 开外部中断零,EX1=1; 就是开外部中断 0
IT0=0; // 请求P3.2 跳沿触发方式
}
void zd()interrupt 3
{
TMOD=0X10; //设置定时器方式1(16位定时器)
TH1=0X4c; //定时器高八位装初值
time++;
if(time>=20)
{
time=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
At24c02Write(1,shi);
}
At24c02Write(2,fen);
}
At24c02Write(3,miao);
}
}
#include"24c02.h"
void Delay10us()
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
void I2cStart()
{
SDA=1;
Delay10us();
SCL=1;
Delay10us();//建立时间是SDA保持时间>4.7us
SDA=0;
Delay10us();//保持时间是>4us
SCL=0;
Delay10us();
}
void I2cStop()
{
SDA=0;
Delay10us();
SCL=1;
Delay10us();//建立时间大于4.7us
SDA=1;
Delay10us();
}
unsigned char I2cSendByte(unsigned char dat)
{
unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。
for(a=0;a<8;a++)//要发送8位,从最高位开始
{
SDA=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号
dat=dat<<1;
Delay10us();
SCL=1;
Delay10us();//建立时间>4.7us
SCL=0;
Delay10us();//时间大于4us
}
SDA=1;
Delay10us();
SCL=1;
while(SDA)//等待应答,也就是等待从设备把SDA拉低
{
b++;
if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
{
SCL=0;
Delay10us();
return 0;
}
}
SCL=0;
Delay10us();
return 1;
}
unsigned char I2cReadByte()
{
unsigned char a=0,dat=0;
SDA=1; //起始和发送一个字节之后SCL都是0
Delay10us();
for(a=0;a<8;a++)//接收8个字节
{
SCL=1;
Delay10us();
dat<<=1;
dat|=SDA;
Delay10us();
SCL=0;
Delay10us();
}
return dat;
}
void At24c02Write(unsigned char addr,unsigned char dat)
{
I2cStart();
I2cSendByte(0xa0);//发送写器件地址
I2cSendByte(addr);//发送要写入内存地址
I2cSendByte(dat); //发送数据
I2cStop();
}
unsigned char At24c02Read(unsigned char addr)
{
unsigned char num;
I2cStart();
I2cSendByte(0xa0); //发送写器件地址
I2cSendByte(addr); //发送要读取的地址
I2cStart();
I2cSendByte(0xa1); //发送读器件地址
num=I2cReadByte(); //读取数据
I2cStop();
return num;
}
24C02是双地址的,不然会被刷掉的