技术文章

MSP430和实时时钟HT1381 & HT1380的接口程序

      

 
    HT1381是台湾HT公司的一款串行实时时钟IC,工作电压:2.0V~5.5V,*大输入串行时钟500kHz ( VDD=2V),2MHz(VDD=5V);工作电流:2V时小于300nA,5V时小于1mA。串行I/O传送,二种数据传送方式:单字节或多字节(Burst方式),所有寄存器以BCD码格式存储具有接口简单、功耗低、工作电压范围宽、计时**、功能全、成本低等优点,因此在实际应用中被广泛采用。该芯片提供秒、分、时、日、日期、月和年的信息。对于小于31天的月的月末日期能自动进行调整,还包括闰年校正功能。低功耗设计且时钟的运行可以采用24小时格式或带AM/PM指示的12小时的格式。

以下是接口程序,430测试频率为4M.
#define NOP _NOP();_NOP()

#define    NowSec    cNowTime[0]                 
#define     NowMin    cNowTime[1]
#define     NowHour   cNowTime[2]
#define     NowDate   cNowTime[3]
#define     NowMonth  cNowTime[4]
#define     NowYear   cNowTime[5]

#define    SetSec    cSetTime[0]                 
#define     SetMin    cSetTime[1]
#define     SetHour   cSetTime[2]
#define     SetDate   cSetTime[3]
#define     SetMonth  cSetTime[4]
#define     SetYear   cSetTime[5]

uchar Temp_Count;
uchar cSetTime[6];     
uchar cNowTime[6];

void  Timer_Out_Byte(ucharOutByte);
uchar Timer_In_Byte(void);

void ReadRealtime(void)
{
        NOP;
        HT1381_OUTPORT&=~Timer_SCL;         //Timer_SCL=0;
        NOP;
        HT1381_OUTPORT |=Timer_Rest;         //Timer_Rest=1;

       Timer_Out_Byte(0xBF);                            //Read, Burst Mode

       for(TimeCount=0;TimeCount<6;TimeCount++)
               {
                 if  (TimeCount==5)
                  Timer_In_Byte();               //dummy read.
                 cNowTime[TimeCount]=Timer_In_Byte();
                //change BCD to uchar
                cNowTime[TimeCount]=(cNowTime[TimeCount]/0x10)*10+(cNowTime[TimeCount]%0x10);
               }
        NOP;
        HT1381_OUTPORT&=~Timer_Rest;   //Timer_Rest=0;
}

void WriteRealtime(void)
{
        NOP;
        HT1381_OUTPORT&=~Timer_Rest;       //Timer_Rest=0; //for sure to close rest.
        NOP;
        HT1381_OUTPORT&=~Timer_SCL;         //Timer_SCL=0;
        NOP;
        HT1381_OUTPORT |=Timer_Rest;         //Timer_Rest=1;
       Timer_Out_Byte(0x8E);                            //Write,Single Mode
       Timer_Out_Byte(0x00);                            //Write, Protect Byte=0, Disable protect
        NOP;
        HT1381_OUTPORT&=~Timer_Rest;   //Timer_Rest=0;

       
        NOP;
        HT1381_OUTPORT |=Timer_Rest;         //Timer_Rest=1;
       Timer_Out_Byte(0x80);                            //Write,Single Mode
       Timer_Out_Byte(0x00);                            //Write, OSC enalbe, old second distroied
        NOP;
        HT1381_OUTPORT&=~Timer_Rest;   //Timer_Rest=0;

       for(TimeCount=0;TimeCount<6;TimeCount++)
  {
           //change uchar to BCD
           cSetTime[TimeCount]=(cSetTime[TimeCount]/10)*0x10+(cSetTime[TimeCount]%10);
  }

       NOP;
        HT1381_OUTPORT |=Timer_Rest;                                                                                 //Timer_Rest=1;
       Timer_Out_Byte(0XBE);                            //Write,Burst Mode
        Timer_Out_Byte(SetSec&0x7F);                   //OSC enable forsure.                       
       Timer_Out_Byte(SetMin);
        Timer_Out_Byte(SetHour&0x7F);                  //24 Hour Mode
       Timer_Out_Byte(SetDate);
       Timer_Out_Byte(SetMonth);
       Timer_Out_Byte(0x00);
       Timer_Out_Byte(SetYear);
       Timer_Out_Byte(0x00);
        NOP;
        HT1381_OUTPORT&=~Timer_Rest;   //Timer_Rest=0;

       NOP;
        HT1381_OUTPORT |=Timer_Rest;         //Timer_Rest=1;
       Timer_Out_Byte(0x8E);                            //Write,Single Mode
       Timer_Out_Byte(0x80);                            //Write, Protect Byte=0, enable protect
        NOP;
        HT1381_OUTPORT&=~Timer_Rest;   //Timer_Rest=0;

}


