📄 ds1302.txt
字号:
#define DS1302_PORT PORTC
#define DS1302_DDR DDRC
#define DS1302_PIN PINC
#define DS1302_CLK 7
#define DS1302_IO 6
#define DS1302_RST 5
#define set_ds1302_rst_ddr() DS1302_DDR|=1<<DS1302_RST
#define set_ds1302_rst() DS1302_PORT|=1<<DS1302_RST
#define clr_ds1302_rst() DS1302_PORT&=~(1<<DS1302_RST)
#define set_ds1302_io_ddr() DS1302_DDR|=1<<DS1302_IO
#define clr_ds1302_io_ddr() DS1302_DDR&=~(1<<DS1302_IO)
#define set_ds1302_io() DS1302_PORT|=1<<DS1302_IO
#define clr_ds1302_io() DS1302_PORT&=~(1<<DS1302_IO)
#define in_ds1302_io() DS1302_PIN&(1<<DS1302_IO)
#define set_ds1302_sclk_ddr() DS1302_DDR|=1<<DS1302_CLK
#define set_ds1302_sclk() DS1302_PORT|=1<<DS1302_CLK
#define clr_ds1302_sclk() DS1302_PORT&=~(1<<DS1302_CLK)
#define ds1302_sec_reg 0x80
#define ds1302_min_reg 0x82
#define ds1302_hr_reg 0x84
#define ds1302_date_reg 0x86
#define ds1302_month_reg 0x88
#define ds1302_week_reg 0x8a
#define ds1302_year_reg 0x8c
#define ds1302_control_reg 0x8e
#define ds1302_charger_reg 0x90
#define ds1302_clkburst_reg 0xbe
向DS1302写一个字节
void DS1302InputByte(unsigned char reg) //实时时钟写入一字节(内部函数)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
if (reg & (1<<i)) set_ds1302_io();
else clr_ds1302_io();
set_ds1302_sclk();//上升沿写入数据
asm("nop");
asm("nop");
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
读一个字节
unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
{
unsigned char i,data = 0;
for (i = 0; i < 8; i++)
{
data >>= 1;
if (in_ds1302_io()) data |= 0x80;
else data &= 0x7f;
set_ds1302_sclk();
asm("nop");
asm("nop");
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
return data;
}
写命令
void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
clr_ds1302_rst();
clr_ds1302_sclk();
set_ds1302_rst();
asm("nop");
asm("nop");
asm("nop");
asm("nop");
DS1302InputByte(ucAddr);
DS1302InputByte(ucDa);
set_ds1302_sclk();
clr_ds1302_rst();
}
读地址内容
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
unsigned char ucData;
clr_ds1302_rst();
clr_ds1302_sclk();
set_ds1302_rst();
asm("nop");
asm("nop");
asm("nop");
asm("nop");
DS1302InputByte(ucAddr|0x01); // 地址,命令
clr_ds1302_io_ddr();
clr_ds1302_io();
ucData = DS1302OutputByte(); // 读1Byte数据
set_ds1302_sclk();
clr_ds1302_rst();
set_ds1302_io_ddr();
return(ucData);
}
初始化IO口
void IO_Init(void)
{
set_ds1302_rst_ddr();
set_ds1302_io_ddr();
set_ds1302_sclk_ddr();
}
初始化DS1302
void Initial_DS1302() //时钟芯片初始化
{
unsigned char Second=Read1302(ds1302_sec_reg);
if(Second&0x80) //判断时钟芯片是否关闭
{
Write1302(ds1302_control_reg,0x00); //写入允许
Write1302(ds1302_year_reg,0x08); //2008/03/19 星期3 07:12:05
Write1302(ds1302_month_reg,0x03);
Write1302(ds1302_date_reg,0x19);
Write1302(ds1302_week_reg,0x03);
Write1302(ds1302_hr_reg,0x07);
Write1302(ds1302_min_reg,0x12);
Write1302(ds1302_sec_reg,0x05);
Write1302(ds1302_charger_reg,0x16); //充电
Write1302(ds1302_control_reg,0x80); //禁止写入
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -