新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MSP430與PCF8576驅動程序(可以借鑒IIC的使用方法)

        MSP430與PCF8576驅動程序(可以借鑒IIC的使用方法)

        作者: 時間:2016-11-13 來源:網絡 收藏
        #i nclude "msp430x14x.h"
        #define uint unsigned int
        #define uchar unsigned char
        #define Num_of_Results 8
        unsigned int results[Num_of_Results];
        uchar PCF8576=0x70;//器件地址
        //內存數據定義
        uchar ByteCnt; //I2C 數據字節計數器
        uchar SlvAdr; //被控器地址
        uchar SubAdr; //被控器單元地址
        uchar XmtDat[5]; //發送數據緩沖區
        uchar MODE2=0xCD;
        uchar Bank_sel=0x78;
        uchar flag;
        uchar Digit[10];
        uint tmp_data;
        uchar n=0;
        uchar i;
        uint j;
        uchar k;
        uchar tmp[5];
        #define SDA BIT6 // P2.3 controls SDA line (pull-up used for logic 1)
        #define SCL BIT7 // P2.4 controls SCL line (pull-up used for logic 1)
        /******************************************************************************
        ; 子程序
        ;名稱:START
        ;描述:啟動I2C 總線子程序--發送I2C 起始條件
        ;;*****************************************************************************/
        void START(void)
        {
        P2OUT |= SDA; //SDA=1
        _NOP();
        P2OUT |= SCL; //SCL=1
        _NOP();
        P2OUT &= ~SDA; //SDA=0
        _NOP();
        P2OUT &= ~SCL; //SCL=0
        }
        /*--------------------------------------------------------------------------
        ;名稱:STOP
        ;描述:停止I2C 總線子程序--發送I2C 總線停止條件
        ;-------------------------------------------------------------------------*/
        void STOP(void)
        {
        P2OUT &= ~SDA; //SDA=0
        _NOP();
        P2OUT |= SCL;
        _NOP();
        P2OUT |= SDA;
        _NOP();
        P2OUT &= ~SCL;
        }
        void cack(void) /* 應答位檢查 */
        {
        P2OUT |= SDA;
        P2OUT |= SCL;
        P2DIR &= ~SDA;
        _NOP();
        P2OUT &= ~SCL;
        P2DIR |= SDA;
        }
        void delay(uchar time)
        {
        uchar i;
        do{
        for(i=100;i!=0;i--);
        } while(--time!=0);
        }
        /*----------------------------------------------------------------------
        ;名稱:SendByte
        ;描述:字節數據傳送子程序發送一個字節數據或地址給被控器PCF8576
        ;要發送的數據在ACC 中
        ;發送數據正常返回標志F0=0 F0=1 表示被控器無應答或損壞
        ;------------------------------------------------------------------------*/
        void SendByte(uchar Data)
        {
        uchar i=8;
        do
        {
        if((Data&0x80)==0x80)
        P2OUT |= SDA;
        else
        P2OUT &= ~SDA;

        P2OUT |= SCL;
        _NOP ();
        P2OUT &= ~SCL;
        Data=Data<<1;
        } while(--i!=0);
        cack();
        }
        /***********************************************************
        ;發送數據程序
        ;名稱:SendData
        ;描述:發送ByteCnt 個字節給被控器PCF8576
        ;被控器地址在SlvAdr 中單元地址在SubAdr 中
        ;所發送數據的字節數ByteCnt 在中發送的數據在XmtDat 緩沖區中
        ;發送數據正常返回標志F0=0 F0=1 表示被控器無應答或損壞
        ;**********************************************************/
        void Display_Data(void)
        {
        uchar i=0;
        uchar size=ByteCnt;
        START(); //發送I2C 總線起始條件
        SendByte(SlvAdr); //發送被控器總線地址
        SendByte(SubAdr); //發送單元地址
        // SendByte(0x73); //閃爍方式為正常,閃爍頻率為0.5Hz 的命令字送緩沖區首址,
        //如果不需要閃爍應將數#70H 送入緩沖區首址
        SendByte(0x70); //不閃爍
        do
        {
        SendByte(XmtDat); //發送數據
        i++;
        } while(--size!=0);

        STOP();
        delay(100);
        }
        void ClearLcd(void)
        {
        uchar size=ByteCnt;
        START(); //啟動I2C 總線
        SendByte(SlvAdr); //送器件地址
        SendByte(SubAdr); //發送單元地址
        SendByte(0x70);
        do
        {
        SendByte(0x00); //發送數據
        } while(--size!=0);
        STOP();
        delay(200);
        }
        void PCF8576SET(void)
        {
        START();
        SendByte(SlvAdr); //送器件地址
        SendByte(MODE2); //取方式命令字
        SendByte(Bank_sel);
        STOP();
        }
        /**********************************************************
        ;ad初始化
        *********************************************************/
        void AD_Init(void)
        {
        P6SEL |= 0X01; //設置P6.0為模擬輸入通道

        ADC12CTL0 &= ~(ENC); //設置ENC為0,從而修改ADC12寄存器的值
        ADC12CTL0=ADC12ON+SHT0_1+REF2_5V+REFON;
        //AD內核打開+采樣保持時間系數(2)+選擇內部參考電壓+打開內部參考電壓發生器
        ADC12CTL1=SHP+CONSEQ_2+SHS_1;
        //采樣觸發源來自采樣定時器,由采樣輸入信號(ADC12CLK)的上升沿觸發采樣定時器
        //+單通道多次采樣+采樣觸發源Time_A的輸出單元out1輸出的信號(由ccr1定時器產生)
        ADC12MCTL0=INCH_0+SREF_1;
        // 選擇AD通道0+正參考電壓=Vref,負參考電壓源AVss;
        ADC12IE=0x0001; //開中斷允許-ADC12IFG.0;
        TACCR0=1500;
        TACCTL0|=CCIE; //TA 為比較模式(TA和CCRO比較),TA中斷允許

        TACTL=TASSEL_1|MC_1; //TACLK=ACLK,定時器A為增計數模
        _BIS_SR(LPM3_bits+GIE); //進入LPM3模式,開中斷允許,等待延時時間結束

        TACCTL0&=~CCIE;

        P2SEL|=BIT3; //設P2.3為Time_A out1 輸出功能
        P2DIR|=0x08; // 設P2.3為輸出
        TACCR0=7; //初始化TACCR0,采樣時鐘源周期=CCR0J+1;

        TACCR1=4;// TACCR1, TimerA,out1 ADc12

        TACCTL1=OUTMOD_3;//CCR1 OUT1

        TACTL=TACLR|MC_1|TASSEL_1;// 定時器時鐘=ACLK,清除TA,增計數模式
        }
        /****************************************************************************
        ;Time_A0 CCR0中斷服務程序
        ***************************************************************************/
        #pragma vector=TIMERA0_VECTOR
        __interrupt void ta0_isr(void)
        {
        TACTL=0;
        LPM3_EXIT;
        }
        /*****************************************************************************
        ;ADC12中斷服務程序
        ***************************************************************************
        #pragma vector=ADC_VECTOR
        __interrupt void ADC12ISR(void)
        {
        static unsigned int index=0; //靜態變量 

        results[index]=ADC12MEM0; //移動ADC結果去往results數組
        }
        */
        /***********************************************************
        主程序
        ***********************************************************/
        void main(void)
        {
        P2DIR |= SDA; //SDA輸出
        P2DIR |= SCL; //SCL輸出
        P2OUT &= ~SDA; //SDA=0
        P2OUT &= ~SCL; //SCL=0
        P2DIR |=BIT1;
        P2OUT |=BIT1;
        WDTCTL = WDTPW+WDTHOLD;
        Digit[0]=0xFC; //0
        Digit[1]=0x60; //1
        Digit[2]=0xDA; //2
        Digit[3]=0xF2; //3
        Digit[4]=0x66; //4
        Digit[5]=0xB6; //5
        Digit[6]=0xBE; //6
        Digit[7]=0xE0; //7
        Digit[8]=0xFE; //8
        Digit[9]=0xF6; //9
        SubAdr=0x80; //數據起始地址(總線地址)
        SlvAdr=PCF8576;//總線從地址
        ByteCnt=5; //位設置
        PCF8576SET();//設置方式
        AD_Init();
        ADC12CTL0|=ENC;//使能轉換
        //ADC12CTL0|=ADC12SC;
        ClearLcd(); //清空
        }
        //----------------------------------
        #pragma vector=ADC_VECTOR
        __interrupt void ADC12ISR(void)
        {
        static unsigned int index=0;
        results[index]=ADC12MEM0;

        tmp_data=results[index];
        for(i=0;i {
        k=tmp_data%10;
        tmp_data=tmp_data/10;

        XmtDat=Digit[k];
        tmp=k;
        }
        for(i=ByteCnt-1;i!=0;i--)
        {

        if(tmp==0)
        XmtDat=0x00;
        else
        break;
        }
        XmtDat[4] |=0x40;
        Display_Data();
        index=(index+1)%Num_of_Results;
        }
        /*ADC12CTL1 |= CSTARTADD_0; //轉換的起始地址為:ADCMEM0
        ADC12MCTL0 = INCH_0 + EOS; //設置參考電壓分別為AVSS和AVCC,輸入通道為A0

        ADC12CTL0 |= ADC12ON;
        ADC12CTL0 |= MSC;


        ADC12CTL1 |= CONSEQ_1; //轉換模式為:多通道、單次轉換

        ADC12CTL1 |= ADC12SSEL_1; //SMCLK
        ADC12CTL1 |= ADC12DIV_0; //時鐘分頻為1
        ADC12CTL1 |= (SHP); //采樣脈沖由采用定時器產生

        ADC12CTL0 |= ENC; //使能ADC轉換
        return;
        }
        void Init_TimerA(void)
        {
        TACTL = TASSEL1 + TACLR; // 選擇SMCLK,清除TAR
        TACTL += ID1;
        TACTL += ID0; // 1/8 SMCLK
        CCTL0 = CCIE; // CCR0 中斷允許
        CCR0 = 4000; // 時間間隔為 250Hz
        TACTL |= MC0; // 增記數模式

        return;
        }
        void main(void)
        {
        uint out_data;
        uint tmp_data;
        uchar i;
        uchar k;
        uchar tmp[5];
        P2DIR |= SDA; //SDA
        P2DIR |= SCL; //SCL
        P2OUT &= ~SDA;
        P2OUT &= ~SCL;
        WDTCTL = WDTPW+WDTHOLD;
        Digit[0]=0x7E; //0
        Digit[1]=0x18; //1
        Digit[2]=0xB6; //2
        Digit[3]=0xBC; //3
        Digit[4]=0xD8; //4
        Digit[5]=0xEC; //5
        Digit[6]=0xEE; //6
        Digit[7]=0x38; //7
        Digit[8]=0xFE; //8
        Digit[9]=0xFC; //9
        SubAdr=0x80;
        SlvAdr=PCF8576;
        ByteCnt=4;
        PCF8576SET();
        ClearLcd();
        AD_Init();
        TIME_Init();
        out_data=0;
        while(1)
        {
        tmp_data=out_data;
        for(i=0;i {
        k=tmp_data%10;
        tmp_data=tmp_data/10;

        XmtDat=Digit[k];
        tmp=k;
        }
        XmtDat[2] |= 0x01;
        for(i=ByteCnt-1;i!=0;i--)
        {
        if( tmp == 0 )
        XmtDat=0x00;
        else
        break;
        }
        Display_Data();
        out_data++;
        }
        }*/



        關鍵詞: MSP430PCF8576II

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 盐亭县| 湘潭市| 蒙城县| 陆河县| 汝州市| 曲阜市| 海林市| 阳山县| 云南省| 曲周县| 林西县| 苏尼特左旗| 丰顺县| 宜昌市| 南召县| 枞阳县| 万年县| 江油市| 金华市| 朝阳区| 体育| 英德市| 天长市| 凤山市| 靖安县| 广平县| 安乡县| 延吉市| 敦煌市| 东明县| 台中县| 洪泽县| 内乡县| 保亭| 泰顺县| 遂昌县| 闵行区| 黄山市| 克山县| 淄博市| 双鸭山市|