#defineCLR_CE()(PTDD_PTDD3 = 0)
#defineSET_CE()(PTDD_PTDD3 = 1)
#defineCLR_CLK()(PTDD_PTDD1 = 0)
#defineSET_CLK()(PTDD_PTDD1 = 1)
#defineCLR_IO()(PTDD_PTDD2 = 0)
#defineSET_IO()(PTDD_PTDD2 = 1)
#define INPUT_IO()(PTDDD_PTDDD2 = 0)
#define OUTPUT_IO()(PTDDD_PTDDD2 = 1)
#define READ_IO()(PTDD_PTDD2)
#define NOP(){ __asm NOP; __asm NOP; }
下面是程序全文:
//*****************************************************************************
#defineCLR_CE()(PTDD_PTDD3 = 0)
#defineSET_CE()(PTDD_PTDD3 = 1)
#defineCLR_CLK()(PTDD_PTDD1 = 0)
#defineSET_CLK()(PTDD_PTDD1 = 1)
#defineCLR_IO()(PTDD_PTDD2 = 0)
#defineSET_IO()(PTDD_PTDD2 = 1)
#define INPUT_IO()(PTDDD_PTDDD2 = 0)
#define OUTPUT_IO()(PTDDD_PTDDD2 = 1)
#define READ_IO()(PTDD_PTDD2)
#define NOP(){ __asm NOP; __asm NOP; }
#defineSETBIT(x,y) (x |= (1 << y)) //set bit y in byte x
#defineCLRBIT(x,y) (x &= (~(1 << y))) //clear bit y in byte x
#defineGETBIT(x,y) (x & (1 << y)) //check bit y in byte x
#defineBCD2HEX(x)((10 * (x >> 4)) + (x & 0x0f))
#defineHEX2BCD(x)(((x / 10) << 4) + (x % 10))
//*****************************************************************************
void Ds1302_Write(u8 Data)
{
u8 i;
for(i = 0; i < 8; i++)
{
CLR_CLK();
NOP();
if(GETBIT(Data , i))
SET_IO();
else
CLR_IO();
NOP();
SET_CLK();//上升沿,发送数据
}
}
//*****************************************************************************
u8 Ds1302_Read(void)
{
u8 RecvData = 0;
u8 i;
INPUT_IO();//设置IO口方向
for(i = 0; i < 8; i++)
{
SET_CLK();
NOP();
CLR_CLK();//下降沿接收数据
NOP();
if(READ_IO())
SETBIT(RecvData , i);
}
OUTPUT_IO();
return RecvData;
}
//*****************************************************************************
void Ds1302_Write_Byte(u8 Addr, u8 Data)
{
SET_CE();
Ds1302_Write(Addr);
Ds1302_Write(Data);
CLR_CE();
}
//*****************************************************************************
u8 Ds1302_Read_Byte(u8 Addr)
{
u8 RecvData = 0;
SET_CE();
Ds1302_Write(Addr);
RecvData = Ds1302_Read();
CLR_CE();
return RecvData;
}
//*****************************************************************************
void DS1302_Init(void)
{
u8 i;
i = Ds1302_Read_Byte(0x81);
if(i & 0x10)
{
Ds1302_Write_Byte(0x8e, 0x00);//取消写保护
Ds1302_Write_Byte(0x80, 0x00);//启动时钟
}
}
//*****************************************************************************
void RTC_Get(u8 *RecvBuff)
{
u8 i;
u8 Addr = 0x81;
for (i = 0; i < 7; i++)
{
//*RecvBuff++ = BCD2HEX(Ds1302_Read_Byte(Addr));
*RecvBuff++ = Ds1302_Read_Byte(Addr);
Addr += 2;
}
}
//*****************************************************************************
void RTC_Set(u8 *SentBuff)
{
u8 i;
u8 Addr = 0x80;
Ds1302_Write_Byte(0x8e, 0x00);//取消写保护
for(i = 0; i < 7; i++)
{
Ds1302_Write_Byte(Addr, HEX2BCD(*SentBuff));
SentBuff++;
Addr += 2;
}
Ds1302_Write_Byte(0x8e, 0x80);//设置写保护
}
这个程序可以直接用的,用之前最好把DS1302的数据手册仔细研究研究。