📄 ds1302.c
字号:
#include "msp430x14x.h"
#include "math.h"
#define uchar unsigned char
#define uint unsigned int
void FllInit(); //CPU clock setup
uint DSSCLK=BIT2;
uint DSIO=BIT3;
uint DSRST=BIT4;
//时间显示设置
char DispTimeFlag;
uchar CurTime[8]={1,80,1,1,1,1,1},DownTime[8];
void DispDate(void),DispTime(void),GetTime(void),DS1302InputByte(unsigned char uchDa);
void Write1302(unsigned char uchAddr, unsigned char uchDa);
void Set1302(unsigned char *ptrSecDa);
unsigned char Read1302(unsigned char uchAddr),DS1302OutputByte(void);
main()
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT;
FllInit();
Set1302(CurTime);
GetTime();
}
void FllInit() //系统时钟设置 Rsel=5,Dco=3 Mod=0
{
BCSCTL1=XT2OFF+RSEL2 + RSEL0 ;
DCOCTL=DCO0 + DCO1;//+ DCO2
BCSCTL2=SELM0;
}
void Set1302(unsigned char *ptrSecDa) //初始时间格式为: 秒 分 时 日 月 星期 年
{
unsigned char i,j;
unsigned char uchAddr =0x80;
j=Read1302(0x8e)&0x80;
if(j==0)
{
Write1302(0x8e,0x00); /* 控制命令,WP=0,eanble write*/
for(i =7;i>0;i--)
{
Write1302(uchAddr,*ptrSecDa);
ptrSecDa++;
uchAddr +=2;
}
Write1302(0x8e,0x80); //WP=1,write protec
}
}
void GetTime() //读取DS1302当前时间
{
uchar i;
uchar uchAddr=0x81;
for(i=0;i<7;i++)
{
CurTime[i]=Read1302(uchAddr);//格式为: 秒 分 时 日 月 星期 年
uchAddr+=2;
}
uchAddr=0xd0; //存时间至1302RAM中
Write1302(0x8e,0x00); //允许写操作
for(i=0;i<7;i++)
{
Write1302(uchAddr,CurTime[i]);
uchAddr+=2;
}
Write1302(0x8e,0x80);
uchAddr=0xd1;
for(i=0;i<7;i++)
{
DownTime[i]=Read1302(uchAddr);
uchAddr+=2;
}
}
unsigned char Read1302(unsigned char uchAddr)
{
unsigned char uchDa;
uchAddr |= BIT0; //read address: bit0 is 1
P3DIR |= DSRST;
P3DIR |= DSSCLK;
P3OUT &= ~DSRST;
P3OUT &= ~DSSCLK;
_NOP();
_NOP();
P3OUT |= DSRST;
_NOP();
_NOP();
DS1302InputByte(uchAddr); //write address
uchDa = DS1302OutputByte(); //read 1 Byte
P3OUT |= DSSCLK;
P3OUT &= ~DSRST;
return(uchDa);
}
void Write1302(unsigned char uchAddr, unsigned char uchDa)
{
uchAddr &= 0xfe; //write address: bit0 is 0
P3DIR |= (DSRST+DSSCLK);
P3OUT &= ~DSRST; //first rst set 0
P3OUT &= ~DSSCLK; //sclk set 0
_NOP();
_NOP();
P3OUT |=DSRST; //then rst set 1, enable operate 1302
_NOP();
_NOP();
_NOP();
DS1302InputByte(uchAddr); //firt write address
DS1302InputByte(uchDa); //then write data
P3OUT |= DSSCLK; //sclk set 1
P3OUT &= ~DSRST;
}
void DS1302InputByte(unsigned char uchDa)
{
unsigned char i;
unsigned char uchWData;
uchWData = uchDa;
P3DIR|=(DSIO+DSSCLK);
for(i=8;i>0;i--)
{
if ((uchWData&BIT0)==BIT0)
P3OUT|=DSIO;
else
P3OUT&=~DSIO;
P3OUT&=~DSSCLK; //data input as sclk rising
_NOP();
P3OUT |= DSSCLK;
uchWData = uchWData >> 1;
}
}
unsigned char DS1302OutputByte(void)
{
unsigned char i,ReadData;
P3DIR |= DSSCLK;
P3DIR |= DSIO;
P3OUT |= DSIO;
P3DIR &= ~DSIO;
for(i=0;i<8;i++)
{
P3OUT|=DSSCLK; //read from 1302 as sclk falling down
_NOP();
P3OUT&=~DSSCLK;
ReadData >>=1;
if((P3IN&DSIO)==DSIO)
ReadData|=BIT7;
else
ReadData &= ~BIT7;
}
return(ReadData);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -