分享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();
}
}