您的位置 首页 元件

MSP430与PCF8576驱动程序(能够学习IIC的使用方法)

#includemsp430x14x.h#defineuintunsignedint#defineucharunsignedchar#defineNum_of_Results8unsignedintr

#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++;
}
}*/

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/273223.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部