DS1302实时钟芯片代码
本文介绍了基于MSP430F4618微控制器的硬件平台,通过P5.5、P5.6和P5.7三个IO口实现与DS1302实时时钟芯片的通信。文章详细描述了如何通过SCK、SDIO和RST引脚进行数据的写入和读取操作,并提供了相关的宏定义和函数实现。具体包括初始化DS1302、设置和读取时间、日期等功能的代码实现。通过这些操作,可以实现对DS1302芯片的精确控制,确保系统时间的准确性和可靠性。
/*硬件平台MSP430F4618
IO口 P5.5 SCK, 5.6 SDIO, 5.7 RST
本文介绍了基于MSP430F4618微控制器的硬件平台,通过P5.5、P5.6和P5.7三个IO口实现与DS1302实时时钟芯片的通信。文章详细描述了如何通过SCK、SDIO和RST引脚进行数据的写入和读取操作,并提供了相关的宏定义和函数实现。具体包括初始化DS1302、设置和读取时间、日期等功能的代码实现。通过这些操作,可以实现对DS1302芯片的精确控制,确保系统时间的准确性和可靠性。
*/
#include "cpu.h"
#include "types.h"
#define SCK_HIGH P5OUT |=BIT5
#define SCK_LOW P5OUT &=~BIT5
#define SCK_OUT P5DIR |=BIT5
#define SD_HIGH P5OUT |=BIT6
#define SD_LOW P5OUT &=~BIT6
#define SD_IN P5DIR &=~BIT6
#define SD_OUT P5DIR |=BIT6
#define SD P5IN & BIT6
#define RST_OUT P5DIR |=BIT7
#define RST_LOW P5OUT &=~BIT7
#define RST_HIGH P5OUT |=BIT7
#define CMD 0x80
#define RDCLK 0x81
#define RDRAM 0xC1
#define WRCLK 0x80
#define WRRAM 0xC0
#define SEC 0
#define MIN 2
#define HR 4
#define DATE 6
#define MON 8
#define DAY 10
#define YEAR 12
#define CONTROL 14
#define TICK 16
void kill_wd(void);
void wr ( INT8U cmd )
{
INT8U i;
SCK_OUT;SD_OUT;
SCK_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
SD_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
for (i=0;i<8;i++)
{ _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
if ( cmd & 0x1 ) SD_HIGH;
else SD_LOW;
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
SCK_HIGH;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
SCK_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
cmd>>=1;
}
}
INT8U rd ( void )
{
INT8U i,tmp,tmp1;
SCK_OUT;
SCK_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
SD_IN;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
tmp=0;tmp1=0x1;
for (i=0;i<8;i++)
{
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
if (SD ) tmp |=tmp1;
else tmp &=(~tmp1);
_NOP();_NOP();_NOP();_NOP();_NOP();
SCK_HIGH;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
SCK_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
tmp1<<=1;
}
return tmp;
}
void set_time(INT8U adr,INT8U time)
{
SCK_OUT;SD_OUT;
SCK_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
SD_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
RST_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
RST_HIGH;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
wr( WRCLK | adr);
wr( time);
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
RST_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
}
INT8U read_time(INT8U adr)
{
INT8U tmp;
SCK_OUT;SD_OUT;
SCK_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
SD_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
RST_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
RST_HIGH;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
wr( RDCLK | adr);
tmp=rd( );
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
RST_LOW;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
return tmp;
}
void ds1302_rtc_init(void)
{
INT16U i;
RST_OUT;
RST_HIGH;
i=10; while (i--) _NOP();
set_time(CONTROL,0);
i= read_time(SEC);
if ( i&0x80) set_time(SEC,i &0x7f);
set_time(TICK,0xa5);
}
void read_rtctime_all(INT16U * tmp_tmr)
{
INT16U tmp;
tmp=read_time(YEAR);
tmp = tmp * 256+read_time( MON);
*tmp_tmr++= tmp;
tmp=read_time(DATE);
tmp = tmp * 256+read_time(HR);
*tmp_tmr++= tmp;
tmp=read_time(MIN);
tmp = tmp * 256+read_time( SEC);
*tmp_tmr= tmp;
}
void read_ds1302time_all(INT16U * tmp_tmr)
{
INT16U tmp;
INT8U tmp_sec;
tmp_sec=read_time( SEC);
tmp=0;
while ( (tmp_sec ^ read_time( SEC)) == 0)
{
_NOP();
tmp++;
kill_wd();
if (tmp>6000 ) break;
};
tmp=read_time(YEAR);
tmp = tmp * 256+read_time( MON);
*tmp_tmr++= tmp;
tmp=read_time(DATE);
tmp = tmp * 256+read_time(HR);
*tmp_tmr++= tmp;
tmp=read_time(MIN);
tmp = tmp * 256+read_time( SEC);
*tmp_tmr= tmp;
}
void set_ds1302all_time ( INT8U hour_tmp,INT8U min_tmp,INT8U sec_tmp)
{
set_time( HR,hour_tmp);
set_time( MIN,min_tmp);
set_time( SEC,sec_tmp);
}
void set_ds1302_date ( INT8U year_tmp,INT8U month_tmp,INT8U date_tmp)
{
set_time( YEAR,year_tmp);
set_time( MON,month_tmp);
set_time( DATE,date_tmp);
}

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)