51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > MSP430单片机 > 详细内容
F149+AD+PCF8576CT显示程序
发布时间:2009/7/31  阅读次数:746  字体大小: 【】 【】【
分享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();
  }
}
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号