📄 ds1302_drive.h
字号:
#include<iom8v.h>
#include<macros.h>
/***复位脚*****/
#define RST_CLR PORTB&=~(1<<PB2) //电平置地
#define RST_SET PORTB|=(1<<PB2) //电平置高
#define RST_IN DDRB&=~(1<<PB2) //方向输入
#define RST_OUT DDRB|=(1<<PB2) //方向输出
/*****双向数据******/
#define IO_CLR PORTB&=~(1<<PB1) //电平置低
#define IO_SET PORTB|=(1<<PB1) //电平置高
#define IO_R PINB&(1<<PB1) //电平读取
#define IO_IN DDRB&=~(1<<PB1) //方向输入
#define IO_OUT DDRB|=(1<<PB1) //方向输出
/*********时钟信号********/
#define SCK_CLR PORTB&=~(1<<PB0) // 时钟信号
#define SCK_SET PORTB|=(1<<PB0) // 电平置高
#define SCK_IN DDRB&=~(1<<PB0) //方向输入
#define SCK_OUT DDRB|=(1<<PB0) //方向输出
/******************函数声明********************/
uchar read_byte(void); //读一个字节数据
void write_byte(uchar dat); //写一字节数据
void write_ds1302(uchar addr,uchar data); //在指定地址写一字节数据
void set_ds1302(uchar addr,uchar *p,uchar n); //设置初始化
void init_ds1302(void); //初始化函数
/***************从DS1302中读一个字节数据********************/
uchar read_byte(void)
{
uchar i,dat=0;
IO_IN;
IO_CLR;
for(i=0;i<7;i++)
{
SCK_SET;
delay_us(10);
SCK_CLR;
delay_us(10);
if(IO_R)
dat|=0X80;
else
dat&=0X7F;
SCK_SET;
dat=dat>>1;
}
IO_OUT;
return dat;
}
/***************从DS1302中写一个字节数据********************/
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SCK_CLR;
if(dat&0X01)
IO_SET;
else
IO_CLR;
delay_us(10);
SCK_SET;
dat>>=1;
}
}
/*********************在指定的地址读一字节数据************************/
uchar read_ds1302(uchar addr)
{
char data;
RST_CLR;
SCK_CLR;
delay_us(10);
RST_SET;
delay_us(10);
write_byte(addr);
delay_us(10);
data=read_byte();
delay_us(10);
SCK_CLR;
RST_CLR;
//DDRD|=(1<<PD3);
//delay_us(100);
//DDRD&=~(1<<PD3);
return data;
}
void write_ds1302(uchar addr,uchar data)
{
RST_CLR;
SCK_CLR;
delay_us(10);
RST_SET;
delay_us(10);
write_byte(addr);
delay_us(10);
SCK_CLR;
delay_us(10);
write_byte(data);
SCK_CLR;
delay_us(10);
RST_CLR;
}
/************************设置初始化函数*******************************/
void set_ds1302(uchar addr,uchar *p,uchar n)
{
write_ds1302(0X8E,0X00);
for(;n>0;n--)
{
write_ds1302(addr,*p);
p++;
addr=addr+2;
}
write_ds1302(0X8E,0X80);
}
/**********************初始化DS1302函数*******************************/
void init_ds1302(void)
{
RST_CLR;
SCK_CLR;
RST_OUT;
SCK_OUT;
write_ds1302(0X80,0X00);
write_ds1302(0X90,0XAB);
write_ds1302(0X8E,0X80);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -