#include <msp430x14x.h>
//#include "DS1302.h"
#define uchar unsigned char
#define uint unsigned int
/**************宏定义***************/
#define DS_RST BIT5 //DS_RST = P5.5
#define DS_SCL BIT7 //DS_SCL = P5.7
#define DS_SDA BIT6 //DS_SDA = P5.6
#define DS_RST_IN P5DIR &= ~DS_RST
#define DS_RST_OUT P5DIR |= DS_RST
#define DS_RST0 P5OUT &= ~DS_RST
#define DS_RST1 P5OUT |= DS_RST
#define DS_SCL_IN P5DIR &= ~DS_SCL
#define DS_SCL_OUT P5DIR |= DS_SCL
#define DS_SCL0 P5OUT &= ~DS_SCL
#define DS_SCL1 P5OUT |= DS_SCL
#define DS_SDA_IN P5DIR &= ~DS_SDA
#define DS_SDA_OUT P5DIR |= DS_SDA
#define DS_SDA0 P5OUT &= ~DS_SDA
#define DS_SDA1 P5OUT |= DS_SDA
#define DS_SDA_BIT P5IN & DS_SDA
/*******************************************
函数名称:delaytime
功 能:延时一段时间
参 数:time--延时长度
返回值 :无
********************************************/
void delaytime(uint time)
{
uint i;
// time=time*5/4;
for(i=0;i<time;i++); _NOP();
}
/*******************************************
函数名称:Write1Byte
功 能:对DS1302写入1个字节的数据
参 数:wdata--写入的数据
返回值 :无
********************************************/
void Write1Byte(uchar wdat)
{
uchar i;
DS_SDA_OUT; //SDA对应的IO设置为输出状态
// DS_SCL0;
DS_RST1; //REST=1;
_NOP();_NOP();
for(i=8; i>0; i--)
{
//DS_SCL0;
if(wdat&0x01) DS_SDA1;
else DS_SDA0;
DS_SCL0;
delaytime(10);
DS_SCL1;
delaytime(10);
wdat >>= 1;
}
DS_SDA1;
}
/*******************************************
函数名称:Read1Byte
功 能:从DS1302读出1个字节的数据
参 数:无
返回值 :读出的一个字节数据
********************************************/
uchar Read1Byte(void)
{
uchar i;
uchar rdat=0X00;
//delaytime(5);
//DS_SDA1;
DS_SDA_IN; //SDA对应的IO设置为输入状态
DS_RST1; //REST=1;
//DS_SCL0;
for(i=8; i>0; i--)
{
DS_SCL1;
delaytime(5);
DS_SCL0;
delaytime(5);
rdat >>=1;
if(DS_SDA_BIT) rdat |= 0x80;
}
DS_SDA_OUT;
return(rdat);
}
/*******************************************
函数名称:W_Data
功 能:向某个寄存器写入一个字节数据
参 数:addr--寄存器地址
wdata--写入的数据
返回值 :无
********************************************/
void W_Data(uchar addr, uchar wdat)
{
DS_RST0;
DS_SCL0;
DS_SDA1;
_NOP();_NOP();
DS_RST1;
_NOP();_NOP();
Write1Byte(addr); //写入地址
//DS_SCL0;
//delaytime(5);
Write1Byte(wdat); //写入数据
DS_SDA1;
DS_SCL1;
//delaytime(5);
DS_RST0;
}
/*******************************************
函数名称:R_Data
功 能:从某个寄存器读出一个字节数据
参 数:addr--寄存器地址
返回值 :读出的数据
********************************************/
uchar R_Data(uchar addr)
{
uchar rdat;
DS_RST0;
DS_SCL0;
_NOP();_NOP();
DS_RST1;
delaytime(5);
Write1Byte(addr); //写入地址
rdat = Read1Byte(); //读出数据
DS_SCL1;
DS_RST0;
DS_SDA1;
return(rdat);
}
/*******************************************
函数名称:Set_DS1302
功 能:设置DS1302内部的时间
参 数:ptr--指向存放数据地址的指针
返回值 :无
说明 :写入数据的格式:
秒 分 时 日 月 星期 年 【共7个字节】
********************************************/
void Set_DS1302(uchar *ptr)
{
uchar i;
uchar addr = 0x80;
W_Data(0x8e,0x00); //允许写入
for(i =7;i>0;i--)
{
W_Data(addr,*ptr++);
addr += 2;
}
W_Data(0x8e,0x80); //禁止
}
/********************************************************************
*
* 名称: Get_DS1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: R_Data(uchar addr)
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*******************************************
函数名称:Get_DS1302
功 能:读取DS1302内部的时间
参 数:ptr--指向数据存放地址的指针
返回值 :无
说明 :读出数据的格式:
秒 分 时 日 月 星期 年 【共7个字节】
********************************************/
void Get_DS1302(uchar *ptr)
{
uchar i;
uchar addr=0x81;
for(i=0;i<7;i++)
{
ptr[i]=R_Data(addr);
addr+=2;
}
}
/*******************************************
函数名称:Reset_DS1302
功 能:对DS1302进行复位操作
参 数:无
返回值 :无
********************************************/
void Reset_DS1302(void)
{
P5SEL=0;
DS_RST_OUT; //RST对应的IO设置为输出状态
DS_SCL_OUT; //SCLK对应的IO设置为输出状态
DS_SCL0; //SCLK=0
DS_RST0; //RST=0
delaytime(40);
DS_SCL1; //SCLK=1
W_Data(0x8e,0x00);
W_Data(0x80,0x00);
}
|