⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.c

📁 实时时钟芯片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 + -