MSP430与PCF8576驱动程序(可以借鉴IIC的使用方法)

发布者:陈熙琼最新更新时间:2016-08-15 来源: eefocus关键字:MSP430  PCF8576  IIC 手机看文章 扫描二维码
随时随地手机看文章
 
#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;//器件地址
//内存数据定义
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;
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 总线子程序--发送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;
}
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
;描述:字节数据传送子程序发送一个字节数据或地址给被控器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();
}
/***********************************************************
;发送数据程序
;名称:SendData
;描述:发送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();
delay(100); 
}
void ClearLcd(void)
{
uchar size=ByteCnt;
START(); //启动I2C 总线
SendByte(SlvAdr); //送器件地址
SendByte(SubAdr); //发送单元地址
SendByte(0x70);
do
{
  SendByte(0x00); //发送数据
} 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;                //设置P6.0为模拟输入通道
    
    ADC12CTL0 &= ~(ENC);          //设置ENC为0,从而修改ADC12寄存器的值
    ADC12CTL0=ADC12ON+SHT0_1+REF2_5V+REFON;
    //AD内核打开+采样保持时间系数(2)+选择内部参考电压+打开内部参考电压发生器
    ADC12CTL1=SHP+CONSEQ_2+SHS_1;
    //采样触发源来自采样定时器,由采样输入信号(ADC12CLK)的上升沿触发采样定时器
    //+单通道多次采样+采样触发源Time_A的输出单元out1输出的信号(由ccr1定时器产生)
    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为增计数模式
    _BIS_SR(LPM3_bits+GIE); //进入LPM3模式,开中断允许,等待延时时间结束
    
    TACCTL0&=~CCIE;
    
    P2SEL|=BIT3; //设P2.3为Time_A out1 输出功能
    P2DIR|=0x08; // 设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,增计数模式
}
/****************************************************************************
;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; //静态变量 
  
results[index]=ADC12MEM0; //移动ADC结果去往results数组
}
  */
  /***********************************************************
主程序
***********************************************************/
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;  //数据起始地址(总线地址)
SlvAdr=PCF8576;//总线从地址
ByteCnt=5;  //位设置
PCF8576SET();//设置方式
AD_Init();
ADC12CTL0|=ENC;//使能转换
//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;        //转换的起始地址为:ADCMEM0
    ADC12MCTL0 = INCH_0 + EOS;    //设置参考电压分别为AVSS和AVCC,输入通道为A0
            
    ADC12CTL0 |= ADC12ON;
    ADC12CTL0 |= MSC;
    
    
    ADC12CTL1 |= CONSEQ_1;        //转换模式为:多通道、单次转换
    
    ADC12CTL1 |= ADC12SSEL_1;        //SMCLK
    ADC12CTL1 |= ADC12DIV_0;        //时钟分频为1
    ADC12CTL1 |= (SHP);              //采样脉冲由采用定时器产生
                
    ADC12CTL0 |= ENC;              //使能ADC转换
    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;              // 增记数模式
    
    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++;
}
}*/

关键字:MSP430  PCF8576  IIC 引用地址:MSP430与PCF8576驱动程序(可以借鉴IIC的使用方法)

上一篇:msp430F5438+CC2520通信
下一篇:MSP430功能模块详解系列之——FLASH存储器

推荐阅读最新更新时间:2024-03-16 15:05

基于MSP430F413与贴片电阻的智能遥控器
  引言   目前市场上常见的无线遥控器多数为四键和十二键,主要用于汽车防盗系统、家庭防盗系统及遥控玩具等方面,这些应用简单、实用、成本低。但对于一些工程中需要距离在100米以上,控制或设定一些数据时,并要求一个遥控器对多于12个甚至上百个设备时,上述遥控器对操作人员就不方便,而且系统性能不够稳定。鉴于上述情况我们便提出在此基础上,采用单片机编写地址,通过操作键设置,液晶显示遥控器的输出。同时对耗电量、多个控制的设定、便于携带、操作方便及性能稳定等要求,设计开发出一种新型智能遥控器。该型遥控器以TI公司的超低功耗单片机MSP430F413为微处理器,配有低功耗3位液晶显示器EDS812A,整个系统采用锂电池和高能氧化银电池作为供
