DS1302时钟芯片驱动程序 (2)

void ds1302_conversion_hourly(u8 hourly,u8 ampm) //转换12/24小时制,AM/PM
{
ds1302_write(0x8E,0x00); //允许写
if(hourly == HOURLY_12) //12小时制
{
t_time.hour |= BIT(7);
if(ampm == HOURLY_PM) //PM
t_time.hour |= BIT(5);
else if(ampm == HOURLY_AM)
t_time.hour &= ~BIT(5);
}
else if(hourly == HOURLY_24) //24小时制
{
t_time.hour &= ~BIT(7);
}
ds1302_write(0x84,dec_bcd(t_time.hour));
ds1302_write(0x8E,0x80); //禁止写
}

void ds1302_write_ram(void)//写入RAM的记忆信息
{
ds1302_write(0x8E,0x00); //允许写

/
此处记忆闹钟数据,地址范围0xc0,0xc2...~0xe4
ds1302_write(0xc0,0x08);//闹钟一小时位
ds1302_write(0xc2,0x00);//闹钟一分钟位
ds1302_write(0xc4,0x08);//闹钟二小时位
ds1302_write(0xc5,0x00);//闹钟二分钟位
/
ds1302_write(0x8E,0x80); //禁止写
}
void ds1302_reset(void)//复位---写入寄存器时间日期和记忆信息
{
//默认时间日期初始化
t_time.second = 0;
t_time.minute = 0;
t_time.hour = 8;
t_time.day = 1;
t_time.month = 10;
t_time.year = 17;
t_time.wday = week_conversion(t_time.year,t_time.month,t_time.day);
//写入时间日期
//ds1302_write_time();
/*********************************************************************
//写入RAM的记忆信息
ds1302_write_ram();
*********************************************************************/
ds1302_write_time();

ds1302_write(0x8E,0x00); //允许写 ds1302_write(0xFC,0x99); //用于判断是否曾经初始化过时间 ds1302_write(0x8E,0x80); //禁止写

}

void ds1302_init(void) //1302芯片初始化
{
u8 temp = 0;

DS1302_IO_INIT(); DS1302_RST_LOW(); DS1302_CLK_LOW(); temp = ds1302_read(0xFD); //判断振荡器是否为开 if(temp != 0x99) //如果特定寄存器的数据不是默认写入的值---重写默认时间 { ds1302_reset(); //重新写入时间 printf("DS1302 reinit ......\n"); }

/********************************************************************************/
ds1302_write(0x8E,0x00); //允许写
ds1302_write(0xFA,0x89); //写0x89
ds1302_write(0x8E,0x80); //禁止写
//delay_ms(10);
temp = ds1302_read(0xFB);
if(temp == 0x89) //读取写进去的值
{
printf("DS1302 init successful !\n");
}
else
{
printf("DS1302 init error !\n");
}
/********************************************************************************/

ds1302_read_time(); //读取时间 t_time.second &= 0x7F; //启动DS1302时钟振荡器(0x80寄存器的bit7置0) ds1302_write(0x8E,0x00); //允许写

/********************************************************/
ds1302_write(0x80,dec_bcd(t_time.second));
ds1302_write(0x90,TCS_OFF|DS_OFF); //充电被禁止

//ds1302_conversion_hourly(HOURLY_12,HOURLY_PM);//设置小时制

/********************************************************/
//ds1302_write(0x90,TCS_ON|DS_DIODE_TWO|CS_RES_8K); //启动充电---2个二极管,8K电阻涓流充电
ds1302_write(0x8E,0x80); //禁止写
/
if(t_time.second > 59)
t_time.second = 0;
if(t_time.minute > 59)
t_time.minute = 0;
if(t_time.hour > 23)
t_time.hour = 0;
if(t_time.day > 31)
t_time.day = 1;
if(t_time.month > 12)
t_time.month = 1;
if(t_time.year > 99)
t_time.year = 0;
/
}

/****************************************************************************
算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期,但如果是在闰年又不到
3月份,上述之和要减一天再除7,星期数为0
century=0 为21世纪,century=1 为20世纪
输入输出数据均为BCD数据
年月日为16进制数
*****************************************************************************/
u8 week_conversion(u8 year,u8 month,u8 day) //星期转换
{
u16 y = year + 2000;
//一月和二月被当作前一年的
if((month==1)||(month==2))
{
month+=12;
y--;
}
//u8 week=(day+2month+3(month+1)/5+y+y/4-y/100+y/400)%7;
//printf("new:%d.%d.%d\n",y,month,day);
return (day+2month+3(month+1)/5+y+y/4-y/100+y/400)%7+1;
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzdzyy.html