📄 ds1302.c
字号:
#define DS1302_GLOBALS
#include <AG1F1.h>
#include "DS1302.h"
/*
#define DS1302_IO P0_7
#define DS1302_DIR P0_4
#define DS1302_CLK P0_5
#define DS1302_CE P0_6
//*/
unsigned char xdata DS1302_CE _at_ 0xC00A;
unsigned char xdata DS1302_IO _at_ 0xC00B;
unsigned char xdata DS1302_CLK _at_ 0xC00C;
unsigned char xdata DS1302_DIR _at_ 0xC00D;
void DS1302_delay(uint times)
{
while((times--)>0);
}
void DS1302_WR(uchar wrdata)
{
uchar ucTmp;
DS1302_DIR=1;//output
for(ucTmp=0;ucTmp<8;ucTmp++)
{
DS1302_delay(1);
DS1302_IO=wrdata&1;
wrdata>>=1;
DS1302_delay(2);
DS1302_CLK=1;
DS1302_delay(3);
DS1302_CLK=0;
}
}
uchar DS1302_RD(void)
{
uchar rddata=0;
uchar ucTmp;
uchar ucTmp1;
DS1302_DIR=0;//input
for(ucTmp=0;ucTmp<8;ucTmp++)
{
DS1302_delay(1);
rddata>>=1;
ucTmp1=DS1302_IO;
if((ucTmp1&0x1)==0x1)
rddata|=0x80;
DS1302_delay(2);
DS1302_CLK=1;
DS1302_delay(3);
DS1302_CLK=0;
}
return rddata;
}
void set_clk(void)
{
DS1302_CLK=0;
DS1302_CE=1;
DS1302_WR(0xBE);
DS1302_WR(clk_second);
DS1302_WR(clk_minute);
DS1302_WR(clk_hour);
DS1302_WR(clk_day);
DS1302_WR(clk_month);
DS1302_WR(clk_weekday);
DS1302_WR(clk_year);
DS1302_WR(clk_wrprotect);
DS1302_CE=0;
}
void get_clk(void)
{
DS1302_CLK=0;
DS1302_CE=1;
DS1302_WR(0xBF);
clk_second=DS1302_RD();
clk_minute=DS1302_RD();
clk_hour=DS1302_RD();
clk_day=DS1302_RD();
clk_month=DS1302_RD();
clk_weekday=DS1302_RD();
clk_year=DS1302_RD();
clk_wrprotect=DS1302_RD();
DS1302_CE=0;
}
void write_clk(uchar wr_addr, uchar wr_data)
{
DS1302_CLK=0;
DS1302_CE=1;
wr_addr&=0x1f;
wr_addr<<=1;
wr_addr|=0x80;
DS1302_WR(wr_addr);
DS1302_WR(wr_data);
DS1302_CE=0;
}
uchar read_clk(uchar rd_addr)
{
uchar rd_data=0;
DS1302_CLK=0;
DS1302_CE=1;
rd_addr&=0x1f;
rd_addr<<=1;
rd_addr|=0x81;
DS1302_WR(rd_addr);
rd_data=DS1302_RD();
DS1302_CE=0;
return rd_data;
}
void set_clk_wrprotect(void)
{
DS1302_CLK=0;
DS1302_CE=1;
DS1302_WR(0x8E);
DS1302_WR(clk_wrprotect);
DS1302_CE=0;
}
void set_clk_charge(uchar charge_enable, uchar diode_number, uchar res_select)
{
uchar clk_charge=0;
if(charge_enable&1==1)
{
clk_charge=0xA0;
diode_number&=0x3;
diode_number<<=2;
clk_charge&=diode_number;
res_select&=0x3;
clk_charge&=res_select;
}
DS1302_CLK=0;
DS1302_CE=1;
DS1302_WR(0x90);
DS1302_WR(clk_charge);
DS1302_CE=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -