📄 clock.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 + -