?? ds1302.c
字號:
#include <MSP430X14X.h>
#define CE BIT0
#define SDA BIT1
#define SCLK BIT2
void CE_Enable(void);
void CE_Disable(void);
void SCLK_HI(void);
void SCLK_LO(void);
void WriteByte(char nVal);
char ReadByte(void);
void WriteTo1302(char nAddr, char nVal);
char ReadFrom1302(char nAddr);
void BurstWriteTime(char *pWClock);
void BurstReadTime(char *pRClock);
void BurstWriteRam(char *pWReg);
void BurstReadRam(char *pRReg);
void SetTime(char *pClock);
void GetTime(char pTime[]);
void Port_Init(void)
{
P1DIR = 0;
//設置CE為輸出管腳
P1DIR |= CE;
//設置SCLK為輸出管腳
P1DIR |= SCLK;
return;
}
void CE_Enable(void)
{
P1OUT |= CE;
return;
}
void CE_Disable(void)
{
P1OUT &= ~(CE);
return;
}
void SCLK_HI(void)
{
P1OUT |= SCLK;
return;
}
void SCLK_LO(void)
{
P1OUT &= ~(SCLK);
return;
}
void WriteByte(char nVal)
{
char i,j;
char nTemp = nVal;
char nSend;
//設置DATA為輸出管腳
P1DIR |= SDA;
_NOP();
_NOP();
_NOP();
_NOP();
for(i = 0; i < 8; i++)
{
nSend = (nTemp & 0x01);
if(nSend == 1)
{
P1OUT |= SDA;
}
else
{
P1OUT &= ~(SDA);
}
SCLK_HI();
for(j = 10;j > 0;j--) ;
SCLK_LO();
for(j = 10;j > 0;j--) ;
nTemp >>= 1;
}
}
char ReadByte(void)
{
char nTemp = 0;
int i;
int j;
//設置DATA為輸入管腳
P1DIR |= SDA;
_NOP();
_NOP();
_NOP();
_NOP();
for(i = 0; i < 8; i++)
{
SCLK_HI();
if(P1IN & SDA)
{
nTemp |= (0x01 << i);
}
for(j = 10;j > 0;j--);
SCLK_LO();
}
return nTemp;
}
void WriteTo1302(char nAddr, char nVal)
{
CE_Disable();
SCLK_LO();
CE_Enable();
//地址,命令
WriteByte(nAddr);
//寫1Byte數據
WriteByte(nVal);
SCLK_HI();
CE_Disable();
return;
}
char ReadFrom1302(char nAddr)
{
char nData;
CE_Disable();
SCLK_LO();
CE_Enable();
//地址,命令
WriteByte(nAddr);
//讀1Byte數據
nData = ReadByte();
SCLK_HI();
CE_Disable();
return(nData);
}
void BurstWriteTime(char *pClock)
{
char i;
//控制命令,WP=0,寫操作
WriteTo1302(0x8e,0x00);
CE_Disable();
SCLK_LO();
CE_Enable();
//0xbe:時鐘多字節寫命令
WriteByte(0xbe);
//8Byte = 7Byte 時鐘數據 + 1Byte 控制
for (i = 8; i > 0; i--)
{
//寫1Byte數據
WriteByte(*pClock);
pClock++;
}
SCLK_HI();
CE_Disable();
return;
}
void BurstReadTime(char *pClock)
{
char i;
CE_Disable();
SCLK_LO();
CE_Enable();
//0xbf:時鐘多字節讀命令
WriteByte(0xbf);
for (i = 8; i > 0; i--)
{
//讀1Byte數據
*pClock = ReadByte();
pClock++;
}
SCLK_HI();
CE_Disable();
return ;
}
void BurstWriteRam(char *pReg)
{
char i;
//控制命令,WP=0,寫操作
WriteTo1302(0x8e,0x00);
CE_Disable();
SCLK_LO();
CE_Enable();
//0xfe:時鐘多字節寫命令
WriteByte(0xfe);
//31Byte 寄存器數據
for (i = 31; i > 0; i--)
{
//寫1Byte數據
WriteByte(*pReg);
pReg++;
}
SCLK_HI();
CE_Disable();
return;
}
void BurstReadRam(char *pReg)
{
char i;
CE_Disable();
SCLK_LO();
CE_Enable();
//0xff:時鐘多字節讀命令
WriteByte(0xff);
//31Byte 寄存器數據
for (i = 31; i > 0; i--)
{
//讀1Byte數據
*pReg = ReadByte();
pReg++;
}
SCLK_HI();
CE_Disable();
return;
}
void SetTime(char *pClock)
{
char i;
char nAddr = 0x80;
//控制命令,WP=0,寫操作
WriteTo1302(0x8e,0x00);
for(i = 7; i > 0; i--)
{
//秒 分 時 日 月 星期 年
WriteTo1302(nAddr,*pClock);
pClock++;
nAddr += 2;
}
//控制命令,WP=1,寫保護?
WriteTo1302(0x8e,0x80);
return;
}
void GetTime(char pTime[])
{
char i;
char nAddr = 0x81;
for (i = 0; i < 7; i++)
{
//格式為: 秒 分 時 日 月 星期 年
pTime[i] = ReadFrom1302(nAddr);
nAddr += 2;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -