⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isl12029rtc.c

📁 主要实现对时钟芯片isl12029的功能。 isl12029是intersil公司的一款RTC
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
函数: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 + -