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