用msp430f5529测频率一直不出,能帮忙看看吗?

2019-03-24 08:32发布

#include <msp430f5529.h>
#include <stdint.h>


uint16_t num=10,freq;
#define uint unsigned int

void Display_F(uint F_DISP);//显示频率


void  lcd_init(void);//初始
void  WriteCommandLcd(unsigned char wdata);////向1602液晶写入命令子程序
void  WriteDataLcd(unsigned  char wdata);//向1602液晶写入数据子程序;

uint captar=0,capfirst,caplast,time=0,pulse=0,f;
void main(void)
{
   WDTCTL = WDTPW + WDTHOLD;                      // 关闭看门狗
   lcd_init();
   P1DIR&=~BIT4;
   P1SEL|=BIT4;
   TA1CCTL1=CM_1+SCS+CCIS_0+CAP+CCIE;
   TA1CTL=TASSEL_1+MC_2+TACLR+TAIE;

   //TA1CTL = TASSEL_1 + MC_2 +TACLR; // ACLK, up-down 模式

   P2DIR = 0xff;//设置P2为输出状态
   //P4DIR = 0xff; //设置P4口为输出状态;
   P3DIR = 0xff; //设置P5口为输出状态;
   lcd_init();           //初始化子程序;
   _EINT();
   while(1){
           f=pulse*32768/time;
           f=1000;
           Display_F(f);
           TA1CCTL1 |= CCIE;
           TA1CTL |= TAIE;

   }
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void timer1_A1 (void)
{
         switch(TA1IV){
         case 2:{
         if(captar==0)
         {
                 capfirst=TA1CCR0;
                 captar++;
         }
         else{
                 caplast=TA1CCR0;
                 captar++;
         }
         TA1CCTL1 &=~CCIFG;
         break;
         }
         case 14:{
                 if(captar==0)
                         pulse=0;
                 else{
                         pulse=captar-1;
                         time=caplast-capfirst;
                         captar=0;
                 }
                 //f=pulse*32768/time;
                 //f=f%1000;
                 //Display_F(f);
                 TA1CCTL1&=~CCIE;
                 TA1CTL=~TAIE;
                 break;
         }
         default:break;
    }
}

void  lcd_init(void)
{
    P2DIR = BIT4 + BIT2 + BIT3;//设置P2.4,2.2,2.3为输出状态
           P3DIR = 0xff; //设置P3口为输出状态;
    __delay_cycles(100);
    WriteCommandLcd(0x38);//显示模式设置,设置为16X2显示,5X7点阵,8位数据接口
    __delay_cycles(50);
    WriteCommandLcd(0x01); //显示清屏
    WriteCommandLcd(0x0c); //开显示,关闭光标,当然光标也就不能显示了;(1)
    //WriteCommandLcd(0x0e); //开显示,显示光标,但是光标不闪烁;(2)
    //WriteCommandLcd(0x0f); //开显示,显示光标,光标闪烁;(3)
    //delay(10);
    WriteCommandLcd(0x06); //读写操作时地址自动加1
}

void  WriteCommandLcd(unsigned char wdata)//向1602液晶写入命令子程序;
{

           P2OUT&=~BIT4;//RS清零,代表命令;
           P2OUT&=~BIT2;//RW清零;
           P2OUT&=~BIT3;//使能E清零;
           __delay_cycles(100);//短暂延时,代替检测忙状态
           P2OUT|= BIT3;//使能E置1;
           __delay_cycles(1000); //短暂延时,代替检测忙状态
           P3OUT=wdata;//送出命令或数据


           __delay_cycles(1000);//短暂延时,代替检测忙状态
           P2OUT&=~BIT3;//使能E清零,下降沿将命令或数据送入1602;
}

void  WriteDataLcd(unsigned  char wdata)//向1602液晶写入数据子程序;
{
           P2OUT|= BIT4;//RS置1,代表数据;
           P2OUT&=~BIT2;//RW清零;
           P2OUT&=~BIT3;//使能E清零;
           __delay_cycles(100); //短暂延时,代替检测忙状态
           P2OUT|= BIT3;//使能E置1;
           __delay_cycles(100);//短暂延时,代替检测忙状态
           P3OUT=wdata;//送出命令或数据
           __delay_cycles(100);//短暂延时,代替检测忙状态
           P2OUT&=~BIT3;//使能E清零,下降沿将命令或数据送入1602;
}

void Display_F(uint F_DISP)//显示频率
{
          WriteCommandLcd(0x80);//从第二行第一个位置开始显示数据,第一行第一个位置的地址是80H;

          WriteDataLcd(0x30+F_DISP%10000/1000);//显示千位;
          WriteDataLcd(0x30+F_DISP%1000/100);//显示百位;
          WriteDataLcd(0x30+F_DISP%100/10);//显示十位;
          WriteDataLcd(0x30+F_DISP%10);//显示个位;
          WriteDataLcd(0x56);//显示字符V
          __delay_cycles(1000);
          __delay_cycles(1000);
}

新手不太懂。。帮一下各位大神

此帖出自小平头技术问答
0条回答

一周热门 更多>

相关问题

    相关文章