打印

帮我看程序,主程序到底啥问题

[复制链接]
2674|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wudavid2|  楼主 | 2008-10-9 15:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;                                               //低功耗等待
  }

相关帖子

沙发
wudavid2|  楼主 | 2008-10-9 15:44 | 只看该作者

我要实现长脉冲计时,但框架程序好像除了点错。不知咋进入中断以及如何循环工作。

使用特权

评论回复
板凳
TI_CPIC| | 2008-10-23 15:31 | 只看该作者

Re:

中断前让CPU进入低功耗模式,一旦产生中断CPU被唤醒执行中断程序,可用_BIS_SR(LPM1_bits + GIE);

使用特权

评论回复
地板
wudavid2|  楼主 | 2008-10-24 09:08 | 只看该作者

已搞定

谢谢, #include  <msp430xG43x.h>
#include <math.h>
//**************************参数****************************
unsigned int lcd1,lcd2,lcd3,lcd4,lcd5,lcd6,lcd7,lcd8,lcd9;//液晶显示各位的中间量
unsigned long s;
unsigned long start,end,overflow;
unsigned long T;//总的时间
unsigned long i;
unsigned long DELAY;

//**************************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;       // stop watchdog timer
  FLL_CTL0 |= XCAP14PF;           // 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  
  P1SEL |=BIT2;
  P1DIR |=BIT0+BIT4;
  }





//////////////////////////////////////////////////显示部分/////////////////////////////////////////////////
//*************************液晶初始化函数****************************
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 Display(unsigned  long s)
{
  ClearLine1();                                              //清空第一行
  ClearLine2();                                              //清空第二行
  ClearUnit();                                               //清空单位
  LCDMEM[1]=0;                                               //上排液晶第一位不显示                      
  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 :
         if(CCTL1&CM0)
         {
          CCTL1 &=~CM0;
          CCTL1 |=CM1;
          start=TAR;
          overflow=0;
         }
         else if(CCTL1&CM1)
         {
          CCTL1 &=~CM1;
          CCTL1 |=CM0;
          end=TAR;
          T=(overflow*65536+end-start)/8;
          Display(T);
          }
         break;
  case 10:
           overflow++;
           break;
  default: break;         
  }
 }

  
//////////////////////////////////////////////主程序部分///////////////////////////////////////////
//**************************主程序****************************
void main(void)

   WDTCTL = WDTPW + WDTHOLD;                          //停止看门狗 
   SysInit() ;
   LcdInitialize();                                   //液晶初始化
   TACTL=TASSEL1+TACLR+TAIE+MC1;
   CCTL1=CM0+SCS+CAP+CCIE; 
   _EINT();                                           //全局中断使能 
  while(1) 
   {
     LPM3;
   }
 }



使用特权

评论回复
5
TI_CPIC| | 2008-10-24 15:16 | 只看该作者

Re:恭喜

太好了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

14

帖子

0

粉丝