void Timer_Out_Byte(uchar OutByte)
{
        uchar Timer_Count;
        for(Timer_Count=0;Timer_Count<8;Timer_Count++)
               {
                  HT1381_DIRPORT |=Timer_SDA;                               //output
                  if ((OutByte & 0x01) == 0)
                          HT1381_OUTPORT&=~Timer_SDA;       
                            else
                                     HT1381_OUTPORT |=Timer_SDA;               
                  NOP;
                            HT1381_OUTPORT |=Timer_SCL;               
                               NOP;
                            HT1381_OUTPORT&=~Timer_SCL;         //Timer_SCL=0;
                            OutByte = OutByte >> 1;
        }
}


uchar Timer_In_Byte(void)
{
        ucharInByte,Timer_Count;

       InByte=0x00;
        HT1381_DIRPORT&=~Timer_SDA;                       //Timer_SDA=1;//input

        for(Timer_Count=0;Timer_Count<8;Timer_Count++)
               {
                 InByte >>= 1;
                         NOP;
                    HT1381_OUTPORT |=Timer_SCL;               
                   if(HT1381_INPORT&Timer_SDA)
                  InByte |= 0x80;
                   else
                  InByte &= 0x7F;
    
                        NOP;
                   HT1381_OUTPORT&=~Timer_SCL;         //Timer_SCL=0;
        }

       return(InByte);
}
#define NOP _NOP();_NOP()

#define    NowSec    cNowTime[0]                 
#define     NowMin    cNowTime[1]
#define     NowHour   cNowTime[2]
#define     NowDate   cNowTime[3]
#define     NowMonth  cNowTime[4]
#define     NowYear   cNowTime[5]

#define    SetSec    cSetTime[0]                 
#define     SetMin    cSetTime[1]
#define     SetHour   cSetTime[2]
#define     SetDate   cSetTime[3]
#define     SetMonth  cSetTime[4]
#define     SetYear   cSetTime[5]

uchar Temp_Count;
uchar cSetTime[6];     
uchar cNowTime[6];

void  Timer_Out_Byte(ucharOutByte);
uchar Timer_In_Byte(void);

void ReadRealtime(void)
{
        NOP;
        HT1381_OUTPORT&=~Timer_SCL;         //Timer_SCL=0;
        NOP;
        HT1381_OUTPORT |=Timer_Rest;         //Timer_Rest=1;

       Timer_Out_Byte(0xBF);                            //Read, Burst Mode

       for(TimeCount=0;TimeCount<6;TimeCount++)
               {
                 if  (TimeCount==5)
                  Timer_In_Byte();               //dummy read.
                 cNowTime[TimeCount]=Timer_In_Byte();
                //change BCD to uchar
                cNowTime[TimeCount]=(cNowTime[TimeCount]/0x10)*10+(cNowTime[TimeCount]%0x10);
               }
        NOP;
        HT1381_OUTPORT&=~Timer_Rest;   //Timer_Rest=0;
}

void WriteRealtime(void)
{
        NOP;
        HT1381_OUTPORT&=~Timer_Rest;       //Timer_Rest=0; //for sure to close rest.
        NOP;
        HT1381_OUTPORT&=~Timer_SCL;         //Timer_SCL=0;
        NOP;
        HT1381_OUTPORT |=Timer_Rest;         //Timer_Rest=1;
       Timer_Out_Byte(0x8E);                            //Write,Single Mode
       Timer_Out_Byte(0x00);                            //Write, Protect Byte=0, Disable protect
        NOP;
        HT1381_OUTPORT&=~Timer_Rest;   //Timer_Rest=0;

       
        NOP;
        HT1381_OUTPORT |=Timer_Rest;         //Timer_Rest=1;
       Timer_Out_Byte(0x80);                            //Write,Single Mode
       Timer_Out_Byte(0x00);                            //Write, OSC enalbe, old second distroied
        NOP;
        HT1381_OUTPORT&=~Timer_Rest;   //Timer_Rest=0;

       for(TimeCount=0;TimeCount<6;TimeCount++)
  {
           //change uchar to BCD
           cSetTime[TimeCount]=(cSetTime[TimeCount]/10)*0x10+(cSetTime[TimeCount]%10);
  }

       NOP;
        HT1381_OUTPORT |=Timer_Rest;                                                                                 //Timer_Rest=1;
       Timer_Out_Byte(0XBE);                            //Write,Burst Mode
        Timer_Out_Byte(SetSec&0x7F);                   //OSC enable forsure.                       
       Timer_Out_Byte(SetMin);
        Timer_Out_Byte(SetHour&0x7F);                  //24 Hour Mode
       Timer_Out_Byte(SetDate);
       Timer_Out_Byte(SetMonth);
       Timer_Out_Byte(0x00);
       Timer_Out_Byte(SetYear);
       Timer_Out_Byte(0x00);
        NOP;
        HT1381_OUTPORT&=~Timer_Rest;   //Timer_Rest=0;

       NOP;
        HT1381_OUTPORT |=Timer_Rest;         //Timer_Rest=1;
       Timer_Out_Byte(0x8E);                            //Write,Single Mode
       Timer_Out_Byte(0x80);                            //Write, Protect Byte=0, enable protect
        NOP;
        HT1381_OUTPORT&=~Timer_Rest;   //Timer_Rest=0;

}


void Timer_Out_Byte(uchar OutByte)
{
        uchar Timer_Count;
        for(Timer_Count=0;Timer_Count<8;Timer_Count++)
               {
                  HT1381_DIRPORT |=Timer_SDA;                               //output
                  if ((OutByte & 0x01) == 0)
                          HT1381_OUTPORT&=~Timer_SDA;       
                            else
                                     HT1381_OUTPORT |=Timer_SDA;               
                  NOP;
                            HT1381_OUTPORT |=Timer_SCL;               
                               NOP;
                            HT1381_OUTPORT&=~Timer_SCL;         //Timer_SCL=0;
                            OutByte = OutByte >> 1;
        }
}


uchar Timer_In_Byte(void)
{
        ucharInByte,Timer_Count;

       InByte=0x00;
        HT1381_DIRPORT&=~Timer_SDA;                       //Timer_SDA=1;//input

        for(Timer_Count=0;Timer_Count<8;Timer_Count++)
               {
                 InByte >>= 1;
                         NOP;
                    HT1381_OUTPORT |=Timer_SCL;               
                   if(HT1381_INPORT&Timer_SDA)
                  InByte |= 0x80;
                   else
                  InByte &= 0x7F;
    
                        NOP;
                   HT1381_OUTPORT&=~Timer_SCL;         //Timer_SCL=0;
        }

       return(InByte);
}

深圳市立业微电子有限公司    地址:深圳市宝安区西乡前进二路桃源居三区1栋3楼    邮编:518001
电话:0755-27452985(非上班时间所有电话关机)    传真:0755-27451955