#include "pcf8563.h"
#include "bsp_iic.h"
#include "bsp_SysTick.h"
#include <stdio.h>
/******************************************************************************
* @file pcf8563.c
* @author Tanch
* @version V1.0.0
* @date 03/10/2019
* @brief pcf8563驱动
******************************************************************************/
//************************************
// Method: DecToBCD
// FullName: DecToBCD
// Access: public
// Returns: unsigned char
// Parameter: unsigned char _dec
// Description: 十进制转BCD编码
//************************************
unsigned char DecToBCD(unsigned char _dec)
{
unsigned char temp = 0;
while (_dec >= 10)
{
temp++;
_dec -= 10;
}
return ((unsigned char)(temp << 4) | _dec);
}
//************************************
// Method: BCDToDec
// FullName: BCDToDec
// Access: public
// Returns: unsigned char
// Parameter: unsigned char _BCD
// Description: BCD编码转十进制
//************************************
unsigned char BCDToDec(unsigned char _BCD)
{
unsigned char temp = 0;
temp = ((unsigned char)(_BCD & (unsigned char)0xF0) >> (unsigned char)0x04) * 10;
return (temp + (_BCD & (unsigned char)0x0F));
}
/******************************************************************************
* @name: PCF8563_ReadOneByte
* @param: ReadAddr:读数据地址
* @note: PCF8563读寄存器值
* @retval:读到的值
******************************************************************************/
uint8_t PCF8563_ReadOneByte(u16 ReadAddr)
{
uint8_t temp=0;
IIC_Start();
IIC_Send_Byte(Write_ADD);
IIC_WaitAck();
IIC_Send_Byte(ReadAddr);
IIC_WaitAck();
IIC_Start();
IIC_Send_Byte(Write_ADD|0X01);
IIC_WaitAck();
temp=IIC_Read_Byte(0);
IIC_Stop();
return temp;
}
/******************************************************************************
* @name: PCF8563_WriteOneByte
* @param: WriteAddr:写数据地址,DataToWrite:要写的数据
* @note: PCF8563向寄存器写值
* @retval:none
******************************************************************************/
void PCF8563_WriteOneByte(u8 WriteAddr,u8 DataToWrite)
{
IIC_Start();
IIC_Send_Byte(Write_ADD);
IIC_WaitAck();
IIC_Send_Byte(WriteAddr);
IIC_WaitAck();
IIC_Send_Byte(DataToWrite);
IIC_WaitAck();
IIC_Stop();
}
/******************************************************************************
* @name: PCF8563_Init
* @param: none
* @note: PCF8563初始化配置
* @retval:none
******************************************************************************/
void PCF8563_Init(void)
{
IIC_GPIO_Init();
SysTick_Delay_Ms(20);
PCF8563_WriteOneByte(0x00,0x00);
PCF8563_WriteOneByte(0x01,0x00);
PCF8563_WriteOneByte(0x0d,0x81);
}
/******************************************************************************
* @name: Read_Date
* @param: date:时间结构体地址
* @note: PCF8563读时间,写入结构体中
* @retval:TURE-读取成功
******************************************************************************/
char Read_Date(DATE* date)
{
date->second = (PCF8563_ReadOneByte(PCF8563_SECOND_ADDRESS))&0x7f;
date->min = (PCF8563_ReadOneByte(PCF8563_MINUTE_ADDRESS))&0x7f;
date->hour = (PCF8563_ReadOneByte(PCF8563_HOUR_ADDRESS))&0x3f;
date->day = (PCF8563_ReadOneByte(PCF8563_DAY_ADDRESS))&0x3f;
date->mon = (PCF8563_ReadOneByte(PCF8563_MONTH_ADDRESS))&0x1f;
date->year = (PCF8563_ReadOneByte(PCF8563_YEAR_ADDRESS))&0xff;
date->second = BCDToDec(date->second);
date->min = BCDToDec(date->min);
date->hour = BCDToDec(date->hour);
date->day = BCDToDec(date->day);
date->mon = BCDToDec(date->mon);
date->year = BCDToDec(date->year);
return TURE;
}
/******************************************************************************
* @name: Write_Date
* @param: date:时间结构体
* @note: 将时间结构体写入PCF8563中
* @retval:TURE-写入成功
******************************************************************************/
char Write_Date(DATE date)
{
date.year = DecToBCD(date.year);
date.mon = DecToBCD(date.mon);
date.day = DecToBCD(date.day);
date.hour = DecToBCD(date.hour);
date.min = DecToBCD(date.min);
date.second = DecToBCD(date.second);
PCF8563_WriteOneByte(0x00,0x20);
PCF8563_WriteOneByte(PCF8563_YEAR_ADDRESS ,date.year);
PCF8563_WriteOneByte(PCF8563_MONTH_ADDRESS ,date.mon);
PCF8563_WriteOneByte(PCF8563_DAY_ADDRESS ,date.day);
PCF8563_WriteOneByte(PCF8563_HOUR_ADDRESS ,date.hour);
PCF8563_WriteOneByte(PCF8563_MINUTE_ADDRESS,date.min);
PCF8563_WriteOneByte(PCF8563_SECOND_ADDRESS,date.second);
PCF8563_WriteOneByte(CONTROL_STATUS_1,0X00);
return TURE;
}
#ifdef PCF8563_TEST
#include "stm32f10x.h"
#include <stdio.h>
#include "usart.h"
#include "bsp_SysTick.h"
int main(void)
{
SysTick_Init();
USART1_Init();
PCF8563_Init();
printf("system startup!!!\r\n");
DATE date = {
.year_H2bit = 20,
.year = 20,
.mon = 3,
.day = 10,
.hour = 21,
.min = 49,
.second = 00,
};
//Write_Date(date);
Read_Date(&date);
while(1)
{
Read_Date(&date);
printf("BeijinTime = %d%d年%d月%d日%d:%d:%d\r\n",date.year_H2bit,date.year,date.mon,date.day,date.hour,date.min,date.second);
SysTick_Delay_Ms(1000);
};
}
#endif
stm32f103的PCF8563驱动代码
5星 · 超过95%的资源 需积分: 5 122 浏览量
2019-03-14
19:55:28
上传
评论 3
收藏 4KB ZIP 举报
反派thon
- 粉丝: 2
- 资源: 5
最新资源
- tensorflow-gpu-2.2.0-cp38-cp38-win-amd64.whl
- tensorflow-gpu-2.2.3-cp38-cp38-win-amd64.whl
- tensorflow-gpu-2.2.3-cp36-cp36m-win-amd64.whl
- SSM 框架搭建部署流程
- Screenshot_2024-05-09-23-33-56-49.jpg
- Linux环境下安装和使用 Spark教程
- Linux环境下搭建Zookeeper的分布式环境教程
- Linux环境下搭建Zookeeper的分布式环境教程
- 大学生创新创业项目:中医药知识图谱构建,包含笔记和代码
- SSM 框架详细搭建流程
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