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

📄 isl12029rtc.c

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