#include <msp430xG43x.h> #include <math.h> //**************************参数**************************** unsigned int lcd1,lcd2,lcd3,lcd4,lcd5,lcd6,lcd7,lcd8,lcd9;//液晶显示各位的中间量 float s; unsigned char Flag2;//捕获 unsigned int Cnt;//计数中断总的次数 unsigned int Cyc=0;//时间差额 unsigned int LastCCR0;//上次计数值 unsigned int Tsum;//总的时间
//**************************LCD段码**************************** #define h 0x80 #define c 0x40 #define g 0x20 #define b 0x10 #define d 0x08 #define e 0x04 #define f 0x02 #define a 0x01 const char char_gen[] = { // 段码数组 a+b+c+d+e+f, // "0" b+c, // "1" a+b+d+e+g, // "2" a+b+c+d+g, // "3" b+c+f+g, // "4" a+c+d+f+g, // "5" a+c+d+e+f+g, // "6" a+b+c, // "7" a+b+c+d+e+f+g, // "8" a+b+c+d+f+g // "9" }; //******************************系统初始化程序************************************************** void SysInit() { unsigned int i; WDTCTL = WDTPW + WDTHOLD; //停止看门狗 FLL_CTL0 |= XCAP18PF; // set load capacitance for 32k xtal FLL_CTL1 = FLL_CTL1 & ~XT2OFF; // clear bit = high freq xtal on
do // loop until flag is clear { FLL_CTL0 = FLL_CTL0 & ~XT2OF; // clear high freq oscillator fault flag for (i = 50000; i; i--); // delay for crystal to start and FLL to lock } while (FLL_CTL0 & XT2OF); // test high freq oscillator fault flag // if flag remained clear then - FLL_CTL1 = SELS; // switch SMCLK = HF xtal } //////////////////////////////////////////////////显示部分///////////////////////////////////////////////// //*************************液晶初始化函数**************************** void LcdInitialize(void) { FLL_CTL0=XCAP14PF; LCDCTL=LCDON+LCD4MUX+LCDP2; //液晶使用4MUX模式,使用S0~S27段 BTCTL=BTFRFQ1; //使用基本定时器提供液晶时钟 P5SEL=0xFF; //选择公共端和Rxx } //************************清第二行************************** // void ClearLine2(void) { int i; for(i=5;i<13;i++) LCDMEM=0; //第二行不显示,同时各位置零 } //************************清第一行************************** void ClearLine1(void) { int i; for(i=0;i<5;i++) LCDMEM=0; //第一行不显示,同时各位置零。 } //************************清单位************************** void ClearUnit(void) { LCDMEM[13]=0; LCDMEM[12]&=~h; }
//********************上下排数据显示函数********************** void DisplayLine (float s) { ClearLine1(); //清空第一行 ClearLine2(); //清空第二行 ClearUnit(); //清空单位 lcd1=s/100000000; //百位 s=s-lcd1*10000000; lcd2=s/10000000; //十位 s=s-lcd2*10000000; lcd3=s/1000000; //个位 s=s-lcd3*1000000; lcd4=s/100000; //小数点后第一位 s=s-lcd4*100000; lcd5=s/10000; //小数点后第二位 s=s-lcd5*10000; lcd6=s/1000; //小数点后第三位 s=s-lcd6*1000; lcd7=s/100; //小数点后第四位 s=s-lcd7*100; lcd8=s/10; //小数点后第五位 s=s-lcd8*10; lcd9=s; //小数点后第六位 //***************************************显示各位***************************** LCDMEM[2]=char_gen[lcd1]; //百位 LCDMEM[3]=char_gen[lcd2]; //十位 LCDMEM[4]=char_gen[lcd3]; //个位 LCDMEM[5]=char_gen[lcd4]; //小数点后第一位 LCDMEM[6]=char_gen[lcd5]; //小数点后第二位 LCDMEM[7]=char_gen[lcd6]; //小数点后第三位 LCDMEM[8]=char_gen[lcd7]; //小数点后第四位 LCDMEM[9]=char_gen[lcd8]; //小数点后第五位 LCDMEM[10]=char_gen[lcd9]; //小数点后第六位
} //*********************TimerA中断函数*********************** #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A1 () { switch(TAIV) { case 2: Cyc=TACCR0-LastCCR0; LastCCR0=TACCR0; Flag2++; break; case 10: Cnt++; break; default: break; } }
//*********************TimerA启动函数*********************** void TimerA_start(void) { TACCTL1 = CM_3 + CCIS_0 + CAP + CCIE; //上下沿,CCI1A,捕获模式,允许中断 TACTL = TASSEL_1 + ID_0 + MC_1 + TACLR ; //辅助时钟,不分频,增计数,清零 TACCR0=79; }
//////////////////////////////////////////////主程序部分/////////////////////////////////////////// //**************************主程序**************************** void main(void) { WDTCTL = WDTPW + WDTHOLD; //停止看门狗 SysInit(); //系统初始化 LcdInitialize(); //液晶初始化 TimerA_start(); //定时器A初始化。 DisplayLine(1000); //显示零 // _EINT(); //全局中断使能 if(Flag2==2) //采样两次时 { Tsum=Cyc/80+Cnt; Flag2=0; cnt=0; } DisplayLine(Tsum); //显示注水时间 LPM1; //低功耗等待 }
|