新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MSP430和實(shí)時(shí)時(shí)鐘HT1381的接口程序

        MSP430和實(shí)時(shí)時(shí)鐘HT1381的接口程序

        作者: 時(shí)間:2016-11-13 來(lái)源:網(wǎng)絡(luò) 收藏
        HT1381是臺(tái)灣HT公司的一款串行實(shí)時(shí)時(shí)鐘IC,工作電壓:2.0V~5.5V,最大輸入串行時(shí)鐘500kHz(VDD=2V),2MHz(VDD=5V) ;工作電流:2V時(shí)小于300nA,5V時(shí)小于1mA。串行I/O傳送,二種數(shù)據(jù)傳送方式:?jiǎn)巫止?jié)或多字節(jié)(Burst方式),所有寄存器以BCD碼格式存儲(chǔ)
        具有接口簡(jiǎn)單、功耗低、工作電壓范圍寬、計(jì)時(shí)精確、功能全、成本低等優(yōu)點(diǎn),
        因此在實(shí)際應(yīng)用中被廣泛采用。
        該芯片提供秒、分、時(shí)、日、日期、月和年的信息。
        對(duì)于小于31天的月的月末日期能自動(dòng)進(jìn)行調(diào)整,還包括閏年校正功能。低功耗設(shè)計(jì)且時(shí)鐘的運(yùn)行可以采用24小時(shí)格式或帶AM/PM指示的12小時(shí)的格式。

        以下是接口程序,430測(cè)試頻率為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];

        voidTimer_Out_Byte(uchar OutByte);
        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 for sure.
        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)
        {
        uchar InByte,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];

        voidTimer_Out_Byte(uchar OutByte);
        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 for sure.
        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)
        {
        uchar InByte,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);
        }


        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 牡丹江市| 同仁县| 普兰店市| 永新县| 威远县| 景德镇市| 板桥市| 康乐县| 新晃| 石门县| 黄平县| 高阳县| 西乌| 灵石县| 固阳县| 瑞昌市| 伊春市| 尤溪县| 稷山县| 本溪| 金沙县| 万宁市| 山东省| 沽源县| 易门县| 弋阳县| 新绛县| 鄂州市| 汤原县| 武宣县| 讷河市| 绥江县| 潞城市| 临朐县| 香格里拉县| 牡丹江市| 英德市| 陇西县| 莎车县| 太仆寺旗| 睢宁县|