#include <reg52.h>
#include <intrins.h>
typedef signed char int8;
typedef signed int int16;
typedef signed long int32;
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
/*---------------------------------------------
/* DS1302 Read Byte
/*-------------------------------------------*/
uint8 ReadByte()
{
uint8 i,tmp = 0x00;
io = 1; //IO 置1
for(i = 0; i < 8 ; i ++)
{
if(io) tmp|=0x80;
sclk = 1 ;
sclk = 0;
tmp >>= 1;
}
return tmp;
}
/*---------------------------------------------
DS1302 WriteByte()
--------------------------------------------*/
void WriteByte(uint8 dat)
{
uint8 i;
for(i = 0; i < 8 ; i ++)
{
io = (bit)(dat & 0x01);
sclk = 0;
sclk = 1;
dat >>= 1;
}
}
/*---------------------------------------------
/* DS1302 SingleRead
/*-------------------------------------------*/
uint8 SingleRead(uint8 addr)
{
uint8 tmp;
cs = 0;
sclk = 0;
cs = 1;
WriteByte(addr);
tmp = ReadByte();
sclk = 0;
cs = 0;
return tmp;
}
/*----------------------------------------------
/* DS1302 SingleWrite
/---------------------------------------------*/
void SingleWrite(uint8 addr,uint8 dat)
{
cs = 0;
sclk = 0;
cs = 1;
WriteByte(addr);
WriteByte(dat);
sclk = 0;
cs = 0;
}
/*-----------------------------------------------
/* DS1302 GetTime
/*---------------------------------------------*/
void GetTime()
{
uint8 tmp;
tmp = SingleRead(0x81);
}
/*-----------------------------------------------
/* DS1302 INIT
/*---------------------------------------------*/
void ds1302_Init(void)
{
uint8 code DTime [] = {0x05,0x05,0x05,0x31,0x08,0x01,0x15};
uint8 i,addr = 0x80;
cs = 0; //片選
sclk = 0; //時鐘線
if((SingleRead(0x81) & 0x80) == 0x80)
{
SingleWrite(0x8e,0x00);
for(i = 0; i < 8; i ++)
{
SingleWrite(addr,DTime[i]);
addr += 2;
}
SingleWrite(0x8e,0x80);
}
}
如果初始化程序沒加判斷語句的話能正常初始化時間并讀取,但是如果加了判斷語句,讀出來的數據全是0。
|