📄 ds1302.c
字号:
//ds1302写字节
void ds1302_wr_bye(unsigned char addr,unsigned char data)
{
unsigned char i,j;
DDRD|= 0b01110000; //设置PD4/PD5/PD6为输出
PORTD&=0b10001111;
PORTD|=0b01000000;
for(i=0;i<8;i++)
{
j=(addr>>i)&0b00000001;
if(j==0)
PORTD&=0b11011111;
else
PORTD|=0b00100000;
_NOP();
PORTD|=0b00010000;
_NOP();
PORTD&=0b11101111;
}
for(i=0;i<8;i++)
{
j=(data>>i)&0b00000001;
if(j==0)
PORTD&=0b11011111;
else
PORTD|=0b00100000;
_NOP();
PORTD|=0b00010000;
_NOP();
PORTD&=0b11101111;
}
PORTD&=0b10001111;
}
//ds1302读字节
unsigned char ds1302_rd_bye(unsigned char addr)
{
unsigned char i,j;
unsigned char data=0;
DDRD|= 0b01110000;
PORTD&=0b10001111;
PORTD|=0b01000000;
for(i=0;i<8;i++)
{
j=(addr>>i)&0b0010000;
if(j==0)
PORTD&=0b11010011;
else
PORTD|=0b00100000;
_NOP();
PORTD|=0b00110000;
_NOP();
PORTD&=0b11101111;
}
DDRD|= 0b01010000;
DDRD&= 0b11011111;
PORTD|=0b00100000;
for(i=0;i<8;i++)
{
j=(PIND&0b00110000)<<2;
data=(data>>1)|j;
PORTD|=0b00110000;
_NOP();
PORTD&=0b11101111;
}
PORTD&=0b10111111;
data=data/16*10+data%16;
return(data);
}
//时钟芯片初始化
void clock_initialization()
{
unsigned char i;
DDRD|=0x70; //设置PD4/PD5/PD6为输出
PORTD&=0x8f; //sclk=0,i/o=0,rst=0
ds1302_wr_bye(0x8E,0x00); //控制命令,WP=0,写操作
ds1302_wr_bye(0x90,0x05); //禁止充电,选择2k电阻,1个二极管
ds1302_wr_bye(0x8E,0x80); //控制命令,WP=1,写保护
}
//读时钟芯片程序
void read_clock()
{
unsigned char *p;
p=(unsigned char *)&clock;
*p++=ds1302_rd_bye(addr_year_rd); //读年
*p++=ds1302_rd_bye(addr_month_rd); //读月
*p++=ds1302_rd_bye(addr_day_rd); //读日
*p++=ds1302_rd_bye(addr_hr_rd); //读时
*p++=ds1302_rd_bye(addr_min_rd); //读分
*p++=ds1302_rd_bye(addr_sec_rd); //读秒
}
//校正时钟芯片程序
void write_clock()
{
unsigned char *p;
p=(unsigned char *)&clock;
ds1302_wr_bye(addr_project_wr,0x00); //控制命令,WP=0,写操作
switch(row)
{
case 0:
ds1302_wr_bye(addr_year_wr,*(p+row)); //写入年
break;
case 1:
ds1302_wr_bye(addr_month_wr,*(p+row)); //写入月
break;
case 2:
ds1302_wr_bye(addr_day_wr,*(p+row)); //写入日
break;
case 3:
ds1302_wr_bye(addr_hr_wr,*(p+row)); //写入时(24小时模式)
break;
case 4:
ds1302_wr_bye(addr_min_wr,*(p+row)); //写入分
break;
case 5:
ds1302_wr_bye(addr_sec_wr,*(p+row)); //写入秒(ch=0)
break;
}
ds1302_wr_bye(addr_project_wr,0x80); //控制命令,WP=1
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -