最近在做用msp430f149做一个频率计,不能正确显示,各位大手帮下忙

2019-07-17 15:56发布

网上找的代码,经过自己修改还是不能显示频率
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
isseed
1楼-- · 2019-07-18 10:46
楼主使用串口输出数据,看看数据是否正确。
pmp
2楼-- · 2019-07-18 16:44
是频率的计算有问题吗
pmp
3楼-- · 2019-07-18 20:55
显示不正确,则是LCD写入有问题。
18380593018
4楼-- · 2019-07-18 21:04
dirtwillfly 发表于 2017-5-2 16:12
估计是1602的驱动不正确,或者背光电压不合适。
建议单独调试1602的显示,调试没问题再和其他部分的程序一 ...

1602液晶屏是好的,单独调试测试代码能正常显示
18380593018
5楼-- · 2019-07-18 22:45
 精彩回答 2  元偷偷看……
18380593018
6楼-- · 2019-07-19 02:49
#include <msp430x14x.h>
#include "Config.h"

unsigned long int period=0;//信号周期
unsigned char TA_ov_num=0;//定时器计数溢出次数
unsigned int old_cap=0;//捕获的旧值


//*************************************************************************
//                        初始化IO口子程序
//*************************************************************************
void Port_init()
{

        P4SEL = 0x00;
        P4DIR = 0xFF;                   //数据口输出模式
        P5SEL = 0x00;
        P5DIR|= BIT5 + BIT6 + BIT7;     //控制口设置为输出模式
}

//***********************************************************************
//        显示屏命令写入函数
//***********************************************************************
void LCD_write_com(unsigned char com)
{       
        RS_CLR;
        RW_CLR;
        EN_SET;
        DataPort = com;                 //命令写入端口
        delay_ms(5);
        EN_CLR;
}

//***********************************************************************
//        显示屏数据写入函数
//***********************************************************************
void LCD_write_data(unsigned char data)
{
        RS_SET;
        RW_CLR;
        EN_SET;
        DataPort = data;                //数据写入端口
        delay_ms(5);
        EN_CLR;
}

//***********************************************************************
//        显示屏清空显示
//***********************************************************************
void LCD_clear(void)
{
        LCD_write_com(0x01);            //清屏幕显示
        delay_ms(5);
}

//***********************************************************************
//        显示屏字符串写入函数
//***********************************************************************
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
{
       
    if (y == 0)
    {
            LCD_write_com(0x80 + x);        //第一行显示
    }
    else
    {
            LCD_write_com(0xC0 + x);        //第二行显示
    }
   
    while (*s)
    {
            LCD_write_data( *s);
            s ++;
    }
}

//***********************************************************************
//        显示屏单字符写入函数
//***********************************************************************
void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)
{
       
    if (y == 0)
    {
            LCD_write_com(0x80 + x);        //第一行显示
    }
    else
    {
            LCD_write_com(0xC0 + x);        //第二行显示
    }
   
    LCD_write_data( data);  
}

//***********************************************************************
//        显示屏初始化函数
//***********************************************************************
void LCD_init(void)
{
    LCD_write_com(0x38);                //显示模式设置  
    delay_ms(5);
    LCD_write_com(0x08);                //显示关闭
    delay_ms(5);
    LCD_write_com(0x01);                //显示清屏
    delay_ms(5);
    LCD_write_com(0x06);                //显示光标移动设置
    delay_ms(5);
    LCD_write_com(0x0C);                //显示开及光标设置
    delay_ms(5);
}

/*****系统时钟配置****/
void init_MCLK()
{  
  WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗

  BCSCTL1&=~ XT2OFF;                //msp430f149 选择XT2频率,一般为8MHz
  
    while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?
   BCSCTL2 |= (SELM_2 + DIVM_0 + SELS+DIVS_0);      // SMCK=MCLK=8MHz
}
/*********/

/****捕获方式设置****/
void cap_init()
{
   P1SEL|=0X02;
  P1DIR |= 0x08;                            // P1.2 and P1.3 output
  CCTL0|=CM_1+SCS+CAP+CCIE;
  TACTL|= TASSEL_2 + MC_2+TAIE;                  // SMCLK, up-down mode
   _EINT();
while(1);
}
#pragma vector=TIMERA1_VECTOR//捕获中断子程序
__interrupt void TimerA1(void)
{
if(TACCTL0&CM1)
{P1OUT&=~0X08;
TACCTL0|=CM_1+SCS+CAP+CCIE;
}
else if(TACCTL0&CM0)
{P1OUT|=0X08;
TACCTL0=CM_2+SCS+CAP+CCIE;
}
}

/****频率计算及显示****/
void display_freq()
{
  uchar lcdbuf[8];
  unsigned long temp;
  temp=period;
   if(temp>1000)//表示频率小于1KHz
   {
     temp=1000000/temp;//定时器的计数时钟为1MHz,且以Hz为单位只显示整数部分
     lcdbuf[0]=temp/100+0x30;
     lcdbuf[1]=(temp%100)/10+0x30;
     lcdbuf[2]=temp%10+0x30;
     lcdbuf[3]='H';
     lcdbuf[4]='z';
     lcdbuf[5]=' ';
     lcdbuf[6]=' ';
     lcdbuf[7]=' ';
     if(lcdbuf[0]==0x30)
     {
        if(lcdbuf[1]==0x30)
           LCD_write_str(5,2,&lcdbuf[2]);
         else
           LCD_write_str(5,2,&lcdbuf[1]);
           
        }
       else
      
         LCD_write_str(5,2,&lcdbuf[0]);        
     }
  else//表示频率大于1KHz
   {
     temp=10000/temp;//定时器的计数时钟为1MHz,以KHz为单位显示,且显示2位小数
                         //1000/period再扩大10倍以显示小数
     lcdbuf[0]=temp/1000+0x30;
     lcdbuf[1]=(temp%1000)/100+0x30;
     lcdbuf[2]=(temp%1000)%100/10+0x30;  
     lcdbuf[3]='.';      
     lcdbuf[4]=(temp%1000)%10+0x30;;
     lcdbuf[5]='K';
     lcdbuf[6]='H';
     lcdbuf[7]='z';
      if(lcdbuf[0]==0x30)
     {
         if(lcdbuf[1]==0x30)
         {
           LCD_write_str(5,2,&lcdbuf[2]);
           LCD_write_str(11,2,"  ");
         }
         else
          {
           LCD_write_str(5,2,&lcdbuf[1]);
           LCD_write_str(12,2," ");
          }
      }
     else
     LCD_write_str(5,2,&lcdbuf[0]);
     
   }
}


//***********************************************************************
//      主程序
//***********************************************************************
void main(void)
{
    volatile unsigned int i;

   init_MCLK();//初始化系统时钟
   for (i=0; i<20000; i++);                 // 延时等待晶振稳定
  
  cap_init();//捕获初始化
  _EINT();                 // 开总中断
  LCD_init();//液晶初始化
  

  LCD_write_str(0,1,"freq:");//从第一行第0列开始显示
while(1)
{
   display_freq();//脉宽计算及显示
}   
}

一周热门 更多>