📄 ds1302.c
字号:
////////////////////////////////// ds1302.c ///////////////////////////////////////
// DS1302 PIC18F6720
// SCLK <---------------> RD6/PSP6 PIN50 DSCLK
// I/O <---------------> RD5/PSP6 PIN51 DSDA_IN/_OUT
// \RST <---------------> RD4/PSP5 PIN52 DSRST
// PIN1 <---|+3.6Vcc
// PIN8 <---|+3.6Vbt
// PIN4 <---| GND
///////////////////////////////////////////////////////////////////////////////////
#include "PIC18F6720_IO.h"
#include "PIC18F6720_PERIPHERYDEVICE.h"
#include "p18f6720.h"
#include "delays.h" //soft delay Head Flie
//Delay1TCY(); delay one TCY
//Delay10TCYx(uchar t); (255~0)*10TCY
//.....100........
//.....1K.........
//.....10K........
//if uchar t = 0 that delay time = 2560000tCY
#define uchar unsigned char
//I/O define for PIC18F6720
#define DSCLK LATDbits.LATD6
#define DSRST LATDbits.LATD4
#define DSDA_OUT LATDbits.LATD5
#define DSDA_IN PORTDbits.RD5
#define DDRDSDA DDRDbits.RD5
/*
------------------------------ Function -------------------------------------------
void ResetDs(void);
void OutByte(unsigned char outdata);
unsigned char InByte(void);
void WriteByteDs(unsigned char addr,unsigned char outdata);
unsigned char ReadByteDs(unsigned char addr);
void ReadTime(unsigned char * time);
void WriteTime(unsigned char * time);
void En_dswork(void); //enaible ds1302 work
*/
//---------------------------------- Value ------------------------------------------//
unsigned char systemtime[7];
//-----------------------------------------------------------------------------------//
void ResetDs(void)
{
DSCLK = 0;
Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
DSRST = 0;
Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
DSRST = 1;
}
//-------------------------------------------------
// Output one byte data
//-------------------------------------------------
void OutByte(uchar outdata)
{
uchar iob;
for(iob=0;iob<8;iob++)
{
if((outdata&1)==1) {
DSDA_OUT = 1;
}
else {
DSDA_OUT = 0;
}
Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
DSCLK = 0;
outdata >>= 1;
Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
DSCLK = 1; //上升沿打入数据
Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
}
}
//-------------------------------------------------
//Get one byte of data
//-------------------------------------------------
uchar InByte(void)
{
uchar indata,iIB;
DSDA_OUT = 1;
DDRDSDA = 1;
for(iIB=0,indata=0;iIB<8;iIB++)
{
DSCLK = 1; //下降沿读入数据
Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
DSCLK = 0;
Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
indata>>=1;
if(DSDA_IN)
{
indata |= 0x80;
}
else
indata &= 0x7f;
}
DDRDSDA = 0;
return indata;
}
//----------------------------------------
// Wrirte one byte to pointed addr
//-----------------------------------------------
void WriteByteDs(uchar addr,uchar outdata)
{
// DSGIE;
ResetDs();
OutByte(addr);
OutByte(outdata);
DSRST = 0;
ResetDs();
// ENGIE;
}
//-------------------------------------------------
// Read one byte from pointed addr
//-------------------------------------------------
uchar ReadByteDs(uchar addr)
{
uchar indata;
// DSGIE;
ResetDs();
OutByte(addr);
indata=InByte();
ResetDs();
DSRST = 0;
// ENGIE;
return indata;
}
//-------------------------------------------------
//Read time from ds1302
//-------------------------------------------------
void ReadTime(uchar * time)
{
uchar i;
// DSGIE;
ResetDs();
OutByte(0xbf);
for(i=0;i<7;i++) {
*(time++)=InByte();
}
DSRST = 0;
ResetDs();
DSCLK = 1;//HIGH FOR LOWPOWER
// ENGIE;
}
//-------------------------------------------------
//Write new time to ds1302
//-------------------------------------------------
void WriteTime(uchar * time)
{
uchar iWT;
// DSGIE;
ResetDs();
OutByte(0xbe);
for(iWT=0;iWT<8;iWT++) {
OutByte(*(time++));
}
ResetDs();
DSRST = 0;
DSCLK = 1;//HIGH FOR LOWPOWER
// ENGIE;
}
void En_dswork(void)
{
// DSGIE;
ResetDs();
WriteByteDs(0x80,0); //允许时钟工作
ResetDs();
WriteByteDs(0x84,0); //24小时制
ResetDs();
WriteByteDs(0x8e,0); //write enable
ResetDs();
// ENGIE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -