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