📄 ds1302.h
字号:
#include <avr/io.h>
#define uchar unsigned char
#define uint unsigned int
//static uchar year=2,month=2,day=2,week=2;
//hour=0x19表示将时间设为19小时,minute=0x45设为45分钟
static uchar year=0x06,month=0x02,day=0x17,week=0x05;
static uchar hour=0x10,minute=0x54,second=0x00;
uchar data_Int1,data_Int2;
#define ds1302_rst PC3
#define ds1302_io PC5
#define ds1302_sclk PC4
#define set_ds1302_rst_ddr() DDRC|=1<<ds1302_rst
#define set_ds1302_rst() PORTC|=1<<ds1302_rst
#define clr_ds1302_rst() PORTC&=~(1<<ds1302_rst)
#define set_ds1302_io_ddr() DDRC|=1<<ds1302_io
#define set_ds1302_io() PORTC|=1<<ds1302_io
#define clr_ds1302_io() PORTC&=~(1<<ds1302_io)
#define clr_ds1302_io_ddr() DDRC&=~(1<<ds1302_io)
//#define in_ds1302_io() PINC&=(1<<ds1302_io)
#define set_ds1302_sclk_ddr() DDRC|=1<<ds1302_sclk
#define set_ds1302_sclk() PORTC|=1<<ds1302_sclk
#define clr_ds1302_sclk() PORTC&=~(1<<ds1302_sclk)
//此定义为写地址
#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_day_reg 0x8a
#define ds1302_year_reg 0x8c
#define ds1302_control_reg 0x8e
#define ds1302_charger_reg 0x90
//#define ds1302_clkburst_reg 0xbe
//----------------------------delay----------
void delay_1us(void) //1us延时函数
{
/* asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");*/
asm("nop");
}
//===============================
void delay_nus(unsigned int n) //N us延时函数
{
for (;n>0;n--)
//delay_1us();
asm("nop");
}
//===============================
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for(i=0;i<1000;i++)
delay_1us();
}
//===============================
void delay_nms(unsigned int n) //N ms延时函数
{
for(;n>0;n--)
delay_1ms();
}
void IO_INIT(void)
{
DDRC=0Xff; //key_bord
}
void ds1302_write(uchar reg,uchar data)
{
char i=0;
set_ds1302_rst_ddr();
set_ds1302_sclk_ddr();
set_ds1302_io_ddr(); /*设为输出*/
clr_ds1302_rst(); /*置0*/
clr_ds1302_sclk(); /*置0,在RST置1时,SCLK必须为0*/
set_ds1302_rst(); /*置1,启动数据传送*/
for(i=8;i>0;i--) /*写地址*/
{
if((reg&0x01)==0x01)
set_ds1302_io();
else
clr_ds1302_io();
set_ds1302_sclk(); /*时钟*/
clr_ds1302_sclk();
reg>>=1;
}
for(i=8;i>0;i--) /*写数据*/
{
clr_ds1302_sclk();
delay_nus(500);
if((data&0x01)==0x01)
set_ds1302_io();
else
clr_ds1302_io();
set_ds1302_sclk(); /*时钟*/
data>>=1;
}
clr_ds1302_rst(); /*置0,结束本次数据传送,I/O引脚变为高阻态*/
clr_ds1302_io_ddr(); /*设为输入*/
}
/******************************************************************/
uchar ds1302_read(uchar reg)
{
uchar data=0;
char i=0;
reg+=1; //读标志
set_ds1302_rst_ddr();
set_ds1302_sclk_ddr();
set_ds1302_io_ddr(); /*设为输出*/
clr_ds1302_rst();
clr_ds1302_sclk();
set_ds1302_rst();
for(i=8;i>0;i--)
{
clr_ds1302_sclk();
if((reg&0x01)==0x01)
set_ds1302_io();
else
clr_ds1302_io();
set_ds1302_sclk();
reg>>=1;
}
clr_ds1302_io_ddr(); //PA1 in
for(i=8;i>0;i--)
{
if((PINC&0X20)==0X20)
data|=0x80;
else
data&=0x7f;
set_ds1302_sclk();
clr_ds1302_sclk();
data>>=1;
}
clr_ds1302_rst();
return(data);
}
/******************************************************************/
uchar check_ds1302(void)
{
ds1302_write(ds1302_control_reg,0x80);
if(ds1302_read(ds1302_control_reg)==0x80) return 1;
else return 0;
}
void ds1302_read_time(void)
{
year=ds1302_read(ds1302_year_reg); //年
month=ds1302_read(ds1302_month_reg); //月
day=ds1302_read(ds1302_date_reg); //日
week=ds1302_read(ds1302_day_reg); //周
hour=ds1302_read(ds1302_hr_reg); //时
minute=ds1302_read(ds1302_min_reg); //分
second=ds1302_read(ds1302_sec_reg); //秒
}
/******************************************************************/
void ds1302_write_time(void)
{
ds1302_write(ds1302_control_reg,0x00); //关闭写保护
ds1302_write(ds1302_sec_reg,0x80); //暂停
delay_nms(10);
//ds1302_write(ds1302_charger_reg,0xa9); //涓流充电
ds1302_write(ds1302_year_reg,year); //年
ds1302_write(ds1302_month_reg,month); //月
ds1302_write(ds1302_date_reg,day); //日
ds1302_write(ds1302_day_reg,week); //周
ds1302_write(ds1302_hr_reg,hour); //时
ds1302_write(ds1302_min_reg,minute); //分
ds1302_write(ds1302_sec_reg,second); //秒
ds1302_write(ds1302_control_reg,0x80); //打开写保护
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -