📄 ds1302.c
字号:
#include <msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
/****************宏定义*******/
#define DS_RST BIT7
#define DS_SCL BIT5
#define DS_SDA BIT6
#define DS_RST_IN P2DIR &=~DS_RST
#define DS_RST_OUT P2DIR |= DS_RST
#define DS_RST0 P2OUT &=~DS_RST
#define DS_RST1 P2OUT |= DS_RST
#define DS_SCL_IN P2DIR &=~DS_SCL
#define DS_SCL_OUT P2DIR |= DS_SCL
#define DS_SCL0 P2OUT &=~DS_SCL
#define DS_SCL1 P2OUT |= DS_SCL
#define DS_SDA_IN P2DIR &=~DS_SDA
#define DS_SDA_OUT P2DIR |= DS_SDA
#define DS_SDA0 P2OUT &=~DS_SDA
#define DS_SDA1 P2OUT |= DS_SDA
#define DS_SDA_BIT P2IN&DS_SDA
/*******************************************
函数名称:delay
功 能:延时一段时间
参 数:time--延时长度
返回值 :无
********************************************/
void delay(uint time)
{
uint i;
for(i = 0;i < time;i++) _NOP();
}
/*******************************************
函数名称:Reset_DS1302
功 能:对DS1302进行复位操作
参 数:无
返回值 :无
********************************************/
void Reset_DS1302(void)
{
DS_RST_OUT;
DS_SCL_OUT;
DS_SCL0;
DS_RST0;
delay(10);
DS_SCL1;
}
/*******************************************
函数名称:Write1Byte
功 能:对DS1302写入1个字节的数据
参 数:wdata--写入的数据
返回值 :无
********************************************/
void Write1Byte(uchar wdata)
{
uchar i;
DS_SDA_OUT;
DS_RST1;
for(i=0;i<8;i++)
{
if(wdata&0x01)
DS_SDA1;
else
DS_SDA0;
DS_SCL0;
delay(10);
DS_SCL1;
delay(10);
wdata>>=1;
}
}
/************************************
函数名称:Read1BYte
功能: 从DS1302读出一个字节的数据
参数: 无
返回值:读出的一个字节数据
************************************/
uchar Read1Byte(void)
{
uchar i;
uchar rdata=0x00;
DS_SDA_IN;
DS_RST1;
for(i=0;i<8;i++)
{
DS_SCL1;
delay(10);
DS_SCL0;
delay(10);
rdata>>=1;
if(DS_SDA_BIT)
rdata |=0x80;
}
return rdata;
}
/*******************************************
函数名称:W_Data
功 能:向某个寄存器写入一个字节数据
参 数:addr--寄存器地址
wdata--写入的数据
返回值 :无
********************************************/
void W_Data(uchar addr ,uchar wdata)
{
DS_RST0;
DS_SCL0;
_NOP();
DS_RST1;
Write1Byte(addr);
Write1Byte(wdata);
DS_SCL1;
DS_RST0;
}
/*******************************************
函数名称:R_Data
功 能:从某个寄存器读出一个字节数据
参 数:addr--寄存器地址
返回值 :读出的数据
********************************************/
uchar R_Data(uchar addr)
{
uchar rdata;
DS_RST0;
DS_SCL0;
_NOP();
DS_RST1;
Write1Byte(addr);
rdata = Read1Byte();
DS_SCL1;
DS_RST0;
return rdata;
}
/*******************************************
函数名称:BurstWrite1302
功 能:以burst方式向DS1302写入批量时间数据
参 数:ptr--指向时间数据存放地址的指针
返回值 :读出的数据
说 明:时间数据的存放格式是:
秒,分,时,日,月,星期,年,控制
【7个数据(BCD格式)+1个控制】
********************************************/
void BurstWrite1302(uchar *ptr)
{
uchar i;
W_Data(0x8e,0x00); //允许写入
DS_RST0;
DS_SCL0;
_NOP();
DS_RST1;
Write1Byte(0xbe); // 0xbe:时钟多字节写入命令
for(i=0;i<8;i++)
{
Write1Byte(*ptr++);
}
DS_SCL1;
DS_RST0;
W_Data(0x8e,0x80); // 禁止写入
}
/*******************************************
函数名称:BurstRead1302
功 能:以burst方式从DS1302读出批量时间数据
参 数:ptr--指向存放时间数据地址的指针
返回值 :无
说 明:时间数据的存放格式是:
秒,分,时,日,月,星期,年,控制
【7个数据(BCD格式)+1个控制】
********************************************/
void BurstRead1302(uchar *ptr)
{
uchar i;
DS_RST0;
DS_SCL0;
_NOP();
DS_RST1;
Write1Byte(0xbf); //0xbf:时钟多字节读命令
for(i=8;i>0;i--)
{
*ptr++=Read1Byte();
}
DS_SCL1;
DS_RST0;
}
/*******************************************
函数名称:BurstWriteRAM
功 能:以burst方式向DS1302的RAM中写入批量数据
参 数:ptr--指向存放数据地址的指针
返回值 :无
说明 :共写入31个字节的数据
********************************************/
void BurstWriteRAM(uchar *ptr)
{
uchar i;
W_Data(0x8e,0x00); //允许写入
DS_RST0;
DS_SCL0;
_NOP();
DS_RST1;
Write1Byte(0xfe);
for(i=31;i>0;i--)
{
Write1Byte(*ptr++);
}
DS_SCL1;
DS_RST0;
W_Data(0x8e,0x80); //禁止写入
}
/*******************************************
函数名称:BurstReadRAM
功 能:以burst方式从DS1302的RAM中读出批量数据
参 数:ptr--指向数据存放地址的指针
返回值 :无
说明 :共读出31个字节的数据
********************************************/
void BurstReadRAM(uchar *ptr)
{
uchar i;
DS_RST0;
DS_SCL0;
_NOP();
DS_RST1;
Write1Byte(0xbf); //0xbf:时钟多字节读命令
for(i=31;i>0;i--)
{
*ptr++=Read1Byte();
}
DS_SCL1;
DS_RST0;
}
/*******************************************
函数名称: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
* 返回值: 无
***********************************************************************/
void Get_DS1302(uchar *ptr)
{
uchar i;
uchar addr = 0x81;
for(i = 0;i < 7;i++)
{
ptr[i] = R_Data(addr);
addr += 2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -