📄 isl12029rtc.c
字号:
#include <reg51.h>
#include <intrins.h>
#include <LCD1602.h>
#include <IIC.H>
#define SC 0x30 //秒寄存器
#define MN 0x31 //分寄存器
#define HR 0x32 //时寄存器
#define DT 0x33 //日寄存器
#define MO 0x34 //月寄存器
#define YR 0x35 //年寄存器
#define DW 0x36 //周寄存器
#define Y2K 0x37 //世纪寄存器
#define CCR_R 0xDF //读器件CCR地址
#define CCR_W 0xDE //写器件CCR地址
unsigned char RtcValue[7]; /*该数组保存从器件读取的时间值分别对应SC,MN,HR,DT,MO,YR,DW*/
unsigned char RTCtime1[16]={0x32,0x30,0x00,0x00,':',0x00,0x00,':',0x00,0x00,' ',0x28,0x00,0x00,0x00,0x29};//LCD显示第一行的内容
unsigned char RTCtime2[8]={0x00,0x00,0x3a,0x00,0x00,0x3a,0x00,0x00};//LCD显示第二行的内容时分秒
unsigned char CurrentAdd;
unsigned char ReadEepromF;
unsigned char ReadEeprom[3];
unsigned char code InitRTC[8]={0x00,0x00,0x88,0x01,0x07,0x07,0x00,0x00}; /*写入时间初值:2007年07月01日星期日 08:00:00,采用PAGE方式*/
unsigned char code Alarm0Value[6]={0x80,0x00,0x00,0x00,0x00,0x00};
unsigned char code Alarm1Value[6]={0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char code AlarmEnableV=0x18;
/******************************************************************************
函数:RTC_ByteWrite()
功能:主机通过I2C总线向从机发送多个字节的数据,也就是资料中说的页写的方式:PAGE WRITE.
参数:
ArrayCCRW:高7位是ARRAY 和CCR选择,如果八位是1010111X,则指令选择EEPROM阵列,
如果八位是1101111X,则指令选择是CCR.最低位X是读写标志,在这里我们要求X=0,也就是对RTC进行写操作 .)
WordAddr1:从机的地址的高八位,形式为0000000A8;
WordAddr0:从机的地址的低八位,形式为A7A6A5A4A3A2A1A0;
Size:数据大小(以字节计)
*dat:要发送的数据
返回:
0:发送成功
1:在发送过程中出现异常
******************************************************************************/
bit RTC_ByteWrite(
unsigned char ArrayCCRW,
unsigned char WordAddr1,
unsigned char WordAddr0,
unsigned char dat
)
{
bit flag;
bit sucess;
unsigned char j=0x00;
//确保是向从机写命令,也就是最低位为0.
ArrayCCRW &= 0xFE;
//启动I2C总线
IIC_Start();
//发送选择ARRAY和CCR,读写命令
IICSendByte(ArrayCCRW);
//判断是否发送成功.
flag=1;
flag=Slave_Ack();
/*if(flag)
DisplayOneChar(7, 1, '1');
else
DisplayOneChar(7, 1, '0');*/
if ( flag )
{
IIC_Stop();
sucess=1;
return sucess;
}
//从机的子地址的高八位,形式为0000000A8;A8在EEPROM的选择中有意义,有可能为1,因为EEPROM 512字节.
//对CCR始终为0,因为CCR至多64字节
IICSendByte(WordAddr1);
flag=1;
flag=Slave_Ack();
/* if(flag)
DisplayOneChar(8, 1, '1');
else
DisplayOneChar(8, 1, '0');*/
if ( flag )
{
IIC_Stop();
sucess=1;
return sucess;
}
//从机的子地址的低八位,形式为A7A6A5A4A3A2A1A0;
IICSendByte(WordAddr0);
flag=1;
flag=Slave_Ack();
/* if(flag)
DisplayOneChar(9, 1, '1');
else
DisplayOneChar(9, 1, '0');*/
if ( flag )
{
IIC_Stop();
sucess=1;
return sucess;
}
//发送一个字节的数据
IICSendByte(dat);
flag=1;
flag=Slave_Ack();
/* if(flag)
DisplayOneChar(0x0A, 1, '1');
else
DisplayOneChar(0x0A, 1, '0');*/
//发送每个数据后都要查询ACK,即判断从机是否响应了接收数据
if ( flag )
{
IIC_Stop();
sucess=1;
return sucess;
}
//发送完毕,停止I2C总线,返回
IIC_Stop();
/* i++;
j=i+'0';
DisplayOneChar(0, 1, j);*/
sucess=0;
return sucess;
}
/******************************************************************************
函数:RTC_PageWrite()
功能:主机通过I2C总线向从机发送多个字节的数据,也就是资料中说的页写的方式:PAGE WRITE.
参数:
ArrayCCRW:高7位是ARRAY 和CCR选择,如果八位是1010111X,则指令选择EEPROM阵列,
如果八位是1101111X,则指令选择是CCR.最低位X是读写标志,在这里我们要求X=0,也就是对RTC进行写操作 .)
WordAddr1:从机的地址的高八位,形式为0000000A8;
WordAddr0:从机的地址的低八位,形式为A7A6A5A4A3A2A1A0;
Size:数据大小(以字节计)
*dat:要发送的数据
返回:
0:发送成功
1:在发送过程中出现异常
******************************************************************************/
bit RTC_PageWrite(
unsigned char ArrayCCRW,
unsigned char WordAddr1,
unsigned char WordAddr0,
unsigned char Size,
unsigned char *dat
)
{
bit flag;
bit sucess;
//确保是向从机写命令,也就是最低位为0.
ArrayCCRW &= 0xFE;
//启动I2C总线
IIC_Start();
//发送选择ARRAY和CCR,读写命令
IICSendByte(ArrayCCRW);
//判断是否发送成功.
flag=1;
flag=Slave_Ack();
if (flag)
{
IIC_Stop();
sucess=1;
return sucess;
}
//从机的子地址的高八位,形式为0000000A8;A8在EEPROM的选择中有意义,有可能为1,因为EEPROM 512字节.
//对CCR始终为0,因为CCR至多64字节
IICSendByte(WordAddr1);
flag=1;
flag=Slave_Ack();
if (flag)
{
IIC_Stop();
sucess=1;
return sucess;
}
//从机的子地址的低八位,形式为A7A6A5A4A3A2A1A0;
IICSendByte(WordAddr0);
flag=1;
flag=Slave_Ack();
if (flag)
{
IIC_Stop();
sucess=1;
return sucess;
}
//发送数据
do
{
IICSendByte(*dat++);
//发送每个数据后都要查询ACK,即判断从机是否响应了接收数据
flag=1;
flag=Slave_Ack();
if (flag)
{
IIC_Stop();
sucess=1;
return sucess;
}
} while ( --Size != 0 );
//发送完毕,停止I2C总线,返回
IIC_Stop();
sucess=0;
return sucess;
}
/******************************************************************************
函数:RTC_EepromWriteAll()
功能:主机通过I2C总线向RTC器件的EEPROM写入数据。
说明:采用PAGE写的方式。
******************************************************************************/
/*
void RTC_EepromWrite256()
{
bit flag;
unsigned char i=0,j=0;
for(i=0;i<16;i++)
{
j=i*16;
flag=1;
while(flag==1)
{
flag=RTC_PageWrite(0xAE,0X00,j,16,&Eepromdata0[j]);
}
}
}
*/
/******************************************************************************
函数:RTC_WriteEnable()
功能:主机通过I2C总线向从机写入02H,06H,使写操作有效.
参数:
******************************************************************************/
void RTC_WriteEnable0()
{
bit flag;
flag=1;
do
{
flag=RTC_ByteWrite(0xDE,0x00,0x3F,0x02);
}while(flag==1);
}
/******************************************************************************
函数:RTC_WriteEnable()
功能:主机通过I2C总线向从机写入02H,06H,使写操作有效.
参数:
******************************************************************************/
void RTC_WriteEnable1()
{
bit flag;
flag=1;
do
{
flag=RTC_ByteWrite(0xDE,0x00,0x3F,0x06);
}while(flag==1);
}
/******************************************************************************
函数:RTC_SequentialRead()
功能:主机通过I2C总线从从机接收多个字节的数据,即资料中所说的SEQUENTIAL READ,连续读
参数:
ArrayCCRR:高7位是ARRAY 和CCR选择,如果八位是1010111X,则指令选择EEPROM阵列,
如果八位是1101111X,则指令选择是CCR.最低位X是读写标志,在这里我们要求X=1,也就是对RTC进行读操作 .)
SubAddr:从机内存单元的地址
Size: 读取的数据大小(以字节计)
*dat: 保存接收到的数据
返回:
0:接收成功
1:在接收过程中出现异常
******************************************************************************/
/*bit RTC_SequentialRead(
unsigned char ArrayCCRR,
unsigned char Size,
unsigned char *dat
)
{
//确保SLAVEADDRESS的最低位是1,也就是进行读操作.
ArrayCCRR |= 0x01;
//启动I2C总线
IIC_Start();
//发送SLAVEADDRESS
IICSendByte(ArrayCCRR);
//主机产生ACK,并且接收指定个数的数据
//判断是否发送成功.
if ( Slave_Ack() )
{
IIC_Stop();
return (bit)1;
}
for (;;)
{
*dat++ = IICreceiveByte();//保存数据
master_Ack();//主机产生ACK应答信号,要求从机发送数据.
if ( --Size == 1 )
{
break;//接收结束.
}
}
*dat++ = IICreceiveByte();//保存最后一个数据
//停止I2C总线
IIC_Stop();
//接收完毕,返回
return (bit)0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -