咚咚咚————【封装驱动】DS3231时钟芯片读写程序,分享交流自己编写的程序。
#ifndef DS3231_H
#define DS3231_H
#define DS3231_WADDRESS 0xD0
#define DS3231_RADDRESS 0xD1
#define DS3231_SEC_REG 0x00
#define DS3231_MIN_REG 0x01
#define DS3231_HOUR_REG 0x02
#define DS3231_WDAY_REG 0x03
#define DS3231_MDAY_REG 0x04
#define DS3231_MONTH_REG 0x05
#define DS3231_YEAR_REG 0x06
#define DS3231_AL1SEC_REG 0x07
#define DS3231_AL1MIN_REG 0x08
#define DS3231_AL1HOUR_REG 0x09
#define DS3231_AL1WDAY_REG 0x0A
#define DS3231_AL2MIN_REG 0x0B
#define DS3231_AL2HOUR_REG 0x0C
#define DS3231_AL2WDAY_REG 0x0D
#define DS3231_CONTROL_REG 0x0E
#define DS3231_STATUS_REG 0x0F
#define DS3231_OFFSET_REG 0x10
#define DS3231_TEMPH_REG 0x11
#define DS3231_TEMPLREG 0x12
#include "sys.h"
#include "delay.h"
#include "usart.h"
void DS3231_Init(void);
void DS3231_Read_Rtc(u8* buf);
void DS3231_Write_Rtc(u8* buf);
#endif
#include "myiic.h"
#include "ds3231.h"
u8 BCD_DEC(u8 bcd)
{
u8 decH;
u8 decL;
decH = (bcd/16)*10;
decL = (bcd%16);
return decH+decL;
}
u8 DEC_BCD(u8 dec)
{
u8 bcdH;
u8 bcdL;
bcdH = (dec/10)*16;
bcdL = (dec%10);
return bcdH+bcdL;
}
void DS3231_Init()
{
IIC_Init();
}
u8 DS3231_Read_Reg(u8 addr)
{
u8 buf=0;
IIC_Start();
IIC_Send(DS3231_WADDRESS);
IIC_WAck();
IIC_Send(addr);
IIC_WAck();
IIC_Start();
IIC_Send(DS3231_RADDRESS);
IIC_WAck();
buf=IIC_Read();
IIC_NAck();
IIC_Stop();
return buf;
}
void DS3231_Write_Reg(u8 addr,u8 value)
{
IIC_Start();
IIC_Send(DS3231_WADDRESS);
IIC_WAck();
IIC_Send(addr);
IIC_WAck();
IIC_Send(value);
IIC_WAck();
IIC_Stop();
delay_ms(1);
}
void DS3231_Read_Rtc(u8* buf)
{
*(buf+0) = BCD_DEC(DS3231_Read_Reg(DS3231_YEAR_REG));
*(buf+1) = BCD_DEC(DS3231_Read_Reg(DS3231_MONTH_REG));
*(buf+2) = BCD_DEC(DS3231_Read_Reg(DS3231_MDAY_REG));
*(buf+3) = BCD_DEC(DS3231_Read_Reg(DS3231_HOUR_REG));
*(buf+4) = BCD_DEC(DS3231_Read_Reg(DS3231_MIN_REG));
*(buf+5) = BCD_DEC(DS3231_Read_Reg(DS3231_SEC_REG));
}
void DS3231_Write_Rtc(u8* buf)
{
DS3231_Write_Reg(DS3231_YEAR_REG,DEC_BCD(*(buf+0)));
DS3231_Write_Reg(DS3231_MONTH_REG,DEC_BCD(*(buf+1)));
DS3231_Write_Reg(DS3231_MDAY_REG,DEC_BCD(*(buf+2)));
DS3231_Write_Reg(DS3231_HOUR_REG,DEC_BCD(*(buf+3)));
DS3231_Write_Reg(DS3231_MIN_REG,DEC_BCD(*(buf+4)));
DS3231_Write_Reg(DS3231_SEC_REG,DEC_BCD(*(buf+5)));
}