📄 isl12029rtc.c
字号:
/******************************************************************************
函数:RTC_RandomRead()
功能:主机通过I2C总线向从机发送多个字节的数据,也就是资料中说的页写的方式:RANDOM READ.
参数:
ArrayCCRW:高7位是ARRAY 和CCR选择,如果八位是1010111X,则指令选择EEPROM阵列,
如果八位是1101111X,则指令选择是CCR.最低位X是读写标志, X=0,也就是对RTC进行写操作.
ArrayCCRR: 高7位是ARRAY 和CCR选择,如果八位是1010111X,则指令选择EEPROM阵列,
如果八位是1101111X,则指令选择是CCR.最低位X是读写标志,X=1,也就是对RTC进行读操作.
WordAddr1:从机的地址的高八位,形式为0000000A8;
WordAddr0:从机的地址的低八位,形式为A7A6A5A4A3A2A1A0;
*dat:接收的数据
返回:
0:接收成功
1:在接收过程中出现异常
******************************************************************************/
bit RTC_RandomRead(
unsigned char ArrayCCRW,
unsigned char ArrayCCRR,
unsigned char WordAddr1,
unsigned char WordAddr0,
unsigned char *dat
)
{
//确保是向从机写命令,也就是最低位为0.
ArrayCCRW &= 0xFE;
ArrayCCRR |= 0x01;
//启动I2C总线
IIC_Start();
//发送选择ARRAY和CCR,读写命令
IICSendByte(ArrayCCRW);
//判断是否发送成功.
if ( Slave_Ack() )
{
IIC_Stop();
return (bit)1;
}
//从机的子地址的高八位,形式为0000000A8;A8在EEPROM的选择中有意义,有可能为1,因为EEPROM 512字节.
//对CCR始终为0,因为CCR至多64字节
IICSendByte(WordAddr1);
if ( Slave_Ack() )
{
IIC_Stop();
return (bit)1;
}
//从机的子地址的低八位,形式为A7A6A5A4A3A2A1A0;
IICSendByte(WordAddr0);
if ( Slave_Ack() )
{
IIC_Stop();
return (bit)1;
}
//启动I2C总线
IIC_Start();
//发送选择ARRAY和CCR,读写命令
IICSendByte(ArrayCCRR);
//判断是否发送成功.
if ( Slave_Ack() )
{
IIC_Stop();
return (bit)1;
}
*dat=IICreceiveByte();
IIC_Stop();
return (bit)0;
}
/******************************************************************************
函数:RTC_ReadRealTime()
功能:主机通过I2C总线向从机读取RTC的时间.采用RANDOM READ 和 SEQUENTIANT READ 的方式.
提高读取的速度. 最终读取7个数据,SC,MN,HR,DT,MO,YR,DW.
参数:
SC:
RtcValue[7]:读取的数据保存位置
******************************************************************************/
void RTC_ReadRealTime()
{
bit flag;
flag=1;
while(flag==1)
{flag=RTC_RandomRead(0xDE,0xDF, 0x00,SC,&RtcValue[0]);
/*说明上面的参数:SLAVE ADDRESS BYTE(1)=0XDE,SLAVE ADDRESS BYTE(2)=0XDF,
WORDADDRESS(1)=0X00,WORDADDRESS(0)=SC(0X30),数据SC保存在数组RtcValue[7]中的第一个单元*/
}
flag=1;
while(flag==1)
{flag=RTC_RandomRead(0xDE,0xDF, 0x00,MN,&RtcValue[1]);
/*说明上面的参数:SLAVE ADDRESS BYTE(1)=0XDE,SLAVE ADDRESS BYTE(2)=0XDF,
WORDADDRESS(1)=0X00,WORDADDRESS(0)=SC(0X30),数据SC保存在数组RtcValue[7]中的第一个单元*/
}
flag=1;
while(flag==1)
{flag=RTC_RandomRead(0xDE,0xDF, 0x00,HR,&RtcValue[2]);
/*说明上面的参数:SLAVE ADDRESS BYTE(1)=0XDE,SLAVE ADDRESS BYTE(2)=0XDF,
WORDADDRESS(1)=0X00,WORDADDRESS(0)=SC(0X30),数据SC保存在数组RtcValue[7]中的第一个单元*/
}
flag=1;
while(flag==1)
{flag=RTC_RandomRead(0xDE,0xDF, 0x00,DT,&RtcValue[3]);
/*说明上面的参数:SLAVE ADDRESS BYTE(1)=0XDE,SLAVE ADDRESS BYTE(2)=0XDF,
WORDADDRESS(1)=0X00,WORDADDRESS(0)=SC(0X30),数据SC保存在数组RtcValue[7]中的第一个单元*/
}
flag=1;
while(flag==1)
{flag=RTC_RandomRead(0xDE,0xDF, 0x00,MO,&RtcValue[4]);
/*说明上面的参数:SLAVE ADDRESS BYTE(1)=0XDE,SLAVE ADDRESS BYTE(2)=0XDF,
WORDADDRESS(1)=0X00,WORDADDRESS(0)=SC(0X30),数据SC保存在数组RtcValue[7]中的第一个单元*/
}
flag=1;
while(flag==1)
{flag=RTC_RandomRead(0xDE,0xDF, 0x00,YR,&RtcValue[5]);
/*说明上面的参数:SLAVE ADDRESS BYTE(1)=0XDE,SLAVE ADDRESS BYTE(2)=0XDF,
WORDADDRESS(1)=0X00,WORDADDRESS(0)=SC(0X30),数据SC保存在数组RtcValue[7]中的第一个单元*/
}
flag=1;
while(flag==1)
{flag=RTC_RandomRead(0xDE,0xDF, 0x00,DW,&RtcValue[6]);
/*说明上面的参数:SLAVE ADDRESS BYTE(1)=0XDE,SLAVE ADDRESS BYTE(2)=0XDF,
WORDADDRESS(1)=0X00,WORDADDRESS(0)=SC(0X30),数据SC保存在数组RtcValue[7]中的第一个单元*/
}
/*flag=1;
while(flag==1)
{
flag=RTC_SequentialRead(0xDF,0x06,&RtcValue[1]);
} */
}
/******************************************************************************
函数:RTC_Alarm0()
功能:主机通过I2C总线向RTC器件的报警寄存器0写入报警时刻。
说明:采用字节写的方式。
******************************************************************************/
void RTC_Alarm0()
{
bit flag;
flag=1;
do
{
flag=RTC_ByteWrite(0xDE,0x00,0x00,Alarm0Value[0]);
}while(flag==1);
flag=1;
do
{
flag=RTC_ByteWrite(0xDE,0x00,0x01,Alarm0Value[1]);
}while(flag==1);
flag=1;
do
{
flag=RTC_ByteWrite(0xDE,0x00,0x02,Alarm0Value[2]);
}while(flag==1);
flag=1;
do
{
flag=RTC_ByteWrite(0xDE,0x00,0x03,Alarm0Value[3]);
}while(flag==1);
flag=1;
do
{
flag=RTC_ByteWrite(0xDE,0x00,0x04,Alarm0Value[4]);
}while(flag==1);
flag=1;
do
{
flag=RTC_ByteWrite(0xDE,0x00,0x06,Alarm0Value[5]);
}while(flag==1);
}
/******************************************************************************
函数:RTC_Alarm1()
功能:主机通过I2C总线向RTC器件的报警寄存器0写入报警时刻。
说明:采用字节写的方式。
******************************************************************************/
void RTC_Alarm1()
{
bit flag;
flag=1;
while(flag==1)
{flag=RTC_ByteWrite(0xDE,0x00,0x08,Alarm1Value[0]);}
flag=1;
while(flag==1)
{flag=RTC_ByteWrite(0xDE,0x00,0x08,Alarm1Value[1]);}
flag=1;
while(flag==1)
{flag=RTC_ByteWrite(0xDE,0x00,0x08,Alarm1Value[2]);}
flag=1;
while(flag==1)
{flag=RTC_ByteWrite(0xDE,0x00,0x08,Alarm1Value[3]);}
flag=1;
while(flag==1)
{flag=RTC_ByteWrite(0xDE,0x00,0x08,Alarm1Value[4]);}
flag=1;
while(flag==1)
{flag=RTC_ByteWrite(0xDE,0x00,0x0E,Alarm1Value[5]);}
}
/******************************************************************************
函数:RTC_AlarmEnable()
功能:主机通过I2C总线向从机CCR的11(INT )单元写入报警使能控制和模式选择。
说明: 采用字节写入的方式。
******************************************************************************/
void RTC_AlarmEnable()
{
bit flag;
flag=1;
while(flag==1)
{flag=RTC_ByteWrite(0xDE,0x00,0x11,AlarmEnableV);}
}
/******************************************************************************
函数:RTC_SetTime()
功能:设置器件的上电显示时间。
说明:
******************************************************************************/
void RTC_SetTime()
{
bit flag;
flag=1;
while(flag==1)
{
flag=RTC_PageWrite(0xDE,0x00,0x30,0x08,&InitRTC[0]);
}
}
/******************************************************************************
函数:datactolcd()
功能:
说明:
******************************************************************************/
void datactolcd()
{
unsigned char time,i;
for(i=0;i<3;i++)
{time=RtcValue[i];
time&=0x0F;
RTCtime2[7-3*i]=time+ '0';
time=RtcValue[i];
time&=0x70;
time=time>>4;
RTCtime2[6-3*i]=time + '0';//秒值的保存。
}
for(i=0;i<3;i++)
{time=RtcValue[i+3];
time&=0x0F;
RTCtime1[9-3*i]=time+ '0';
time=RtcValue[i+3];
time&=0xF0;
time=time>>4;
RTCtime1[8-3*i]=time + '0';
}
time=RtcValue[6];
time&=0x0F;
switch(time)
{case 0x00 : {RTCtime1[12]=0x53;RTCtime1[13]=0x75;RTCtime1[14]=0x6e;break;}
case 0x01 : {RTCtime1[12]=0x53;RTCtime1[13]=0x75;RTCtime1[14]=0x6e;break;}
case 0x02 : {RTCtime1[12]=0x53;RTCtime1[13]=0x75;RTCtime1[14]=0x6e;break;}
case 0x03 : {RTCtime1[12]=0x53;RTCtime1[13]=0x75;RTCtime1[14]=0x6e;break;}
case 0x04 : {RTCtime1[12]=0x53;RTCtime1[13]=0x75;RTCtime1[14]=0x6e;break;}
case 0x05 : {RTCtime1[12]=0x53;RTCtime1[13]=0x75;RTCtime1[14]=0x6e;break;}
case 0x06 : {RTCtime1[12]=0x53;RTCtime1[13]=0x75;RTCtime1[14]=0x6e;break;}
default:break;
}
}
/******************************************************************************
函数:main()
功能:
说明:
******************************************************************************/
void main()
{
unsigned char x,i;
lcdinit();
RTC_WriteEnable0();
RTC_WriteEnable1();
RTC_SetTime();
RTC_WriteEnable0();
RTC_WriteEnable1();
RTC_Alarm0();
RTC_WriteEnable0();
RTC_WriteEnable1();
RTC_Alarm1();
RTC_WriteEnable0();
RTC_WriteEnable1();
RTC_AlarmEnable();
//RTC_WriteEnable0();
//RTC_WriteEnable1();
while(1)
{
RTC_ReadRealTime();
datactolcd();
x=0;
for(i=0;i<16;i++)
{
DisplayOneChar(x, 0, RTCtime1[i]);
x++;
}
x=4;
for(i=0;i<8;i++)
{
DisplayOneChar(x, 1, RTCtime2[i]);
x++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -