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

📄 1302.c

📁 TI MSP430 ds1302时钟芯片驱动程序
💻 C
字号:
#include <msp430x14x.h>

#define CE 0x20
#define SCLK 0x40
#define DATA 0X80

void CE_Enable(void);
void CE_Disable(void);
void SCLK_HI(void);
void SCLK_LO(void);
void WriteByte(unsigned char nVal);
unsigned char ReadByte(void);
void WriteTo1302(unsigned char nAddr,unsigned char nVal);
unsigned char ReadFrom1302(unsigned char nAddr);
void BurstWriteTime(unsigned char *pClock);
void BurstReadTime(unsigned char *qClock);
void GetTime(unsigned char qTime[10]);
void SetTime(unsigned char *pClock);
void delay(unsigned int j);


unsigned char SetTimer[10] = {0x26,0x13,0x10,0x06,0x09,0x07,0x04,0x00};
unsigned char GetTimer[10];

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;
  P5DIR |= CE+SCLK;
  BurstWriteTime(SetTimer);
  while(1)
  {
    delay(5000);      //n=1时20时钟周期,每加1增加9个时钟周期   
    _NOP();
    GetTime(GetTimer); 
  }
}                  
  
void CE_Enable(void)
{
  P5OUT |= CE;
}

void CE_Disable(void)
{
  P5OUT&=~CE;
}

void SCLK_HI(void)
{
  P5OUT |= SCLK;
}

void SCLK_LO(void)
{
  P5OUT&=~SCLK;
}

void WriteByte(unsigned char nVal)
{
  char i,j;
  unsigned char nTemp = nVal;
  unsigned char nSend;
  SCLK_LO();
  P5DIR |= DATA;
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  for(i=0;i<8;i++)
  {
    SCLK_LO();
    for(j=20;j>0;j--);
    nSend = (nTemp & 0x01);
    if(nSend == 1)
    {
      P5OUT |= DATA;
    }
    else
    {
      P5OUT&=~DATA;
    }
    SCLK_HI();
    for(j=20;j>0;j--);
    nTemp >>= 1;
  }
}

unsigned char ReadByte(void)
{
  unsigned char nTemp = 0;
  int i;
  int j;
  P5DIR&=~DATA;
  SCLK_HI();
  _NOP();
  _NOP();
  _NOP();
  _NOP();
  for(i=0;i<8;i++)
  {
    SCLK_LO();
    if(P5IN & DATA)
    {
      nTemp |= (0x01<<i);
    }
    for(j=20;j>0;j--);
    SCLK_HI();
  }
  return nTemp;
}
   
void WriteTo1302(unsigned char nAddr,unsigned char nVal)
{
  CE_Disable();
  CE_Enable();
  SCLK_LO();
  WriteByte(nAddr);
  WriteByte(nVal);
  SCLK_LO();
  CE_Disable();
}

unsigned char ReadFrom1302(unsigned char nAddr)
{
  unsigned char nData;
  CE_Disable();
  CE_Enable();
  SCLK_LO();
  WriteByte(nAddr);
  nData = ReadByte();
  SCLK_LO();
  CE_Disable();
  return(nData);
}

void SetTime(unsigned char *pClock)
{
  char i;
  unsigned char nAddr = 0x80;
  WriteTo1302(0x8e,0x00);
  for(i=7;i>0;i--)
  {
    WriteTo1302(nAddr,*pClock);
    pClock++;
    nAddr += 2;
  }
  WriteTo1302(0x8e,0x80);
}

void GetTime(unsigned char qTime[6])
{
  char i;
  unsigned char nAddr = 0x81;
  for(i=0;i<7;i++)
  {
    qTime[i] = ReadFrom1302(nAddr);
    nAddr += 2;
  }
}
void BurstWriteTime(unsigned char *pClock)
{
  char i;
  WriteTo1302(0x8e,0x00);
  CE_Disable();
  SCLK_LO();
  CE_Enable();
  WriteByte(0xbe);
  for(i=8;i>0;i--)
  {
    WriteByte(*pClock);
    pClock++;
  }
  SCLK_LO();
  CE_Disable();
}

void BurstReadTime(unsigned char *qClock)
{
  char i;
  CE_Disable();
  SCLK_LO();
  CE_Enable();
  WriteByte(0xbf);
  for(i=8;i>0;i--)
  {
    *qClock = ReadByte();
    qClock++;
  }
  SCLK_LO();
  CE_Disable();
}

void delay(unsigned int j)
{
  while(j>0)
    j--;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -