📄 ds1302.h
字号:
#ifndef __ds1302_H_
#define __ds1302_H_
#include "avr/io.h"
//管脚定义
#define SCLK 2
#define IO 1
#define RET 0
//宏定义
#define SCLK_H PORTA |= (1<<SCLK);
#define SCLK_L PORTA &= ~(1<<SCLK);
#define IO_H PORTA |= (1<<IO);
#define IO_L PORTA &= ~(1<<IO);
#define RET_H PORTA |= (1<<RET);
#define RET_L PORTA &= ~(1<<RET);
//全局变量
unsigned char data_1302[8]={0};
unsigned char data_reg[31]={0};
unsigned char Get_data[7]={0};
void delay_us (unsigned int i)
{
for (;i>0;i--);
}
//---------------------串行写入8位数据----------------
//入口:要发送的8位数据,先发送低位
void Send_Byte8 (unsigned char data)
{
unsigned char i=0;
for (i=0;i<8;i++)
{
if (data&0x01)
{
IO_H;
}
else
{
IO_L;
}
SCLK_L;
// delay_us(2);
data=data>>1;
SCLK_H;
// delay_us(2);
}
}
//----------------------串行读出8位数据--------------------
//出口:读出来的8位数据,先读低位
unsigned char Read_Byte8 (void)
{
unsigned char i=0;
unsigned char data=0;
DDRA &= ~(1<<IO);//设为输入
PORTA |=(1<<IO);
for (i=0;i<8;i++)
{
SCLK_H;
// delay_us(2);
SCLK_L;
// delay_us(2);
data=data>>1;
if (PINA&0X02)
{
data |=0x80;
}
else
{
data &=0x7f;
}
}
DDRA |= (1<<IO);//设为输出
return (data);
}
//--------------------写数据到ds1302-----------------------
void Write_ds1302 ( unsigned char addr, unsigned char data )
{
RET_L;
SCLK_L;
// delay_us(2);
RET_H;
// delay_us(2);
Send_Byte8 (addr);
Send_Byte8( data );
RET_L;
}
//----------------------从1302读数据----------------------
unsigned char Read_ds1302 (unsigned char adr)
{
unsigned char read_data=0;
RET_L;
SCLK_L;
// delay_us(2);
RET_H;
// delay_us(2);
Send_Byte8 (adr);
read_data=Read_Byte8();
RET_L;
return (read_data);
}
//----------------------写时钟数据进1302(多字节)-------------------
//入口:*data 格式:8位(BCD) 秒 分 时 日 月 星期 年 控制
// 1B 1B 1B 1B 1B 1B 1B 1B
void W_1302(unsigned *data)
{
unsigned char i;
RET_L;
SCLK_L;
RET_H;
Write_ds1302(0x8e,0x00); //控制命令
RET_L;
SCLK_L;
RET_H;
Send_Byte8(0xbe); //多字节控制指令
for (i=0;i<8;i++)
{
Send_Byte8(*data);
data++;
}
RET_L;
}
//-----------------------读1302时钟数据(多字节)---------------
void R_1302(void)
{
unsigned char i;
RET_L;
SCLK_L;
RET_H;
Send_Byte8(0xbf); //多字节读命令
for (i=0;i<8;i++)
{
data_1302[i]=Read_Byte8();
}
RET_L;
}
//----------------------写数据到1302寄存器(多字节)-------------------
//
void Write_reg(unsigned char *data)
{
unsigned char i;
RET_L;
SCLK_L;
RET_H;
Write_ds1302(0x8e,0x00);
Send_Byte8(0xfe);
for (i=31;i>0;i--)
{
Send_Byte8(*data);
data++;
}
RET_L;
}
//------------------------读1302寄存器数据(多字节)----------------------
void Read_reg(void)
{
unsigned char i;
RET_L;
SCLK_H;
RET_H;
Send_Byte(0xff);
for (i=31;i>0;i--)
{
data_reg[i]=Read_Byte8();
}
RET_L;
}
//---------------------1302初始化------------------------
void Set_1302(unsigned char *data)
{
unsigned char i;
unsigned char addr=0x8c;
Write_ds1302(0x8e,0x00);//关保护
for (i=0;i<7;i++)
{
Write_ds1302(addr,*data);
data++;
addr-=2;
}
// Write_ds1302(0x8e,0x80);//写保护
}
//-------------------得到1302时钟数据------------------
void Get_1302 (void)
{
unsigned char i;
unsigned char addr=0x8d;
for (i=0;i<7;i++)
{
Get_data[i]=Read_ds1302(addr);
addr-=2;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -