📄 pcf8583.c
字号:
#define _PCF8583_
#include "..\Inc\Includes.h"
/*********************************************************************************************************
* 函数名称:Time_rest
*
* 功能描述:判断某一单元是否为指定数据,否则电池经历过掉电状态,须初始化时间单元
*
* 说明:
*
********************************************************************************************************/
void Time_rest(void)
{
Uint8 x; // 判断0xf0单元是否位0x23,否则写入0x23,并给时钟芯片给初值
x = Time_rd(0xF0);
if(x!=0x23)
{
Time_wr_data();
Time_wr_data();
Time_wr(0xF0,0x23);
}
}
/*********************************************************************************************************
* 函数名称:Time_yudushej
*
* 功能描述:读时间单元的数据
*
* 说明:时间单元“裕度设计”次数由实际需要确定N>=1
*
********************************************************************************************************/
void Time_yudushej(unsigned char k)
{
unsigned char m=0,n=1;
Uint32 x=0;
Time_rd_data();
do{
m++; // 判断结果是否有效,否则重新给值
if((Time8583.Seconds>59)||(Time8583.Minutes>59)||(Time8583.Hours>23)||((Time8583.Date==0)||(Time8583.Date>31))||((Time8583.Months==0)||(Time8583.Months>12)))
{
for(x=0;x<5000;x++); // 等待在读
Time_rd_data();
}
else
n=0;
}while((m<k)&&(n==1));
if(n==1)
Time_wr_data();
}
/*********************************************************************************************************
* 函数名称:Time_rd_data
*
* 功能描述:读时间单元数据
*
* 说明:
*
********************************************************************************************************/
void Time_rd_data(void)
{ // 1. 读出时间单元 2.没有在范围内重新给定初值
IIWR(PCF8583,0x00,0x40); // 保持当前时间单元
Time8583.Seconds = Time_rd(0x02);
Time8583.Minutes = Time_rd(0x03);
Time8583.Hours = Time_rd(0x04);
Time8583.Date = Time_rd(0x05);
Time8583.Months = Time_rd(0x06);
Time8583.Year = Time_rd(0x07);
IIWR(PCF8583,0x00,0x00); // 计数状态
Time8583.Seconds = (((Time8583.Seconds&0xf0)>>4)*10)+(Time8583.Seconds&0x0f);
Time8583.Minutes = (((Time8583.Minutes&0xf0)>>4)*10)+(Time8583.Minutes&0x0f);
Time8583.Hours = (((Time8583.Hours&0x30)>>4)*10)+(Time8583.Hours&0x0f);
Time8583.Date = (((Time8583.Date&0x30)>>4)*10)+(Time8583.Date&0x0f);
Time8583.Months = (((Time8583.Months&0x10)>>4)*10)+(Time8583.Months&0x0f);
Time8583.Year = (((Time8583.Year&0x10)>>4)*10)+(Time8583.Year&0x0f);
Time_now[0]=Time8583.Year;
Time_now[1]=Time8583.Months;
Time_now[2]=Time8583.Date;
Time_now[3]=Time8583.Hours;
Time_now[4]=Time8583.Minutes;
Time_now[5]=Time8583.Seconds;
}
/*********************************************************************************************************
* 函数名称:Time_wr_data
*
* 功能描述:初始化时间单元
*
* 说明:
*
********************************************************************************************************/
void Time_wr_data(void)
{
IIWR(PCF8583,0x00,0x80); // 停止计数
IIWR(PCF8583,0x07,0x06); // 年 --- 06 年
IIWR(PCF8583,0x06,0x01); // 月 --- 01 月
IIWR(PCF8583,0x05,0x01); // 日 --- 01 日
IIWR(PCF8583,0x04,0x00); // 时 --- 12 点
IIWR(PCF8583,0x03,0x00); // 分 --- 00 分
IIWR(PCF8583,0x02,0x00); // 秒 --- 00 秒
IIWR(PCF8583,0x00,0x00); // 启动计数
Time8583.Seconds =0;
Time8583.Minutes =0;
Time8583.Hours =0;
Time8583.Date =1;
Time8583.Months =1;
Time8583.Year =6; // 10 月 01 日 08 : 15
Time_now[0] = 6;
Time_now[1] = 1;
Time_now[2] = 1;
Time_now[3] = 0;
Time_now[4] = 0;
Time_now[5] = 0;
}
/*********************************************************************************************************
* 函数名称:NowTime_wr_data
*
* 功能描述:修改当前时间
*
* 说明:
*
********************************************************************************************************/
void NowTime_wr_data(uchar *p)
{
uchar time;
IIWR(PCF8583,0x00,0x80); // 停止计数
time = (p[0]/10)*16 + p[0]%10;
IIWR(PCF8583,0x07,time); // 年
time = (p[1]/10)*16 + p[1]%10;
IIWR(PCF8583,0x06,time); // 月
time = (p[2]/10)*16 + p[2]%10;
IIWR(PCF8583,0x05,time); // 日
time = (p[3]/10)*16 + p[3]%10;
IIWR(PCF8583,0x04,time); // 时
time = (p[4]/10)*16 + p[4]%10;
IIWR(PCF8583,0x03,time); // 分
time = (p[5]/10)*16 + p[5]%10;
IIWR(PCF8583,0x02,time); // 秒 --- 00 秒
Time_wr(0xF0,0x23);
IIWR(PCF8583,0x00,0x00); // 启动计数
}
/*********************************************************************************************************
* 函数名称:Time_wr
*
* 功能描述:向某一指定地址写一个数据
*
* 说明:x:单元 y:数据
*
********************************************************************************************************/
void Time_wr(Uint8 x,Uint8 y)
{
IIWR(PCF8583,x,y);
}
/**********************************************************************************************
功能: 向某一指定单元读一个数据
读 地址x 单元,返回数据
**********************************************************************************************/
Uint8 Time_rd(Uint8 x)
{
Uint8 y;
y=IIRD(PCF8583,x);
return(y);
}
/********************************************** END ***********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -