打印

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

[复制链接]
755|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
18380593018|  楼主 | 2017-5-2 15:35 | 只看该作者
用的1602显示,但液晶屏只显示一排黑纹

使用特权

评论回复
板凳
18380593018|  楼主 | 2017-5-2 15:36 | 只看该作者
上代码:
#include <msp430x14x.h>
#include "LCD1602.c"
#include "delay.c"
#include "delay.h"

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


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

  BCSCTL1&=~ XT2OFF;                //msp430f149 选择XT2频率,一般为8MHz
  do//do这个循环不能删除,否则下载到硬件电路上没法实现测温功能
    {
        IFG1 &= ~OFIFG;                 //清除晶振失败标志
        for (i = 0xFF; i > 0; i--);     //等待8MHz晶体起振
    }
    while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?
   BCSCTL2 |= (SELM_2 + DIVM_0 + SELS+DIVS_0);      // SMCK=MCLK=8MHz
}
/*********/


/****捕获方式设置****/
void cap_init()
{
   P1SEL|=BIT2;                             // 设置 P1.2为第二功能引脚TA1
   P1DIR&=~BIT2;                             // 设置P1.2为输入引脚
   //TACTL=TACLR;   //定时器清零
   TACTL = TASSEL_2 + MC_2+ID_3+TAIE;     //计数时钟为1MHz,计数方式为连续计数
   CCTL1 |= CAP+CM_1 + SCS + CCIS_0+ CCIE;
   // 上升沿捕获,同步,CCI0A(P1.2信号源),捕获功能,中断允许
  TACCR1=0;
}


/****频率计算及显示****/
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_String(5,2,&lcdbuf[2]);
         else
           LCD_Write_String(5,2,&lcdbuf[1]);
           
        }
       else
      
         LCD_Write_String(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_String(5,2,&lcdbuf[2]);
           LCD_Write_String(11,2,"  ");
         }
         else
          {
           LCD_Write_String(5,2,&lcdbuf[1]);
           LCD_Write_String(12,2," ");
          }
      }
     else
     LCD_Write_String(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_String(0,1,"freq:");//从第一行第0列开始显示
while(1)
{
   display_freq();//脉宽计算及显示
}   
}


#pragma vector=TIMERA1_VECTOR//捕获中断子程序
__interrupt void TimerA1(void)
{
  switch(TAIV)
   {
     case 2://比较/捕获模块1中断
         period=TA_ov_num*65536+TACCR1-old_cap;
         old_cap=TACCR1;
         TA_ov_num=0;
         break;
  case 4:break;//比较/捕获模块2中断未用
  case 10:TA_ov_num++;
           break;
   }
  
  }

使用特权

评论回复
地板
dirtwillfly| | 2017-5-2 16:12 | 只看该作者
估计是1602的驱动不正确,或者背光电压不合适。
建议单独调试1602的显示,调试没问题再和其他部分的程序一起调试。

使用特权

评论回复
5
fentianyou| | 2017-5-3 16:07 | 只看该作者
楼主上图看一下显示是结果有什么不一样的。

使用特权

评论回复
6
fentianyou| | 2017-5-3 16:12 | 只看该作者
18380593018 发表于 2017-5-2 15:36
上代码:
#include
#include "LCD1602.c"

LCD显示的是字符串,需要转换为字符串才能显示。

使用特权

评论回复
7
isseed| | 2017-5-4 21:38 | 只看该作者
是显示的数组不准确吗

使用特权

评论回复
8
isseed| | 2017-5-4 21:43 | 只看该作者
楼主使用串口输出数据,看看数据是否正确。

使用特权

评论回复
9
pmp| | 2017-5-5 21:35 | 只看该作者
是频率的计算有问题吗

使用特权

评论回复
10
pmp| | 2017-5-5 21:40 | 只看该作者
显示不正确,则是LCD写入有问题。

使用特权

评论回复
11
18380593018|  楼主 | 2017-5-7 11:32 | 只看该作者
dirtwillfly 发表于 2017-5-2 16:12
估计是1602的驱动不正确,或者背光电压不合适。
建议单独调试1602的显示,调试没问题再和其他部分的程序一 ...

1602液晶屏是好的,单独调试测试代码能正常显示

使用特权

评论回复
12
18380593018|  楼主 | 2017-5-7 12:02 | 只看该作者
18380593018 发表于 2017-5-2 15:36
上代码:
#include
#include "LCD1602.c"

我用的就是这个代码,经过自己的修改,但显示有错

使用特权

评论回复
13
18380593018|  楼主 | 2017-5-7 12:04 | 只看该作者
#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();//脉宽计算及显示
}   
}

IMG_20170419_183141.jpg (473.53 KB )

IMG_20170419_183141.jpg

使用特权

评论回复
14
18380593018|  楼主 | 2017-5-7 12:07 | 只看该作者
pmp 发表于 2017-5-5 21:40
显示不正确,则是LCD写入有问题。

感觉是LCD写入有问题,初步学习430,找不到问题所在

使用特权

评论回复
15
18380593018|  楼主 | 2017-5-7 12:07 | 只看该作者
pmp 发表于 2017-5-5 21:35
是频率的计算有问题吗

代码发在下面呢,帮我看看

使用特权

评论回复
16
18380593018|  楼主 | 2017-5-7 12:33 | 只看该作者
isseed 发表于 2017-5-4 21:43
楼主使用串口输出数据,看看数据是否正确。

使用测试程序能正常显示,应该是代码问题,你帮我看看

使用特权

评论回复
17
王昆wk| | 2017-5-9 11:50 | 只看该作者
楼主你好请问你解决问题了吗

使用特权

评论回复
18
vivilzb1985| | 2017-5-9 21:46 | 只看该作者
这个还是一步步的调试的,,先看是否频率已经采集到的

使用特权

评论回复
19
vivilzb1985| | 2017-5-9 21:48 | 只看该作者
若每次都采集到了,就看下数据是否已经传输到显示部分的buffer的

使用特权

评论回复
20
vivilzb1985| | 2017-5-9 21:49 | 只看该作者
最后一个就是看下液晶的显示频率的,,能否将数据正确完整的显示出来的

使用特权

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

本版积分规则

1

主题

10

帖子

0

粉丝