//ds1302.h:

/************ DS1302程序 ************
* 版本.........: 1.0
* 作者.........: 陈利栋
* 文件名.......: ds1302.h
* 创建时间.....: 2010.11.11
* 最后修改.....: 2010.11.11
************************************/
#ifndef __DS1302_H__
#define __DS1302_H__

#include "main.h"
#include <time.h>

// 寄存器地址定义
#define DS1302_SECOND_ADDR              0x80
#define DS1302_MINUTE_ADDR              0x82
#define DS1302_HOUR_ADDR                0x84
#define DS1302_DATE_ADDR                0x86
#define DS1302_MONTH_ADDR               0x88
#define DS1302_DAY_ADDR                 0x8a
#define DS1302_YEAR_ADDR                0x8c
#define DS1302_WRITE_PROTECT_ADDR       0x8e     // 写保护
#define DS1302_TRICKLE_CHARGE_ADDR      0x90     // 涓流充电
#define DS1302_CLOCK_BURST_ADDR         0xbe     // 连续读写

#if DS1302_AUTO_TO_DEC == 1

#define DEC_TO_BCD(d) DecToBcd(d)
#define BCD_TO_DEC(b) BcdToDec(b)

#else

#define DEC_TO_BCD(d) d
#define BCD_TO_DEC(b) b

#endif /* DS1302_AUTO_TO_DEC == 1 */

typedef enum
{
    _12_hours, _24_hours
} HourMode_t;

typedef enum
{
    am, pm
} AM_PM_t;

// DS1302日期时间结构
typedef struct
{
    unsigned char Year;                 // 年 0 - 99
    unsigned char Month;                // 月 1 - 12
    unsigned char Date;                 // 日 1 - 31
    unsigned char Hour;                 // 时 1 - 12 或 0 - 23
    unsigned char Minute;               // 分 0 - 59
    unsigned char Second;               // 秒 0 - 59
    unsigned char Day;                  // 星期 1 - 7 星期天 = 7
    HourMode_t    HourMode;             // 小时模式 _12_hours 或 _24_hours
    AM_PM_t       AM_PM;                // 上午下午标志 12时制时有效 am 或 pm
} DS1302_DateTime_t;

// 更新标记 1：已更新 0：未更新
// 调用 DS1302_GetDateTime 后自动清零
extern volatile unsigned char DS1302_Update;

/* 存放日期和时间的变量
   执行 DS1302_GetDateTime 后 时间日期写入到该变量
   修改此值,并执行 DS1302_SetDateTime, 更新到DS1302   */
extern DS1302_DateTime_t DS1302_DateTime;

// 初始化
void DS1302_Init ( void );

// 读取日期和时间, DS1302 -> DS1302_DateTime
void DS1302_GetDateTime ( void );

// 设置日期和时间, DS1302_DateTime -> DS1302
void DS1302_SetDateTime ( void );

unsigned char GetDayFromDate ( unsigned char year, unsigned char month, unsigned char date );

// 扫描(轮询)函数, 扫描频率应大于1Hz
void DS1302_Scan ( void );

void DS1302_Key_Handler ( void );

void Sec_TO_Date ( u32 secs );
u32 Date_TO_Sec ( u16 year, u8 month, u8 date, u8 hour, u8 minute, u8 second );

#endif /* __DS1302_H__ */


