?? 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 + -