📄 ds1302.c
字号:
sbit dsdat=P1^6;
sbit dsclk=P1^7;
sbit dsrst=P3^3;
void nop(void)
{unsigned char i;
for(i=0;i<=1;i++);
}
void send_byte(unsigned char reg,unsigned char dat)
{unsigned char i;
dsrst=0;
nop();
dsclk=0;
nop();
dsrst=1;
for(i=0;i<8;i++)
{if((reg>>i)&0x1)
dsdat=1;
else
dsdat=0;
nop();
dsclk=1;
nop();
dsclk=0;
}
nop();
for(i=0;i<8;i++)
{if((dat>>i)&0x1)
dsdat=1;
else
dsdat=0;
nop();
dsclk=1;
nop();
dsclk=0;
}
nop();
dsrst=0;
}
unsigned char read_byte(unsigned char reg)
{unsigned char i,dat;
dsrst=0;
nop();
dsclk=0;
nop();
dsrst=1;
for(i=0;i<8;i++)
{if((reg>>i)&0x1)
dsdat=1;
else
dsdat=0;
nop();
dsclk=1;
nop();
dsclk=0;
}
nop();
dat=0;
for(i=0;i<8;i++)
{dat>>=1;
if (dsdat==1)
dat|=0x80;
nop();
dsclk=1;
nop();
dsclk=0;
}
dsrst=0;
return dat;
}
void init_ds1302(void)
{send_byte(0x8e,0x00); //关闭写保护
send_byte(0x90,0xa9); //涓流充电
send_byte(0x8e,0x80); //打开写保护
}
bit check_ds1302(void)
{send_byte(0x8e,0x80);
if (read_byte(0x8e)==0x80)
return 0;
else
return 1;
}
void set_ds1302(unsigned char *buf)
{send_byte(0x8e,0x00); //关闭写保护
send_byte(0x80,0x80); //时钟暂停
send_byte(0x80,*(buf++)); //秒
send_byte(0x82,*(buf++)); //分
send_byte(0x84,*(buf++)); //时
send_byte(0x86,*(buf++)); //日
send_byte(0x88,*(buf++)); //月
send_byte(0x8c,*(buf)); //年
send_byte(0x8e,0x80); //打开写保护
}
void read_ds1302(unsigned char *buf)
{//*(buf++)=read_byte(0x81); //秒
//*(buf++)=read_byte(0x83); //分
//*(buf++)=read_byte(0x85); //时
*(buf++)=read_byte(0x87); //日
*(buf)=read_byte(0x89); //月
//*(buf)=read_byte(0x8d); //年
}
void div(byte *s1,byte *s2)
{s2[4]=s1[0]%16;
s2[5]=s1[0]/16;
s2[6]=s1[1]%16;
s2[7]=s1[1]/16;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -