<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時間:2016-11-13 來源:網(wǎng)絡 收藏
          #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;//器件地址
          //內(nèi)存數(shù)據(jù)定義
          uchar ByteCnt; //I2C 數(shù)據(jù)字節(jié)計數(shù)器
          uchar SlvAdr; //被控器地址
          uchar SubAdr; //被控器單元地址
          uchar XmtDat[5]; //發(fā)送數(shù)據(jù)緩沖區(qū)
          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 總線子程序--發(fā)送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 總線子程序--發(fā)送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
          ;描述:字節(jié)數(shù)據(jù)傳送子程序發(fā)送一個字節(jié)數(shù)據(jù)或地址給被控器PCF8576
          ;要發(fā)送的數(shù)據(jù)在ACC 中
          ;發(fā)送數(shù)據(jù)正常返回標志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();
          }
          /***********************************************************
          ;發(fā)送數(shù)據(jù)程序
          ;名稱:SendData
          ;描述:發(fā)送ByteCnt 個字節(jié)給被控器PCF8576
          ;被控器地址在SlvAdr 中單元地址在SubAdr 中
          ;所發(fā)送數(shù)據(jù)的字節(jié)數(shù)ByteCnt 在中發(fā)送的數(shù)據(jù)在XmtDat 緩沖區(qū)中
          ;發(fā)送數(shù)據(jù)正常返回標志F0=0 F0=1 表示被控器無應答或損壞
          ;**********************************************************/
          void Display_Data(void)
          {
          uchar i=0;
          uchar size=ByteCnt;
          START(); //發(fā)送I2C 總線起始條件
          SendByte(SlvAdr); //發(fā)送被控器總線地址
          SendByte(SubAdr); //發(fā)送單元地址
          // SendByte(0x73); //閃爍方式為正常,閃爍頻率為0.5Hz 的命令字送緩沖區(qū)首址,
          //如果不需要閃爍應將數(shù)#70H 送入緩沖區(qū)首址
          SendByte(0x70); //不閃爍
          do
          {
          SendByte(XmtDat); //發(fā)送數(shù)據(jù)
          i++;
          } while(--size!=0);

          STOP();
          delay(100);
          }
          void ClearLcd(void)
          {
          uchar size=ByteCnt;
          START(); //啟動I2C 總線
          SendByte(SlvAdr); //送器件地址
          SendByte(SubAdr); //發(fā)送單元地址
          SendByte(0x70);
          do
          {
          SendByte(0x00); //發(fā)送數(shù)據(jù)
          } 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; //設(shè)置P6.0為模擬輸入通道

          ADC12CTL0 &= ~(ENC); //設(shè)置ENC為0,從而修改ADC12寄存器的值
          ADC12CTL0=ADC12ON+SHT0_1+REF2_5V+REFON;
          //AD內(nèi)核打開+采樣保持時間系數(shù)(2)+選擇內(nèi)部參考電壓+打開內(nèi)部參考電壓發(fā)生器
          ADC12CTL1=SHP+CONSEQ_2+SHS_1;
          //采樣觸發(fā)源來自采樣定時器,由采樣輸入信號(ADC12CLK)的上升沿觸發(fā)采樣定時器
          //+單通道多次采樣+采樣觸發(fā)源Time_A的輸出單元out1輸出的信號(由ccr1定時器產(chǎn)生)
          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為增計數(shù)模
          _BIS_SR(LPM3_bits+GIE); //進入LPM3模式,開中斷允許,等待延時時間結(jié)束

          TACCTL0&=~CCIE;

          P2SEL|=BIT3; //設(shè)P2.3為Time_A out1 輸出功能
          P2DIR|=0x08; // 設(shè)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,增計數(shù)模式
          }
          /****************************************************************************
          ;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; //靜態(tài)變量 

          results[index]=ADC12MEM0; //移動ADC結(jié)果去往results數(shù)組
          }
          */
          /***********************************************************
          主程序
          ***********************************************************/
          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; //數(shù)據(jù)起始地址(總線地址)
          SlvAdr=PCF8576;//總線從地址
          ByteCnt=5; //位設(shè)置
          PCF8576SET();//設(shè)置方式
          AD_Init();
          ADC12CTL0|=ENC;//使能轉(zhuǎn)換
          //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; //轉(zhuǎn)換的起始地址為:ADCMEM0
          ADC12MCTL0 = INCH_0 + EOS; //設(shè)置參考電壓分別為AVSS和AVCC,輸入通道為A0

          ADC12CTL0 |= ADC12ON;
          ADC12CTL0 |= MSC;


          ADC12CTL1 |= CONSEQ_1; //轉(zhuǎn)換模式為:多通道、單次轉(zhuǎn)換

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

          ADC12CTL0 |= ENC; //使能ADC轉(zhuǎn)換
          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; // 增記數(shù)模式

          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++;
          }
          }*/



          關(guān)鍵詞: MSP430PCF8576II

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();