/********************************************************************************

	STM32F103C8T6模块 + DS3231 + 24C32)模块 + TM1637数码管模块 + OLED显示模块

	《实时时钟 + 温度测量并保存,实时OLED显示温度曲线,数码管实际显示时钟》

															的,实验程序……

														2019.2.3完成 by bg4uvr~

********************************************************************************/



#ifndef __DS3231_H
#define __DS3231_H
#include "stm8s.h"

//DS3231硬件地址
#define DS3231_WRITE_ADD	0xD0		//
#define DS3231_READ_ADD		0xD1

//DS3231寄存器定义
#define	SEC				0x00
#define	MIN				0x01
#define HOUR			0x02
#define WEEK			0x03
#define DATE			0x04
#define MONTH			0x05
#define YEAR			0x06
#define AL1_SEC			0x07
#define AL1_MIN			0x08
#define AL1_HOUR		0x09
#define AL1_DAY_DATE	0x0A
#define AL2_MIN			0x0B
#define AL2_HOUR		0x0C
#define AL2_DAY_DATE	0x0D
#define CONTROL			0x0E
	//0x0E控制位
	#define	EOSC		(1<<7)		//电池供电时,时钟是否运行,0:运行,1:停止,VCC时此位无效一直运行,初次上电时默认为0。
	#define BBSQW		(1<<6)      //电池供电时,INT/SQW脚是否输出方波,0:高阻态,1:输出方波,初次上电为0。
	#define	CONV		(1<<5)      //置1强制测量温度(平时64秒自动测量一次)
	#define RS2			(1<<4)		//方波频率选择,RS2:RS1	00=1Hz, 01=1024Hz, 10=4096Hz, 11=8192Hz
	#define RS1			(1<<3)
	#define INTCN		(1<<2)      //“INT/SQW”脚功能设置,0输出方波,1为闹钟中断
	#define A2IE		(1<<1)      //闹钟2使能
	#define A1IE		(1<<0)      //闹钟1使能
#define CTL_STA			0x0F
	//0x0F控制&状态位
	#define	OSF			(1<<7)      //时钟停止标志位。首次上电、VCC和BAT同时掉电、电池供电时EOSC置1、外部干扰等,可造成置位。置位状态需要人工清零。
	#define EN32kHz		(1<<3)      //32K脚输出设置位,电源供电时,1输出32K,0高阻态。上电时此位为1,32K脚输出方波。
	#define BSY			(1<<2)      //温度测量忙标志
	#define A2F			(1<<1)      //闹钟2标志
	#define A1F			(1<<0)      //闹钟1标志
#define AGING_OFFSET	0x10        //校准值,正值增加电容,负值减小电容,25度时每1LSB对频率大约影响0.1ppm。
#define TEMP_H			0x11        //温度整数位(有符号)
#define TEMP_L			0x12        //温度小数位(最左侧2位,所以分辨率为0.25度)

//DS3231寄存器结构体	( 19Bytes )
typedef struct
{
	uint8_t	sec;
	uint8_t min;
	uint8_t hour;
	uint8_t week;
	uint8_t date;
	uint8_t month;
	uint8_t year;
//	uint8_t al1_sec;
//	uint8_t al1_min;
//	uint8_t al1_hour;
//	uint8_t al1_week;
//	uint8_t al2_min;
//	uint8_t al2_hour;
//	uint8_t al2_week;
//	uint8_t ctrl;
//	uint8_t ctrl_sta;
//	uint8_t offset;
	uint8_t temp_h;
	uint8_t	temp_l;
}ds3231_info;


void DS3231_init(void);							//DS3231初始化
void DS3231_Write(uint8_t Reg_add, uint8_t byte_cnt, uint8_t *buf);	//DS3231写器件
void DS3231_Read(uint8_t Reg_add, uint8_t byte_cnt, uint8_t *buf);	//DS3231读器件
extern inline uint8_t bcd2hex(uint8_t bcd_data);	//BCD转HEX
extern inline uint8_t hex2bcd(uint8_t hex_data);	//HEX转BCD
uint8_t max_date(uint8_t year,uint8_t month);		//计算某年某月的天数
uint8_t week(uint8_t year, uint8_t month, uint8_t date);//根据日期计算星期
int8_t DS3231_Read_temp(void);						//强制启动温度测量并读取

#endif