|
#include "msp430f169.h"
#include "DS1302.h"
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define sckout P1DIR |= BIT0
#define sckin P1DIR &= ~(BIT0)
#define sck_h P1OUT |= BIT0//sck置高
#define sck_l P1OUT &= ~(BIT0)//sck置底
#define sdaout P1DIR |= BIT1
#define sdain P1DIR &= ~(BIT1)
#define sda_h P1OUT |= BIT1//sda置高
#define sda_l P1OUT &= ~(BIT1)//sda置底
#define rstout P1DIR |= BIT2
#define rstin P1DIR &= ~(BIT2)
#define rst_h P1OUT |= BIT2//rst置高
#define rst_l P1OUT &= ~(BIT2)//rst置底
//对DS1302进行复位操作
void DS1302_init()
{
sckout;
rstout;
sck_l;//sck置底
rst_l;//rst置底
delay_us(10);
sck_h;//sck置高
}
//写一个字节
void DS1302_writebyte(char num)
{
char i;
sdaout;
rst_h;//rst置高
for(i=0;i<8;i++)
{
if(num&0x01) sda_h;
else sda_l;
sck_l; //sck置底
delay_us(10);
sck_h;//sck置高
delay_us(10);
num>>=1;
}
}
//读一个字节
char DS1302_readbyte(void)
{
char i;
char rdata =0x00;
sdain;
rst_h; //rst置高
for(i=0;i<8;i++)
{
sck_h;//sck置高
delay_us(10);
sck_l;//sck置底
delay_us(10);
rdata>>=1;
if(P1IN&0x02)
rdata|=0x80; //P3OUT=0x00;
}
sdaout;
return(rdata);
}
//写DS1302数据
void DS1302_write(char address,char dat)
{
rst_l;//rst置底
sck_l;//sck置底
delay_us(1);
rst_h;//rst置高
DS1302_writebyte(address);
DS1302_writebyte(dat);
sck_h;//sck置高
rst_l;//rst置底
}
//读DS1302数据
char DS1302_read(char address)
{
char temp=0x00;
rst_l;//rst置底
// delay_us(2);
sck_l;//sck置底
// delay_us(2);
rst_h;//rst置高
delay_us(2);
DS1302_writebyte(address);
temp=DS1302_readbyte();
sck_h;//sck置高
rst_l;//rst置底
return (temp);
}
//设定时钟数据
void set_RTC(char *ptr)
{
char i;
char addr=0x80;
DS1302_write(0x8E,0x00);
for(i=0;i<7;i++)
{
DS1302_write(addr,*ptr++);
addr+=2;
}
DS1302_write(0x8E,0x80);
}
//读时钟数据
void read_RTC(char *ptr)
{
char i;
char addr=0x81;
for(i=0;i<7;i++)
{
ptr= DS1302_read(addr);
addr+=2;
}
}
//以burst方式向DS1302写入批量时间数据
void burst_writeDS1302(char *ptr)
{
char i;
DS1302_write(0x8E,0x00);
rst_l;//rst置底
sck_l;//sck置底
delay_us(1);
rst_h;//rst置高
DS1302_writebyte(0xbe);
for(i=0;i<8;i++)
{
DS1302_writebyte(*ptr++);
}
sck_h;//sck置高
rst_l;//rst置底
DS1302_write(0x8E,0x80);
}
//以burst方式从DS1302读出批量时间数据
void burst_readDS1302(char *ptr)
{
char i;
rst_l;//rst置底
sck_l;//sck置底
delay_us(1);
rst_h;//rst置高
DS1302_writebyte(0xbf);
for(i=0;i<8;i++)
{
*ptr++ = DS1302_readbyte();
}
sck_h;//sck置高
rst_l;//rst置底
}
//以burst方式向DS1302的RAM中写入批量数据
void burst_writeRAM(char *ptr)
{
char i;
DS1302_write(0x8E,0x00);
rst_l;//rst置底
sck_l;//sck置底
delay_us(1);
rst_h;//rst置高
DS1302_writebyte(0xfe);
for(i=0;i<31;i++)
{
DS1302_writebyte(*ptr++);
}
sck_h;//sck置高
rst_l;//rst置底
DS1302_write(0x8E,0x80);
}
//以burst方式从DS1302的RAM中读出批量数据
void burst_readRAM(char *ptr)
{
char i;
rst_l;//rst置底
sck_l;//sck置底
delay_us(1);
rst_h;//rst置高
DS1302_writebyte(0xff);
for(i=0;i<31;i++)
{
*ptr++ = DS1302_readbyte();
}
sck_h;//sck置高
rst_l;//rst置底
}
#ifndef __DS1302_H__
#define __DS1302_H__
//对DS1302进行复位操作
void DS1302_init();
//写一个字节
void DS1302_writebyte(char num);
//读一个字节
char DS1302_readbyte(void);
//写DS1302数据
void DS1302_write(char address,char dat);
//读DS1302数据
char DS1302_read(char address);
//设定时钟数据
void set_RTC(char *ptr);
//读时钟数据
void read_RTC(char *ptr);
//以burst方式向DS1302写入批量时间数据
void burst_writeDS1302(char *ptr);
//以burst方式从DS1302读出批量时间数据
void burst_readDS1302(char *ptr);
//以burst方式向DS1302的RAM中写入批量数据
void burst_writeRAM(char *ptr);
//以burst方式从DS1302的RAM中读出批量数据
void burst_readRAM(char *ptr);
#endif
|
|