[mw_shl_code=c,true]#include "stm32f10x.h"
#include "bsp_led.h"
#define DS1302_SCLK_HIGH LED3_OFF ; //?????????? 1
#define DS1302_SCLK_LOW LED3_ON ; //?????????? 0
#define DS1302_IO_HIGH LED4_OFF ;
#define DS1302_IO_LOW LED4_ON ;
#define DS1302_RST_HIGH LED5_OFF;
#define DS1302_RST_LOW LED5_ON ;
typedef struct __SYSTEMTIME__
{
u8 Second;
u8 Minute;
u8 Hour;
u8 Week;
u8 Day;
u8 Month;
u8 Year;
u8 DateString[9];
u8 TimeString[9];
}SYSTEMTIME; //time mode
#define AM(X) X
#define PM(X) (X+12) //24 hour
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
#define DS1302_RAM(X) (0xC0+(X)*2)
void DS1302InputByte(u8 d)
{
u8 i,ReadValue ;
for(i=8;i > 0 ; i-- )
{
if(d & 0x01 )
{
DS1302_IO_HIGH
}
else
{
DS1302_IO_LOW
}
d>>= 1 ;
DS1302_SCLK_HIGH
DS1302_SCLK_LOW
}
}
u8 DS1302OutputByte(void)
{
u8 i, ReadValue ;
DS1302_IO_HIGH
for( i = 8 ; i > 0 ; i-- )
{
ReadValue >>= 1 ;
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12)==1) //io high
{
ReadValue |= DS1302_SECOND ;
}
else
{
ReadValue &= 0x7f ;
}
DS1302_SCLK_HIGH
DS1302_SCLK_LOW
}
return ReadValue ;
}
void Write1302(u8 a, u8 d)
{
DS1302_RST_LOW
DS1302_SCLK_LOW
DS1302_RST_HIGH
DS1302InputByte( a ) ;
DS1302InputByte(d) ;
DS1302_RST_LOW
DS1302_SCLK_HIGH
}
u8 Read1302(u8 a)
{
u8 ReadValue ;
DS1302_RST_LOW
DS1302_SCLK_LOW
DS1302_RST_HIGH
DS1302InputByte(a ) ;
ReadValue = DS1302OutputByte() ;
DS1302_RST_LOW
DS1302_SCLK_HIGH
return ReadValue ;
}
void DS1302_SetProtect(c)
{
if(c)
Write1302(0x8E,0x10);
else
Write1302(0x8E,0x00);
}
void DS1302_SetTime(unsigned char Address, unsigned char Value)
{
DS1302_SetProtect(0);
Write1302(Address, ((Value/10)<<4 | (Value%10)));
}
void DS1302_GetTime(SYSTEMTIME *Time) //8--10
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_DAY);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_WEEK);
Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MONTH);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
}
void DateToStr(SYSTEMTIME *Time)
{
Time->DateString[0] = Time->Year ;
Time->DateString[2] = '-';
Time->DateString[3] = Time->Month;
Time->DateString[5] = '-';
Time->DateString[6] = Time->Day ;
Time->DateString[8] = '\0';
}
void TimeToStr(SYSTEMTIME *Time)
{
Time->TimeString[0] = Time->Hour ;
Time->TimeString[2] = ':';
Time->TimeString[3] = Time->Minute;
Time->TimeString[5] = ':';
Time->TimeString[6] = Time->Second;
Time->DateString[8] = '\0';
}
void Initial_DS1302(void)
{
unsigned char Second=Read1302(DS1302_SECOND);
if(Second&0x80)
DS1302_SetTime(DS1302_SECOND,0);
}
int main()
{
u8 t0,t1,t2;
SYSTEMTIME CurrentTime;
Initial_DS1302();
DS1302_SetTime(DS1302_HOUR,10);
DS1302_SetTime(DS1302_MINUTE,54);
DS1302_SetTime(DS1302_SECOND,30);
uart_init(115200);
while(1)
{
SYSTEMTIME CurrentTime;
DS1302_GetTime(&CurrentTime);
DateToStr(&CurrentTime);
TimeToStr(&CurrentTime);
t0=CurrentTime.TimeString[0];
t1=CurrentTime.TimeString[3];
t2=CurrentTime.TimeString[6];
printf("t0??%d\nt1??%d\nt2??%d\n",t0,t1,t2);
}
}[/mw_shl_code]
|