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

📄 clock.c

📁 本程序是通过软件模拟I2C协议对8563进行读写函数
💻 C
字号:
/*
	8563寄存器数据存储结构说明

	02h 秒			00~59	BCD 码格式数
	03h 分钟		00~59	BCD 码格式数
	04h 小时		00~59	BCD 码格式数
	05h 日			01~31	BCD 码格式数
	06h 星期	    0~6
	07h 月/世纪		01~12 	BCD 码格式数
	08h 年			00~99	BCD 码格式数	
*/
#include	<reg52.h>
#include	"..\Include\ClockDEF.h"
#include	"..\..\I2C\Include\I2C.h"

#define		Clock_OK		0
#define		Clock_ERR		1
/***************************************************************************
参数:读取命令类型clock_rmd(包含0x01,0x02,0x03,0x04), 接收数据区clock_rdate(最大7个字节)
0x01:读取日期     返回日期格式为:yymmdd
0x02:读取时间     返回时间格式为:hhmmss
0x03:读取星期     返回0--6之间的数值
0x04:读取日期时间 返回日期时间格式为:yymmdd hhmmss
注意:
1、	有定义EN_CLOCK_FIRSTLOWBYTE,"日期"、"时间"、"日期时间"的返回格式分别为:"ddmmyy"、"ssmmhh"、"ssmmhhddmmyy"
2、	若要调用读取日期/读取时间需定义EN_CLOCK_READWRITEDATEORTIME                   
    若要调用读取星期需定义EN_CLOCK_READWRITEWEEK                                        
    若要调用读取日期时间需定义EN_CLOCK_READWRITELONGDATETIME       
3、返回值0x00:成功;0x01:失败
***************************************************************************/

unsigned char Clock_Get(unsigned char clock_rcmd,unsigned char * clock_rdate)
{
#ifndef EN_CLOCK_FIRSTLOWBYTE
	unsigned char tmp;
#endif
	switch(clock_rcmd)
	{ 
#ifdef EN_CLOCK_READWRITEDATEORTIME
		case 0x01:
			I2C_Read(clock_rdate,CLOCK_REG+3,4,CLOCK_DEVNO);
			clock_rdate[1] = ( clock_rdate[2] & 0x1f );	//月
	#ifdef EN_CLOCK_FIRSTLOWBYTE    //返回日月年格式                           
			clock_rdate[0] &= 0x3f;	//日
			clock_rdate[2] = clock_rdate[3];	//年
			if( clock_rdate[0] <= 0x31 )			//位5为1时日期超过31天  
			   	 return Clock_OK;
	#else                         //返回年月日格式
			clock_rdate[2] = ( clock_rdate[0] & 0x3f );	//日
			clock_rdate[0] = clock_rdate[3];	//年
			if( clock_rdate[2] <= 0x31)			//位5为1时日期超过31天  
			   	 return Clock_OK;
	#endif
			break;
		case 0x02:
			I2C_Read(clock_rdate,CLOCK_REG,3,CLOCK_DEVNO);
			clock_rdate[1] &= 0x7f;						//分
	#ifdef EN_CLOCK_FIRSTLOWBYTE       //返回秒分时
			clock_rdate[0] &= 0x7f;	//秒    
			clock_rdate[2] &= 0x3f;	//时
			if( (clock_rdate[2]<0x24) &&
			    (clock_rdate[1]<0x60) &&
				(clock_rdate[0]<0x60)   
			)
				 return Clock_OK;
	#else                            //返回时分秒
			tmp = clock_rdate[0];
			clock_rdate[0] = ( clock_rdate[2] & 0x3f);	//时
			clock_rdate[2] = ( tmp & 0x7f );			//秒
			if( (clock_rdate[0]<24) &&
			    (clock_rdate[1]<60) &&
				(clock_rdate[2]<60)   
			)
				 return Clock_OK;
	#endif
			break;
#endif
#ifdef EN_CLOCK_READWRITEWEEK
		case 0x03:
			I2C_Read(clock_rdate,CLOCK_REG+4,1,CLOCK_DEVNO); 
			clock_rdate[0] &=0x07;						//星期

			if( clock_rdate[0] < 0x07 )
   	    		return Clock_OK;    
	    	break;
#endif
#ifdef EN_CLOCK_READWRITELONGDATETIME
		case 0x04:
			I2C_Read(clock_rdate,CLOCK_REG,7,CLOCK_DEVNO); 
	#ifdef EN_CLOCK_FIRSTLOWBYTE            //返回秒分时日月年
			clock_rdate[0] &= 0x7f;//秒
	        clock_rdate[1] &= 0x7f;//分
			clock_rdate[2] &= 0x3f;//时
			clock_rdate[3] &= 0x3f;//日
			clock_rdate[4] = ( clock_rdate[5] & 0x1f);//月					clock_
			clock_rdate[5] =  clock_rdate[6];//年	
			if( clock_rdate[3] <= 0x31 )			//位5为1时日期超过31天  
			   	 return Clock_OK;
	#else                                //返回年月日时分秒
	        clock_rdate[4]=( clock_rdate[1] & 0x7f );//分
			clock_rdate[1]=( clock_rdate[5] & 0x1f );//月
			clock_rdate[5]=( clock_rdate[0] & 0x7f );//秒
			clock_rdate[0]= clock_rdate[6];//年
	        tmp=clock_rdate[2];//暂存时
			clock_rdate[2]=( clock_rdate[3] & 0x3f );//日
			clock_rdate[3]=( tmp & 0x3f );//时
			if( clock_rdate[2] <= 0x31 )			//位5为1时日期超过31天  
			   	 return Clock_OK;
	#endif
			break;	
#endif
	}				 
    return Clock_ERR;    
}

/***************************************************************************
描述:Clock_Set(unsigned char clock_wcmd,unsigned char *clock_date)设置时间函数
参数:设置命令类型clock_wcmd(包含0x01,0x02,0x03,0x04), 写入数据存储区clock_date(最大7个字节)
0x01:设置日期     返回日期格式为:yymmdd
0x02:设置时间     返回时间格式为:hhmmss
0x03:设置星期     返回0--6之间的数值
0x04:设置日期时间 返回日期时间格式为:yymmdd hhmmss
注意:
1、	若有定义EN_CLOCK_FIRSTLOWBYTE,"日期"、"时间"、"日期时间"的写入格式分别为:"ddmmyy"、"ssmmhh"、"ssmmhhddmmyy"
2、	若要调用设置日期/读取时间需定义EN_CLOCK_READWRITEDATEORTIME                   
    若要调用设置星期需定义EN_CLOCK_READWRITEWEEK                                        
    若要调用设置日期时间需定义EN_CLOCK_READWRITELONGDATETIME       
3、返回值0x00:成功;0x01:失败
***************************************************************************/
unsigned char Clock_Set(unsigned char clock_wcmd,unsigned char *clock_date)
{   
	unsigned char tmp;

	switch(clock_wcmd)
	{ 
#ifdef EN_CLOCK_READWRITEDATEORTIME
		case 0x01:
	#ifdef EN_CLOCK_FIRSTLOWBYTE            //输入格式为日月年   
			clock_date[3] = clock_date[2];	//年
			clock_date[2] = clock_date[1];	//月
	#else
			clock_date[3] = clock_date[0];	//年
			clock_date[0] = clock_date[2];	//日
			clock_date[2] = clock_date[1];	//月
	#endif                                  //输入格式为年月日
			clock_date[1] = 0x01;				//星期
			I2C_Write(clock_date,CLOCK_REG+3,4,CLOCK_DEVNO); 
			I2C_Read(&tmp,CLOCK_REG+6,1,CLOCK_DEVNO);	//检验年份
			if( tmp == clock_date[3] )
				return Clock_OK;
			break;
		case 0x02:
	#ifndef EN_CLOCK_FIRSTLOWBYTE
			tmp=clock_date[0];		//小时暂存
			clock_date[0]= clock_date[2];
			clock_date[2]= tmp;
	#endif
			I2C_Write(clock_date,CLOCK_REG,3,CLOCK_DEVNO); 
			I2C_Read(&tmp,CLOCK_REG+2,1,CLOCK_DEVNO);			//存放校验时间
			if( tmp == clock_date[2] )					////测试
				return Clock_OK;
			break;
#endif
#ifdef EN_CLOCK_READWRITEWEEK
		case 0x03:
			I2C_Write(clock_date,CLOCK_REG+4,1,CLOCK_DEVNO);	//星期 
			I2C_Read(&tmp,CLOCK_REG+4,1,CLOCK_DEVNO);			//存放校验星期
			if(tmp==clock_date[0])
				return Clock_OK;
			break;
#endif
#ifdef EN_CLOCK_READWRITELONGDATETIME
		case 0x04:
	#ifdef EN_CLOCK_FIRSTLOWBYTE
			clock_date[6] = clock_date[5];	//年
			clock_date[5] = clock_date[4];	//月
	#else
			clock_date[6] = clock_date[0];	//年
			clock_date[0] = clock_date[5];	//秒
			clock_date[5] = clock_date[1];	//月
			clock_date[1] = clock_date[4];	//分
			tmp			  = clock_date[2];	//暂存日
			clock_date[2] = clock_date[3];	//时
			clock_date[3] = tmp;			//日
	#endif
			clock_date[4] = 0x01;			//星期
			
			I2C_Write(clock_date,CLOCK_REG,7,CLOCK_DEVNO);
			I2C_Read(&tmp,CLOCK_REG+2,1,CLOCK_DEVNO);  //存放校验时
			if( clock_date[2] == (tmp & 0x3f) )					////测试
				return Clock_OK;
			break;
#endif
	}
	return Clock_ERR;
}

#ifdef EN_CLOCK_INITFUNC
unsigned char Clock_Init(unsigned char *temp) //初始化
{
#ifdef EN_CLOCK_FIRSTLOWBYTE
    unsigned char code DATA[]={0x00,0x30,0x12};
#else
    unsigned char code DATA[]={0x12,0x30,0x00};
#endif
	if( Clock_Get(2,temp) )
		return Clock_Set(2,DATA);
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -