|
#pragma pack (1)
typedef struct {
unsigned char sec;
unsigned char min;
unsigned char hour;
unsigned char day;
unsigned char month;
unsigned char year;
unsigned char control;
} ds1307mem;typedef struct {
unsigned char hour;
unsigned char min;
unsigned char sec;
} TIME_STR;
#pragma pack ()extern ds1307mem ds_mem;
extern TIME_STR systime;
void InitDS1307 ();
void ScanDallasProc (void *p);#define DS1307_ADDR 0xd0
void i2cSendStop()
{
i2cdelay();
SDA_OUT();
SDA_0();
i2cdelay();
SCL_1();
i2cdelay();
SDA_1();
i2cdelay();
}
//
void i2cSendStart()
{
SDA_OUT();
SDA_1();
SCL_1();
i2cdelay();
SDA_0();
i2cdelay();
SCL_0();
i2cdelay();
}
//
unsigned char i2cSendByte(unsigned char data)
{
unsigned char i;
unsigned char res = 1;
SDA_OUT();
i2cdelay();
for (i = 0; i < 8; i++)
{ if (data & (1 << 7))
SDA_1();
else
SDA_0();
i2cdelay();
SCL_1();
i2cdelay();
SCL_0();
i2cdelay();
data <<= 1;
}
SDA_IN();i2cdelay();
//ask
if (GET_SDA())
res = 0;
SCL_1();
i2cdelay();
SCL_0();
i2cdelay();
return res;
}
//unsigned char i2cGetByte(char bAsk)
{
unsigned char i;
unsigned char data = 0;
SDA_IN();
i2cdelay();
for (i = 0; i < 8; i++)
{
data <<= 1;
if (GET_SDA())
data |= 1;
SCL_1();
i2cdelay();
SCL_0();
i2cdelay();
}
if (bAsk)
{
SDA_OUT();
SDA_0();
}
else {
SDA_IN();
}//ask
i2cdelay();
SCL_1();
i2cdelay();
SCL_0();
i2cdelay();
return data;
}
//
void InitDS1307 ()
{
i2cSendStart();
i2cSendByte(DS1307_ADDR);
i2cSendByte (0x0); // CH bit
i2cSendByte (0x0); // CH bit
i2cSendStop();
}void ReadDS1307 (ds1307mem *pmem)
{
char i;
unsigned char *p = (unsigned char *)pmem;
i2cSendStart();
i2cSendByte(DS1307_ADDR);
i2cSendByte (0x0); // ser reg pointer
i2cSendStop();i2cSendStart();
i2cSendByte(DS1307_ADDR + 1); // read
for (i = 0; i < (sizeof (ds1307mem) - 1); i++)
{
*p++ = i2cGetByte(1);
}
*p = i2cGetByte(0); // no ask
i2cSendStop();
}void WriteDS1307 (ds1307mem *pmem)
{
char i;
unsigned char *p = (unsigned char *)pmem;
i2cSendStart();
i2cSendByte(DS1307_ADDR);
i2cSendByte (0x0); // ser reg pointer
for (i = 0; i < (sizeof (ds1307mem)); i++)
{
i2cSendByte(*p++);
}
i2cSendStop();
}void ConvertTimeFromDS (TIME_STR *pt, ds1307mem *pmem)
{
pt->hour = pmem->hour & 0x1f;
pt->min = 10 * ((pmem->min & 0x70) >> 4) + (pmem->min & 0x0f);
pt->sec = 10 * ((pmem->sec & 0x70) >> 4) + (pmem->sec & 0x0f);
}void ConvertTimeToDS (ds1307mem *pmem, TIME_STR *pt)
{
pmem->hour = pt->hour & 0x1f;
pmem->min = ((pt->min / 10) << 4)+ pt->min % 10 ;
pmem->sec = ((pt->sec / 10) << 4)+ pt->min % 10 ;
}
E-mail: info@telesys.ru