📄 ds1302.h
字号:
/********************************************************************************************************/
#include "config.h"
#include "view.h"
#ifndef __ds1302_H
#define __ds1302_H
//******************下为引脚连接关系********************
#define SCL_Ds1302 0x10000000 //p3.29
#define IO_Ds1302 0x08000000 //p3.28
#define RST_Ds1302 0x10000000 //p2.28
#define bit_data0 data_ds1302^0;
#define bit_data7 data_ds1302^7;
#define plag 0x00000000;
/********************************************************
名称:delayns()
功能:长软件延时
入口参数:dly
出口参数:无
*********************************************************/
void delayns(uint32 dly)
{
uint32 i;
for(;dly>0;dly--); //个性本身就是人性的突出表现,没什么好签的。
for(i=0;i<500;i++);
}
//*******************************************************
/*static void i2c_nop_delay(INT16U k)
{
while (k>0)
{
k--;
usDelay(10);//10微秒
}
}
*/
/////////////////////////////////////////
uint8 duankong[11]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //
uint8 weikong[9]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//
uint8 display_buffer[13];//
//*************************************************************
uint8 bit_data,data_ds1302;
//**************************************************
void write_byte(uint8 data_ds1302) //写一字节数据
{
uint8 i;
for(i=0;i<8;i++)
{
IO2CLR = SCL_Ds1302; // SCL_Ds1302=0;
if(bit_data & 0x01)
{
IO2SET = IO_Ds1302;
}
else
{
IO2CLR = IO_Ds1302;
}
// IO_Ds1302=bit_data0;
delayns(1); // _nop_();
IO2SET = SCL_Ds1302; // SCL_Ds1302=1;
data_ds1302=data_ds1302>>1;
}
}
//****************************************
void chongdian_en() //涓流充电允许
{
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
delayns(1); //_nop_();
IO2SET = RST_Ds1302; //RST_Ds1302=1;
delayns(2); //_nop_();_nop_();
write_byte(0x90);//涓流充电
write_byte(0xa4);//NO RECHARGE ROR BATTREY
}
//*********************************************
void send_yety() //发送数据
{
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
delayns(1); //_nop_();
IO2SET = RST_Ds1302; //RST_Ds1302=1;
delayns(2); //_nop_();_nop_();
write_byte(0x80);
write_byte(0x08);
}
//************************************************************
void close_write_bit() //关闭写保护位
{
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
delayns(1); // _nop_();
IO2SET = RST_Ds1302; //RST_Ds1302=1;
delayns(2); // _nop_(); // _nop_();
write_byte(0x8e);
IO2CLR = IO_Ds1302; //IO_Ds1302=0;
write_byte(0x80);//CLOSE WRITE PROTECT BIT
}
//**************************************************************
void open_write_bit() //打开写保护位
{
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
delayns(1); //_nop_();
IO2SET = RST_Ds1302; //RST_Ds1302=1;
delayns(2); //_nop_();_nop_();
write_byte(0x8e);
IO2CLR = IO_Ds1302; //IO_Ds1302=0;
write_byte(0x00);
}
//**************************************************************
void initial_ds1302()
{
close_write_bit();//关闭写保护位
IO2CLR = RST_Ds1302; //RST_Ds1302=0;
delayns(1); //_nop_();
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
chongdian_en(); //涓流充电
IO2CLR = RST_Ds1302; //RST_Ds1302=0;
delayns(1); //_nop_();
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
send_yety(); //发送数据
IO2CLR = RST_Ds1302; //RST_Ds1302=0;
delayns(1); //_nop_();
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
}
//******************************************************
uint8 read_ds1302(uint8 command)//读DS1302数据
{
uint8 i;
data_ds1302=(command<<1)|0x81;
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
delayns(1); //_nop_();
IO2SET = RST_Ds1302; //RST_Ds1302=1;
for(i=0;i<8;i++)
{
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
if(bit_data & 0x01)
{
IO2SET = IO_Ds1302;
}
else
{
IO2CLR = IO_Ds1302;
} // IO_Ds1302=bit_data0;
delayns(1); //_nop_();
IO2SET = SCL_Ds1302; //SCL_Ds1302=1;
data_ds1302=data_ds1302>>1;
}
IO2SET = SCL_Ds1302; //SCL_Ds1302=1;
for(i=0;i<8;i++)
{
data_ds1302=data_ds1302>>1;
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
delayns(1); //_nop_();
if( PINSEL2 & 0x08000000 != 0)
{
IO2SET = bit_data7;
}
else
{
IO2CLR = bit_data7;
}
// bit_data7 =IO_Ds1302;
IO2SET = SCL_Ds1302; //SCL_Ds1302=1;
}
IO2CLR = RST_Ds1302; //RST_Ds1302=0;
delayns(1); // _nop_();
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
return(data_ds1302);
}
//**********************************************************
void write_ds1302(uint8 address,int8 numb)
//写入时分秒
{
int8 i;
IO2CLR = RST_Ds1302; //RST_Ds1302=0;
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
IO2CLR = RST_Ds1302; //RST_Ds1302=0;
IO2SET = RST_Ds1302; //RST_Ds1302=1;
data_ds1302=address;
for(i=0;i<8;i++)
{
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
if(bit_data & 0x01)
{
IO2SET = IO_Ds1302;
}
else
{
IO2CLR = IO_Ds1302;
}
// IO_Ds1302=bit_data0;
delayns(1); //_nop_();
IO2SET = SCL_Ds1302; //SCL_Ds1302=1;
data_ds1302=data_ds1302>>1;
}
data_ds1302=numb;
for(i=0;i<8;i++)
{
IO2CLR = SCL_Ds1302; //SCL_Ds1302=0;
if(bit_data & 0x01)
{
IO2SET = IO_Ds1302;
}
else
{
IO2CLR = IO_Ds1302;
}
// IO_Ds1302=bit_data0;
delayns(1); //_nop_();
IO2SET = SCL_Ds1302; //SCL_Ds1302=1;
data_ds1302=data_ds1302>>1;
}
IO2CLR = RST_Ds1302; //RST_Ds1302=0;
IO2SET = SCL_Ds1302; //SCL_Ds1302=1;
}
//*******************************************************
void read_time()//读时分秒,读数据时操作地址为奇数。
{
uint8 second,minute,hour,date,month,week,year,d;
// EA=0;
second=0;//读秒地址
d=read_ds1302(second);
display_buffer[12]=d&0x0f;
display_buffer[11]=d>>4;
minute=1;//读分地址
d=read_ds1302(minute);
display_buffer[10]=d&0x0f;
display_buffer[9]=(d>>4);
hour=2;//读小时地址
d=read_ds1302(hour);
display_buffer[8]=d&0x0f;
display_buffer[7]=d>>4;
date=3;//读日地址
d=read_ds1302(date);
display_buffer[6]=d&0x0f;
display_buffer[5]=d>>4;
month=4;//读月地址
d=read_ds1302(month);
display_buffer[4]=d&0x0f;
display_buffer[3]=d>>4;
year=6;//读年地址
d=read_ds1302(year);
display_buffer[2]=d&0x0f;
display_buffer[1]=d>>4;
week=5;//读星期地址
d=read_ds1302(week);
display_buffer[0]=d&0x0f;
// EA=1;
}
//*********************************************************
void set_time() //时间设置,写数据时操作地址为偶数。
{
uint8 data, temp;
open_write_bit();
temp=display_buffer[0];
write_ds1302(0x8A,temp);//星期地址,数据
temp=(display_buffer[1]<<4)|display_buffer[2];
write_ds1302(0x8C,temp);//年地址,数据
temp=(display_buffer[3]<<4)|display_buffer[4];
write_ds1302(0x88,temp);//月地址,数据
temp=(display_buffer[5]<<4)|display_buffer[6];
write_ds1302(0x86,temp);//日地址,数据
temp=(display_buffer[7]<<4)|display_buffer[8];
write_ds1302(0x84,temp);//小时地址,数据
temp=(display_buffer[9]<<4)|display_buffer[10];
write_ds1302(0x82,temp);//分地址,数据
temp=(display_buffer[11]<<4)|display_buffer[12];
write_ds1302(0x80,temp);//秒地址,数据
close_write_bit();
}
//*****************************************
void time_init() //时间设置,写数据时操作地址为偶数。
{
ShowWeek(12,2,(display_buffer[0]=0x04)); //星期
ShowDate(3,2,(display_buffer[1]=0x00)); //年
ShowDate(4,2,(display_buffer[2]=0x06));
ShowDate(6,2,(display_buffer[3]=0x01)); //月
ShowDate(7,2,(display_buffer[4]=0x00));
ShowDate(9,2,(display_buffer[5]=0x01)); //日
ShowDate(10,2,(display_buffer[6]=0x03));
display_buffer[7]=0x01; //时
display_buffer[8]=0x05;
display_buffer[9]=0x05; //分
display_buffer[10]=0x08;
display_buffer[11]=0x00; //秒
display_buffer[12]=0x00;
}
/**********************************************/
/**********************************************/
//void display()
//**********************************************************
/*******************************************************
*名称:main
*功能:控制ds1302
*******************************************************/
void ds1302 (void)
{
PINSEL2 = PINSEL2 & 0xC7FFFFFF; //设置引脚连接GPIO
PINSEL1 = PINSEL1 & 0xCFFFFFFF; //设置引脚连接GPIOinitial_ds1302();//上电启用,否则不走时
time_init();
delayns(6000);
set_time();
while(1)
{
read_time();//读取当前时/分秒,放在数组中
}
}
#endif
//********************************************
/***********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -