分享MSP430F149配合PCF8576CT做AD轉換液晶顯示--程序 這只是實驗程序,盡供參考! //MSP430F149與液晶驅動芯片PCF8576CT的連接程序 #include "msp430x14x.h" #define uint unsigned int #define uchar unsigned char unsigned int A[8]; uchar PCF8576=0x70;//器件地址 //內存數(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; float d_data; float v_data; float vcc; uchar n=0; uchar i; uint j; uchar k; uchar tmp[5]; #define SDA BIT3 // P2.3 controls SDA line (pull-up used for logic 1) #define SCL BIT4 // 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; } /*---------------------------------------------------------------------- ; 子程序 ;名稱:cack ;描述:應答位檢查 ;---------------------------------------------------------------------*/ void cack(void) /* 應答位檢查 */ { P2OUT |= SDA; P2OUT |= SCL; P2DIR &= ~SDA; _NOP(); P2OUT &= ~SCL; P2DIR |= SDA; } /*---------------------------------------------------------------------- ; 子程序 ;名稱:delay ;描述:延遲 ;---------------------------------------------------------------------*/ 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ù)程序 ;名稱:Display_Data ;描述:發(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ā)送被控器總線地址(數(shù)據(jù)起始地址) SendByte(SubAdr); //發(fā)送單元地址(從地址) // SendByte(0x73); //閃爍方式為正常,閃爍頻率為0.5Hz 的命令字送緩沖區(qū)首址, //如果不需要閃爍應將數(shù)#70H 送入緩沖區(qū)首址 SendByte(0x70); //不閃爍 do { SendByte(XmtDat); //發(fā)送數(shù)據(jù) i++; } while(--size!=0); STOP(); //停止I2C 總線 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(); //停止I2C 總線 delay(100); //延遲 } /*********************************************************** 發(fā)送方式命令字 ***********************************************************/ void PCF8576SET(void) { START(); //發(fā)送I2C 總線起始條件 SendByte(SlvAdr); //送器件地址 SendByte(MODE2); //取方式命令字 SendByte(Bank_sel); STOP(); //停止I2C 總線 } /*********************************************************** 主程序 ***********************************************************/ void main(void) { P2DIR |= SDA; //SDA輸出 P2DIR |= SCL; //SCL輸出 P2OUT &= ~SDA; //SDA=0 P2OUT &= ~SCL; //SCL=0 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; //位設置 PCF8576SET();//設置方式 ClearLcd(); //清空 //**************AD轉換^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ P6SEL|=0x01; //使能A/D通道A0(P6.0) ADC12CTL0=ADC12ON+SHT0_2+MSC+REFON+REF2_5V; //打開ADC12、8倍ADC12CLK、多次轉換 ADC12CTL1=SHP+CONSEQ_2; //多次采樣、單通道多次轉換模式 ADC12MCTL0=0x10; //參考電壓Vref+、AVss ADC12IE=0x01; //使能中斷ADC12IFG.0 ADC12CTL0|=ENC; //使能轉換 _EINT(); //中斷允許 ADC12CTL0|=ADC12SC; //開始轉換 _BIS_SR(LPM0_bits); //進入低功耗LPM0模式 } //---------------------------------- #pragma vector=ADC_VECTOR __interrupt void ADC12ISR (void)//ADC中斷處理程序 { A[n]=ADC12MEM0; n++; if(n==8) { d_data=(A[0]+A[1]+A[2]+A[3]+A[4]+A[5]+A[6]+A[7])/8; n=0; vcc=2627; v_data=vcc/4095;
tmp_data=v_data*d_data; for(i=0;i<ByteCnt;i++) //數(shù)據(jù)的每一位送到相應的緩存位 { k=tmp_data%10; tmp_data=tmp_data/10; XmtDat=Digit[k]; tmp=k; } for(i=ByteCnt-1;i!=0;i--) //數(shù)值為0時不顯示(減少功耗) { if( tmp == 0 ) XmtDat=0x00; else break; } XmtDat[4] |= 0x40; Display_Data(); } } |