#include "ds1302.h"
//void Delay2ms()
//{
// unsigned char i, j;
// _nop_();
// _nop_();
// i = 22;
// j = 128;
// do
// {
// while (--j);
// } while (--i);
//}
/*
*/
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
// Delay2ms();
}
}
void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
Write_Ds1302_Byte(dat);
RST=0;
}
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
// Delay2ms();
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0;
_nop_();
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
return (temp);
}
void Set_RTC(unsigned char *pucRtc)
{
unsigned char temp;
Write_Ds1302(0x8e, 0X00);
temp = ((pucRtc[0]/10)<<4)+pucRtc[0]%10;
Write_Ds1302(0x84, temp);//hour
temp = ((pucRtc[1]/10)<<4)+pucRtc[1]%10;
Write_Ds1302(0x82, temp);//min
temp = ((pucRtc[2]/10)<<4)+pucRtc[2]%10;
Write_Ds1302(0x80, temp);//sec
Write_Ds1302(0x8e, 0x80);
}
void Read_RTC(unsigned char *pucRtc)
{
unsigned char temp;
temp = Read_Ds1302(0x85);//hour
pucRtc[0] = (temp>>4)*10 + (temp & 0xf );
temp = Read_Ds1302(0x83);//min
pucRtc[1] = (temp>>4)*10 + (temp & 0xf );
temp = Read_Ds1302(0x81);//sec
pucRtc[2] = (temp>>4)*10 + (temp & 0xf );
}
H文件
#ifndef __DS1302_H
#define __DS1302_H
#include "STC15F2K60S2.h"
#include "intrins.h"
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
void Set_RTC(unsigned char *pucRtc);
void Read_RTC(unsigned char *pucRtc);
#endif