[单片机]
基于<font color='red'>MSP430</font>F413与贴片电阻的智能遥控器
用Proteus学习51单片机之I2C(IIC)总线
在学习单片机的过程中,我常有这样的烦恼:随随便便一个芯片,少则占用三五个IO口,一般的就占用8个,稍微想用多一点芯片吧,老觉得IO口不够用。学串口的时候觉得串口是个好东西,连两条线就够了,现在学到I2C,觉得这也是一个非常好的东西,也是两条线,还能给每个总线上的设备设立地址,简直就是一个小网络了。 I2C总线使用两条线,一条是时钟线,称为SCL,一条是数据线,称为SDA,各个设备就并在总线上,每一个总线上的设备都有一个自己的地址,主机在操作设备的时候,都会先发送一个地址码,告诉被操作机,接下来的命令由它接收。 接下来说一下I2C总线的数据有效性。I2C总线进行数据传送时,要求SCL为高电平时,SDA上的数据必需保持稳定,换言之,当
[单片机]
用Proteus学习51单片机之I2C(<font color='red'>IIC</font>)总线
基于MSP430的智能IC卡水表控制器
  引言   随着IC卡应用的普及,利用IC卡实现“预付费方式”的水费管理成为可能。目前的电子水表按照抄表的方式主要可以分为网络式和分立式。由于在某些场合需要对旧的水表系统改造,如果采用网络式抄表方式需要进行抄表线路的铺设,这给施工带来很大的问题。而分立式的IC卡水表收费系统则无需考虑这一问题,这为管理部门和用户提供了极大的便利。   1 硬件电路设计   本控制器以MSP430单片机为控制核心。MSP430系列单片机是美国TI公司从1996年开始推向市场的一种16位RISC架构、超低功耗的混合信号处理器。电源采用1.8~3.6 V低电压、RAM数据保持方式下耗电仅0.1μA,活动模式下耗电250μA/MIPS,IO口漏电流仅
[单片机]
基于<font color='red'>MSP430</font>的智能IC卡水表控制器
MSP430单片机矩阵键盘测试程序
#include msp430x14x.h unsigned char keybuff ; unsigned char keypoint=0; void delay(int v) { while(v!=0)v--; } unsigned char key(void) { unsigned char x=0xff; P1DIR=0X0F; P1OUT=0X01; //扫描第一行 if((P1IN&0X70)==0X10) x=0; else if((P1IN&0X70)==0X20) x=1; else
[单片机]
一个关于msp430 编译的错误
Error : Undefined external voltage referred in main ( C:UsersAdministratorDesktopmsp430pricticepress KEY to control DACDebugObjmain.r43 ) 关于这种错误, 如果 voltage 是一个外部函数 只需加上函数所在文件的头文件就行 比如: 在ADC.c里面有一个函数 void ADC_Init(); 在主函数中我需要调用这个变量,那么就需要在主函数中加上 #include “ADC.c” 但如果 voltage 是一个外部变量 这需要在 voltage 所在的文件中定义 volta
[单片机]
基于MSP430F149单片机与模糊控制的温控仪设计
0 引言 温度控制对于工业和日常生活等领域都具有广阔的应用前景,很多应用领域,需要精度较高的恒温控制,由于其控制具有非线性、时滞性和不确定性,用传统的控制达不到好的控制效果。模糊控制是一种基于规则的控制,它直接采用语言型控制规则,出发点是现场操作人员的控制经验或相关专家的知识,其鲁棒性强,干扰和参数变化对控制效果的影响被大大减弱,所以特别适合于0~100℃温度的精确控制。 MSP430系列单片机是一个16位的、具有精简指令集的、超低功耗的混合型单片机。MSP430F149单片机采用了精简指令(RISC),具有丰富的寻址方式(7种源操作数寻址、4种目的操作数寻址)、简洁的27条内核指令以及大量的模拟指令,大量的寄存器以及片内数
[单片机]
基于<font color='red'>MSP430</font>F149单片机与模糊控制的温控仪设计
MSP430单片机基本特点
MSP430单片机已经用于各个领域,尤其是仪器仪表、监测、医疗器械以及汽车电子等领域。 下面简单来说一下它的主要特点:(1)低电源电压范围,1.8~3.6V。 (2)超低功耗,拥有5种低功耗模式。 (3)灵活的时钟使用模式。 (4)高速的运算能力,16位RISC架构,125ns指令周期。 (5)丰富的功能模块,这些功能模块包括:A:多通道10-14位AD转换器;B:双路12位DA转换器;C:比较器;D:液晶驱动器;E:电源电压检测;F:串行口USART(UART/SPI);G:硬件乘法器;H:看门狗定时器,多个16位、8位定时器(可进行捕获,比较,PWM输出);I:DMA控制器。 (6)FLASH存储器,不需要额外的高
[单片机]
msp430】学习经验总结| 心得体会
1.MSP430开发环境建立 1.安装IAR dor msp430 软件,软件带USB仿真器的驱动。 2.插入USB仿真器,驱动选择安装目录的/drivers/TIUSBFET 3.建立一个工程,选择 option 选项,设置 a、选择器件,在 General 项的 Target 标签选择目标器件 b、选择输出仿真,在 Linker 项里的 Output 标签,选择输出 Debug information for C-SPY ,以输出调试 信息用于仿真。 c、若选择 Other ,Output下拉框选择 zax-m 即可以输出hex文件用以烧录,注意,此时仿真不了。 d、选择 Debugge
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved