感谢【阿莫】的网站,给我们提供了一片交流的空间!
//*********** DS1302 驱动程序 2005/08/17整理
//接口定义
// PD5: RST
// PD6: I/O
// PD7: CLK
unsigned char AA;
/********************************************************************
函 数 名:RTInputByte()
功 能:实时时钟写入一字节
说 明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据
返 回 值:无
***********************************************************************/
void RTInputByte(unsigned char x)
{
unsigned char i;
for(i=0; i<8;i++)
{
if(x&(1<<i)) { PORTD|=(1<<6); }
else { PORTD&=~(1<<6); }
PORTD|=(1<<7);
PORTD&=~(1<<7);
}
}
/********************************************************************
函 数 名:RTOutputByte()
功 能:实时时钟读取一字节
说 明:从DS1302读取1Byte数据 (内部函数)
入口参数:无
返 回 值:ACC
***********************************************************************/
unsigned char RTOutputByte(void)
{
unsigned char i,k;
DDRD&=~(1<<6);
for(i=0; i<8; i++)
{
k=(PIND&(1<<6)); //读数据,从低位开始
if(k)
AA|=(1<<i);
else
AA&=~(1<<i);
PORTD|=(1<<7);
PORTD&=~(1<<7);
}
DDRD|=(1<<6);
return(AA);
}
/********************************************************************
函 数 名:W1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据
返 回 值:无
***********************************************************************/
void W1302(unsigned char ucAddr, unsigned char ucDa)
{
PORTD&=~(1<<5); // RST to L
PORTD&=~(1<<7); // CLK to L
PORTD|=(1<<5); // RST to H
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 写1Byte数据*/
PORTD|=(1<<7); //CLK to H
PORTD&=~(1<<5); //RST to L
}
/********************************************************************
函 数 名:R1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
***********************************************************************/
unsigned char R1302(unsigned char ucAddr)
{
unsigned char ucData;
PORTD&=~(1<<5); // RST to L
PORTD&=~(1<<7); // CLK to L
PORTD|=(1<<5); // RST to H
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
PORTD|=(1<<7); //CLK to H
PORTD|=(1<<7);
PORTD&=~(1<<5); //RST to L
return(ucData);
}