DS1302时钟模块驱动
/* 本驱动主要提供DS1302时钟模块的读写操作,可以完成DS1302时钟模块的绝大多数操作,如有特殊的操作请适当更改函数的调用
提供以下几个函数可供调用
*******************************************************************************************************************************************
* 1. ds_write(unsigned char a) 单字节写入 带初始化 供ds_read()调用 不单独用 *
* 2. unsigned char ds_read(unsigned char a) 读取数据 参数为要读取数据的地址 见下 *
* 3. unsigned char BCD_CHG(unsigned char a) 用于对读出的数据进行BCD调整 *
* 4. unsigned char ds_write_double(unsigned char a,unsigned char b)用于写入数据 第一个参数为要写入的地址 第二个参数为要写入的数据 *
* 5. 地址表: 秒 分 时 日 月 周 年 保护 *
* 读: 81H 83H 85H 87H 89H 8BH 8DH 8FH *
* 写: 80H 82H 84H 86H 88H 8AH 8CH 8EH *
*******************************************************************************************************************************************
使用时请将下面三个位连线重新设置为硬件实际连接
写数据前请先调用ds_write_double()函数将保护位写入0x00,数据写入结束请将保护位写入0x80
*/
sbit SDA=P3^4;
sbit SCK=P3^6;
sbit RST=P3^5;
ds_write(unsigned char a)
{
unsigned char i;
RST=0;
nop();
nop();
nop();
SDA=0;
nop();
nop();
nop();
SCK=0;
nop();
nop();
nop();
RST=1;
nop();
nop();
nop();
for(i=0;i<8;i++)
{
SCK=0;
nop();
nop();
nop();
SDA=a&0x01;
nop();
nop();
nop();
a=a>>1;
SCK=1;
nop();
nop();
nop();
}
}
unsigned char ds_read(unsigned char a)
{
unsigned char i;
ds_write(a);
a=0;
for (i=0;i<8;i++) //循环8次 读取数据
{
if(SDA)
a|=0x80; //每次传输低字节
SCK=0;
a>>=1; //右移一位
nop();
nop();
nop();
SCK=1;
}
RST=0;
nop(); //以下为DS1302复位的稳定时间
nop();
RST=0;
SCK=0;
nop();
nop();
nop();
nop();
SCK=1;
nop();
nop();
SDA=0;
nop();
nop();
SDA=1;
nop();
nop();
return (a);
}
unsigned char BCD_CHG(unsigned char a)
{
unsigned b,c;
b=a/16;
c=a%16;
a=b*10+c;
return a;
}
unsigned char ds_write_double(unsigned char a,unsigned char b)
{
unsigned char i,temp;
RST=0;
nop();
SCK=0;
nop();
RST=1;
nop();
for(i=0;i<8;i++)
{
SCK=0;
SDA=(bit)(a&0x01);
a>>=1;
SCK=1;
}
for(i=0;i<8;i++)
{
SDA=(bit)(b&0x01);
SCK=0;
b>>=1;
SCK=1;
}
RST=0;
}
浙公网安备 33010602011771号