📄 drv_1302.c
字号:
#include "system.h"
#define D1302_IO_DDR_SET IO1DIR=IO1DIR|0x02000000
#define D1302_IO_DDR_CLR IO1DIR=IO1DIR&0xfdffffff
extern uint8 set_year_value;
extern uint8 set_month_value;
extern uint8 set_day_value;
extern uint8 set_hour_value;
extern uint8 set_minute_value;
extern uint8 set_second_value;
extern uint8 real_year_value;
extern uint8 real_month_value;
extern uint8 real_day_value;
extern uint8 real_hour_value;
extern uint8 real_minute_value;
extern uint8 real_second_value;
void delayus(uint8 time)
{
unsigned char i;
for(i=0;i<time;i++);
}
uint8 read_bit_ds1302(void)
{
uint8 data;
D1302_IO_DDR_CLR;
data =((IO1PIN&D1302_IO)>>25);
delayus(1);
return data;
}
uint8 read_byte_ds1302(void)
{
uint8 i;
uint8 datak = 0;
for(i=0;i<8;i++)
{
datak = datak >> 1;
if(read_bit_ds1302()) datak |= 0x80;
}
return datak;
}
void DS1302_init(void)
{
delayus(1);
write_clock(CONTROL_ADDRESS,0x00); //open write protection
write_clock(TRICKLE_ADDRESS,0xA5); //select R1=2K,one DIODE
real_second_value=read_clock(SECOND_ADDRESS);
if(real_second_value>59)
real_second_value=0;
write_clock(SECOND_ADDRESS,real_second_value); //start real time clock
real_year_value=read_clock(YEAR_ADDRESS);
if(real_year_value>99)
real_year_value=0;
real_month_value=read_clock(MONTH_ADDRESS);
if(real_month_value>12)
real_month_value=1;
real_day_value=read_clock(DAY_ADDRESS);
if(real_day_value>31)
real_day_value=1;
}
uint8 read_clock(uint8 address)
{
uint8 temp;
uint8 i,temp1,temp2;
IO0CLR |=D1302_CLK; //DS1302_CLK=0;
delayus(1);
IO0SET |= D1302_RST; //DS1302_RST=1;
delayus(2);
address|=0x01; //read clock
D1302_IO_DDR_SET;
for(i=0;i<8;i++) //command in
{
temp=address;
temp&=0x01;
address>>=1;
IO0CLR |=D1302_CLK; // DS1302_CLK=0;
delayus(1);
if(1==temp)
{
IO1SET|=D1302_IO;
}
else
{
IO1CLR|=D1302_IO;
}
delayus(1);
IO0SET|=D1302_CLK;
}
for(i=0;i<8;i++) //data out
{
IO0CLR|=D1302_CLK;
temp>>=1;
if((IO1PIN&0x02000000)!=0)
{
temp|=0x80;
}
IO0SET|=D1302_CLK;
}
IO0CLR|=D1302_RST;
delayus(1);
IO0CLR|=D1302_CLK;
temp2=temp; //BCD code -->HEX code
temp1=temp2>>4;
temp1&=0x07;
temp&=0x0f;
temp+=(temp1*10);
return (temp);
}
void write_clock(uint8 address,uint8 set_clock)
{
uint8 temp;
uint8 i,temp1;
IO0CLR|=D1302_CLK;//=0;
delayus(1);
IO0SET|= D1302_RST;//=1;
delayus(2);
address&=0xfe; //write clock
D1302_IO_DDR_SET;
for(i=0;i<8;i++) //command in
{
temp=address;
temp&=0x01;
address>>=1;
IO0CLR|= D1302_CLK;//=0;
delayus(1);
if(1==temp)
{
IO1SET|=D1302_IO;
}
else
{
IO1CLR|=D1302_IO;
}
delayus(1);
IO0SET|= D1302_CLK;//=1;
}
set_clock&=0x7f; //24 hour model
temp1=set_clock%10; // HEX code --> BCD code
temp=set_clock/10;
temp<<=4;
temp1+=temp;
for(i=0;i<8;i++) //data in
{
temp=temp1;
temp&=0x01;
temp1>>=1;
IO0CLR|= D1302_CLK;//=0;
delayus(1);
if(1==temp)
{
IO1SET|=D1302_IO;
}
else
{
IO1CLR|=D1302_IO;
}
delayus(1);
IO0SET|= D1302_CLK;//=1;
}
IO0CLR|= D1302_RST;//=0;
delayus(1);
IO0CLR|= D1302_CLK;//=0;
}
void set_time(void)
{
DS1302_init(); //DS1302初始化
/* write_clock(SECOND_ADDRESS,0x00);
write_clock(HOUR_ADDRESS,12); //write 11 hour
write_clock(CONTROL_ADDRESS,0x80); //写保护
write_clock(MINUTE_ADDRESS,05); //write 10 minute
write_clock(CONTROL_ADDRESS,0x80); //写保护
real_second_value=read_clock(SECOND_ADDRESS);
if(real_second_value>59)
real_second_value=0;
write_clock(SECOND_ADDRESS,real_second_value); //start real time clock
real_hour_value=read_clock(HOUR_ADDRESS);
if(real_hour_value>23)
real_hour_value=0;
real_minute_value=read_clock(MINUTE_ADDRESS);
if(real_minute_value>59)
real_minute_value=0;
real_second_value=read_clock(SECOND_ADDRESS);
if(real_second_value>59)
real_second_value=0; */
}
void D1302_test(void)
{ UART0_SendByte(0xaa);
real_hour_value=read_clock(HOUR_ADDRESS);
if(real_hour_value>23)
real_hour_value=0;
UART0_SendByte(real_hour_value);
real_minute_value=read_clock(MINUTE_ADDRESS);
if(real_minute_value>59)
real_minute_value=0;
UART0_SendByte(real_minute_value);
real_second_value=read_clock(SECOND_ADDRESS);
if(real_second_value>59)
real_second_value=0;
UART0_SendByte(real_second_value);
UART0_SendByte(0x55);
}
void read_rtc(void)
{
real_hour_value=read_clock(HOUR_ADDRESS);
if(real_hour_value>23)
real_hour_value=0;
real_minute_value=read_clock(MINUTE_ADDRESS);
if(real_minute_value>59)
real_minute_value=0;
real_second_value=read_clock(SECOND_ADDRESS);
if(real_second_value>59)
real_second_value=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -