/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: PCF8563.c
** Latest modified Date: 2009-6-8
** Latest Version:
** Descriptions:
**
**--------------------------------------------------------------------------------------------------------
** Created by: Zhangrong
** Created date: 2009-6-8
** Version:
** Descriptions:
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date: 2009-6-8
** Version:
** Descriptions:
**
*********************************************************************************************************/
#include "PCF8563.h"
PCF8563_TIME TimeAndDate;
PCF8563_TIME g_stCurrenTime;
INT8U Flag_sec;
void PCF8563_Init(void)
{
PCF8563_SS(Stop); /* 停止PCF8563 */
TimeAndDate.Year = 11; /* 初始化年 */
TimeAndDate.Mon = 5; /* 初始化月 */
TimeAndDate.Day = 25; /* 初始化日 */
TimeAndDate.Hour = 01; /* 初始化时 */
TimeAndDate.Min = 04; /* 初始化分 */
TimeAndDate.Sec = 30; /* 初始化秒 */
TimeAndDate.Week = 3; /* 初始化周 */
//PCF8563_WriteTime(&TimeAndDate); /* 初始化日期 */
PCF8563_Set_Timer(TimerOn|TimerClk64Hz,64); /* 设置定时器每秒钟溢出一次 */
PCF8563_INT_State(SetINT|TIE|TITP); /* 使能定时器中断 */
PCF8563_SS(Start); /* 开启PCF8563 */
PCF8563_INT_Init();
}
/*********************************************************************************************************
** Function name: PCF8563_Set
** Descriptions: 设置PCF8563
** input parameters: NONE
** Output parameters: NONE
** Returned value: NONE
*********************************************************************************************************/
INT8U PCF8563_WriteTime(PCF8563_TIME *tp)
{
INT8U temp[7];
temp[0] = HEC_to_BCD(tp->Sec);
temp[1] = HEC_to_BCD(tp->Min);
temp[2] = HEC_to_BCD(tp->Hour);
temp[3] = HEC_to_BCD(tp->Day);
temp[4] = HEC_to_BCD(tp->Week);
temp[5] = HEC_to_BCD(tp->Mon);
temp[5] |= 0x80;
temp[6] = HEC_to_BCD(tp->Year);
return(I2C_WriteNByte(PCF8563ADR, 1, 0x02, temp, 7));
}
/*********************************************************************************************************
** Function name: PCF8563_Read
** Descriptions: 读取PCF8563
** input parameters: tp: 指向时间结构体的指针
** Output parameters: FALSE or TRUE
** Returned value: NONE
*********************************************************************************************************/
INT8U PCF8563_ReadTime(PCF8563_TIME *tp)
{
INT8U temp[7];
if (I2C_ReadNByte(PCF8563ADR, 1, 0x02, temp, 7)==FALSE)
return FALSE;
tp->Sec = BCD_to_HEC((temp[0]&0x7f));
tp->Min = BCD_to_HEC((temp[1]&0x7f));
tp->Hour = BCD_to_HEC((temp[2]&0x3f));
tp->Day = BCD_to_HEC((temp[3]&0x3f));
tp->Week = BCD_to_HEC((temp[4]&0x07));
tp->Mon = BCD_to_HEC((temp[5]&0x1f));
tp->Year = BCD_to_HEC(temp[6]);
//Flag_sec = 1;
return TRUE;
}
/*********************************************************************************************************
** Function name: PCF8563_SS
** Descriptions: Start或Stop PCA8563
** input parameters: cmd PCF8563Start 开启PCF8563
** PCF8563Stop 关闭PCF8563
** Output parameters: FALSE or TRUE
** Returned value: NONE
*********************************************************************************************************/
INT8U PCF8563_SS(INT8U cmd)
{
INT8U temp;
if (cmd == Start)
temp = 0;
else
temp = 0x20;
return(I2C_WriteNByte(PCF8563ADR, 1, 0x00, &temp, 1));
}
/*********************************************************************************************************
** Function name: PCF8563_Set_TD
** Descriptions: 设置PCF8563的时间和日期
** input parameters: cmd Sec 设置秒
** Min 设置分
** Hour 设置小时
** Day 设置日
** Week 设置星期
** Mon 设置月
** Year 设置年
** TD 设定值
** Output parameters: FALSE or TRUE
** Returned value: NONE
*********************************************************************************************************/
INT8U PCF8563_Set_TD(INT8U cmd, INT16U TD)
{
INT8U d[2];
INT8U n;
INT8U temp;
INT8U err = TRUE;
if (cmd == YEAR){
err &= I2C_ReadNByte(PCF8563ADR, 1, MONTH, d, 2);
d[0] &= 0x9f;
if (TD < 2000){
d[0] |= 0x80;
d[1] = TD -1900;
}
else{
d[0] &= ~(0x80);
d[1] = TD - 2000;
}
d[1] = HEC_to_BCD(d[1]);
n = 2;
cmd = MONTH;
}
else if (cmd == MONTH){
err &= I2C_ReadNByte(PCF8563ADR, 1, MONTH, &temp, 1);
temp &= 0x80;
d[0] = (INT8U)TD;
d[0] = HEC_to_BCD(d[0]);
d[0] = (d[0]|temp);
n = 1;
}
else {
d[0] = (INT8U)TD;
d[0] = HEC_to_BCD(d[0]);
n = 1;
}
err &= I2C_WriteNByte(PCF8563ADR, 1, cmd, d, n);
return err;
}
/*********************************************************************************************************
** Function name: PCF8563_Get_TD
** Descriptions: 读取PCF8563的时间和日期
** input parameters: cmd Sec 设置秒
** Min 设置分
** Hour 设置小时
** Day 设置日
** Week 设置星期
** Mon 设置月
** Year 设置年
** Output parameters: 读取值
** Returned value: NONE
*********************************************************************************************************/
INT16U PCF8563_Get_TD(INT8U cmd)
{
INT8U d[2];
if (cmd == YEAR){
if (I2C_ReadNByte(PCF8563ADR, 1, MONTH, d, 2)==FALSE){
return FALSE;
}
d[1] = BCD_to_HEC(d[1]);
if (d[0]&0x80){
return ((INT16U)d[1]+1900);
}
else {
return ((INT16U)d[1]+2000);
}
}
I2C_ReadNByte(PCF8563ADR, 1, cmd, d, 1);
switch (cmd){
case MINUTE :
case SECOND :
d[0] &= 0x7f;
break;
case HOUR :
case DAY :
d[0] &= 0x3f;
break;
case MONTH :
d[0] &= 0x1f;
break;
case WEEK :
d[0] &= 0x07;
break;
default :
break;
}
d[0] = BCD_to_HEC(d[0])
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
PCF8563 RTC.rar (2个子文件)
PCF8563.h 3KB
PCF8563.C 13KB
共 2 条
- 1
资源评论
- 夏天了啊2012-07-30i2c怎么读写字节的代码没有。只有一部分参考价值。
- single1042013-05-03写的比较复杂,不够简练
- mdd8901062014-04-12太复杂,没有核心的I2C操作部分的源码。
- http56042014-09-09可以借鉴,但还是要自己写
- action100862013-06-25没有实现功能,不知道问题出在哪里
fuzadebobo
- 粉丝: 7
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功