/******************************************************/
// 用途:DS1302是一款时钟芯片,精度不高可应用在时间精度要求不高的场所。
// 总线结构:SPI(注SPI总线,是上升沿将数据写入,下降沿将数据读出)
// 注意事项:DS1302写入、读出的数据均为BCD码格式的,显示时应注意格式转换
/******************************************************/
# include "include.h"
const uchar init_ds1302_time[7] = {0x20, 0X14, 0X09, 0X23, 0X04, 0X21, 0X00}; // 写入初始化的时间,格式要注意使用BCD码
// 14年 9月 23日 4时 21分 0秒 注:写入小时的最高位决定采用12制、24制,高位为0是24制
uchar read_ds1302_time[6] = {0};
uchar tran_read_ds1302_time[6] = {0};
/*****************************************************/
//函数名称:ds1302初始化函数
//函数功能:将复位、时钟引脚拉低,并将初始化时间写入
//编写时间:2014.8
//注意事项:无
/****************************************************/
void ds1302_init(void)
{
DS1302_RST_CLR;
DS1302_SCLK_CLR;
ds1302_inittime();
}
/*****************************************************/
//函数名称:ds1302写时间初始化函数
//函数功能:写入定义的初始化时间
//编写时间:2014.8
//注意事项:无
/****************************************************/
void ds1302_inittime(void)
{
ds1302_write_onebyte(CONTROL ,0x00); //关闭写保护,关闭写保护后,方可写入
ds1302_write_onebyte(SEC_ADDR_WRITE ,0x80); //时钟暂停
ds1302_write_onebyte(SEC_ADDR_WRITE ,init_ds1302_time[6]); //写入秒
ds1302_write_onebyte(MIN_ADDR_WRITE ,init_ds1302_time[5]); //写入分
ds1302_write_onebyte(HR_ADDR_WRITE ,init_ds1302_time[4]); //写入时
ds1302_write_onebyte(DATE_ADDR_WRITE ,init_ds1302_time[3]); //写入日
ds1302_write_onebyte(MONTH_ADDR_WRITE ,init_ds1302_time[2]); //写入月
ds1302_write_onebyte(YEAR_ADDR_WRITE ,init_ds1302_time[1]); //写入年
ds1302_write_onebyte(CONTROL ,0x80); //打开写保护
}
/*****************************************************/
//函数名称:读ds1302时间函数
//函数功能:读出时间
//编写时间:2014.8
//注意事项:无
/****************************************************/
void read_real_ds1302time(void)
{
uchar i = 0;
read_ds1302_time[5] = ds1302_read_onebyte(SEC_ADDR_READ); //读出秒
read_ds1302_time[4] = ds1302_read_onebyte(MIN_ADDR_READ); //读出分
read_ds1302_time[3] = ds1302_read_onebyte(HR_ADDR_READ); //读出时
read_ds1302_time[2] = ds1302_read_onebyte(DATE_ADDR_READ); //读出日
read_ds1302_time[1] = ds1302_read_onebyte(MONTH_ADDR_READ); //读出月
read_ds1302_time[0] = ds1302_read_onebyte(YEAR_ADDR_READ); //读出年
for(i = 0 ; i < 6 ; i++)
{
tran_read_ds1302_time
= (read_ds1302_time >> 4) * 10 + (read_ds1302_time % 16); //将BCD码转换成十进制数
}
}
/*****************************************************/
//函数名称:ds1302写一个字节函数
//函数功能:向特定地址写入一个数据
//编写时间:2014.8
//注意事项:具体的时序图见使用手册
/****************************************************/
void ds1302_write_onebyte(uchar com,uchar data)
{
uchar i;
DS1302_DATAOUT; //数据口设置为输出
DS1302_RST_SET; //将复位引脚拉高,否则不使能DS1302
DS1302_SCLK_CLR;
for(i=0; i<8; i++)
{
if(com & 0x01) //数据从低位到高位依次写入
DS1302_DATAOUT_SET;
else
DS1302_DATAOUT_CLR;
DS1302_SCLK_SET; //营造上升沿,将数据并写入DS1302中
DS1302_SCLK_CLR;
com >>= 1;
}
for(i = 0 ; i < 8 ; i++)
{
if(data & 0x01)
DS1302_DATAOUT_SET;
else
DS1302_DATAOUT_CLR;
DS1302_SCLK_SET;
DS1302_SCLK_CLR;
data >>= 1;
}
DS1302_RST_CLR; //数据写完后将复位引脚拉低
}
/*****************************************************/
//函数名称:ds1302读一个字节函数
//函数功能:从特定地址中读出时间
//编写时间:2014.8
//注意事项:具体时序图参见使用手册
/****************************************************/
uchar ds1302_read_onebyte(uchar com)
{
uchar i ,data = 0;
DS1302_DATAOUT;
DS1302_RST_SET;
DS1302_SCLK_CLR;
for(i = 0 ; i < 8 ; i++) //先写入地址
{
if(com & 0x01)
DS1302_DATAOUT_SET;
else
DS1302_DATAOUT_CLR;
DS1302_SCLK_SET;
DS1302_SCLK_CLR;
com >>= 1;
}
DS1302_DATAIN; //数据方向设置为输入
for(i = 0 ; i < 8 ; i++)
{
data >>= 1; //先读出的是数据的最低位
if(DS1302_DATAIN_READ)
data |= 0x80;
else
data &= 0x7f;
DS1302_SCLK_SET;
_NOP();
_NOP();
DS1302_SCLK_CLR; //营造一个下降沿,将ds1302的数据读出
_NOP();
_NOP();
}
DS1302_RST_CLR;
return data;
}
void ds1302read_time_show(void)
{
read_real_ds1302time();
show_digitalnum_add(line_2,tran_read_ds1302_time[0],2);
no_adr_DisplayCgrom("-");
show_digitalnum_nonadd(tran_read_ds1302_time[1],2);
no_adr_DisplayCgrom("-");
show_digitalnum_nonadd(tran_read_ds1302_time[2],2);
show_digitalnum_add(line_3+2,tran_read_ds1302_time[3],2);
no_adr_DisplayCgrom(":");
show_digitalnum_nonadd(tran_read_ds1302_time[4],2);
no_adr_DisplayCgrom(":");
show_digitalnum_nonadd(tran_read_ds1302_time[5],2);
}
# ifndef _ds1302_h_
# define _ds1302_h_
# define DS1302_RST_SET (P5OUT |= BIT1)
# define DS1302_RST_CLR (P5OUT &= ~BIT1)
# define DS1302_DATAOUT (P5DIR |= BIT2)
# define DS1302_DATAIN (P5DIR &= ~BIT2)
# define DS1302_DATAIN_READ (P5IN & BIT2)
# define DS1302_DATAOUT_SET (P5OUT |= BIT2)
# define DS1302_DATAOUT_CLR (P5OUT &= ~BIT2)
# define DS1302_SCLK_SET (P5OUT |= BIT3)
# define DS1302_SCLK_CLR (P5OUT &= ~BIT3)
# define SEC_ADDR_WRITE 0X80
# define MIN_ADDR_WRITE 0X82
# define HR_ADDR_WRITE 0X84
# define DATE_ADDR_WRITE 0X86
# define MONTH_ADDR_WRITE 0X88
# define DAY_ADDR_WRITE 0X8a
# define YEAR_ADDR_WRITE 0X8c
# define SEC_ADDR_READ 0X81
# define MIN_ADDR_READ 0X83
# define HR_ADDR_READ 0X85
# define DATE_ADDR_READ 0X87
# define MONTH_ADDR_READ 0X89
# define DAY_ADDR_READ 0X8b
# define YEAR_ADDR_READ 0X8d
# define CONTROL 0X8e
void ds1302_init(void);
void ds1302_inittime(void);
void read_real_ds1302time(void);
void ds1302_write_onebyte(uchar com,uchar data);
uchar ds1302_read_onebyte(uchar com);
void ds1302read_time_show(void);
//extern uchar tran_read_ds1302_time[];
# endif