分享MSP430F149配合PCF8576CT做AD转换液晶显示--程序 这只是实验程序,尽供参考! //MSP430F149与液晶驱动芯片PCF8576CT的连接程序 #include "msp430x14x.h" #define uint unsigned int #define uchar unsigned char unsigned int A[8]; 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; 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 总线子程序--发送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; } /*---------------------------------------------------------------------- ; 子程序 ;名称: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 ;描述:字节数据传送子程序发送一个字节数据或地址给被控器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(); //应答位检查 } /*********************************************************** ;发送数据程序 ;名称:Display_Data ;描述:发送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(); //停止I2C 总线 delay(100); //延迟 } /*********************************************************** ;清除 ***********************************************************/ void ClearLcd(void) { uchar size=ByteCnt; START(); //启动I2C 总线 SendByte(SlvAdr); //送器件地址 SendByte(SubAdr); //发送单元地址 SendByte(0x70); do { SendByte(0x00); //发送数据 } while(--size!=0); STOP(); //停止I2C 总线 delay(100); //延迟 } /*********************************************************** 发送方式命令字 ***********************************************************/ void PCF8576SET(void) { START(); //发送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; //数据起始地址(总线地址) 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++) //数据的每一位送到相应的缓存位 { k=tmp_data%10; tmp_data=tmp_data/10; XmtDat=Digit[k]; tmp=k; } for(i=ByteCnt-1;i!=0;i--) //数值为0时不显示(减少功耗) { if( tmp == 0 ) XmtDat=0x00; else break; } XmtDat[4] |= 0x40; Display_Data(); } } |