⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 430_contest.c

📁 1024fft用MSP430设计的音频信号分析仪
💻 C
📖 第 1 页 / 共 3 页
字号:
  {
    P1OUT |= LCD_CS2 ;
    P1OUT &=~LCD_CS1 ;
    lcd_write_command(xpos-64+0x40) ;
    lcd_write_command(ypos+0xb8) ;
    lcd_write_data(*byte) ;
  }
}
//***********************************************

//***********************************************
void lcd_write_L(uchar xpos,uchar ypos,uchar byte)
{
  if(xpos<=63)
  {
    P1OUT |= LCD_CS1 ;
    P1OUT &=~ LCD_CS2 ;
    lcd_write_command(xpos+0x40) ;
    lcd_write_command(ypos+0xb8) ;
    lcd_write_data(byte) ;
  }
  else
  {
    P1OUT |= LCD_CS2 ;
    P1OUT &=~LCD_CS1 ;
    lcd_write_command(xpos-64+0x40) ;
    lcd_write_command(ypos+0xb8) ;
    lcd_write_data(byte) ;
  }
}
//***********************************************

//**********清空液晶屏***************************
void lcd_clear()
{    
  uchar i,j ;
  
  for(i=0x00;i<=0x7f;i++)
  {
    for(j=0x00;j<=0x07;j++)
    {
      lcd_write_byte(i,j,(uchar *)cls) ;
    }
   }    
}
//***********************************************

//**********写一个汉字,16*16大小****************
void lcd_write_hz(uchar hz_xpos,uchar hz_ypos,uchar *hz_source_addr)
{   
  uchar i=0 ;
  
  for( i = 0 ; i <= 15 ; i++ )
  {
    lcd_write_byte(hz_xpos*16+i,hz_ypos*2,hz_source_addr+i) ;
  }
  for( i = 0 ; i <= 15 ; i++ )
  {
    lcd_write_byte(hz_xpos*16+i,hz_ypos*2+1,hz_source_addr+16+i) ;
  }
}
//***********************************************

//**********写一个字符,8*16大小****************
void lcd_write_char(uchar hz_xpos,uchar hz_ypos,uchar *hz_source_addr)
{   
  uchar i=0 ;
  
  for( i = 0 ; i <= 7 ; i++ )
  {
    lcd_write_byte(hz_xpos*8+i,hz_ypos*2,hz_source_addr+i) ;
  }
  for( i = 0 ; i <= 7 ; i++ )
  {
    lcd_write_byte(hz_xpos*8+i,hz_ypos*2+1,hz_source_addr+8+i) ;
  }
}
//***********************************************

//**********显示初始界面*************************
void Show_Title(void) 
{
  //输出"音频信号分析仪"
  lcd_write_hz( 0 , 1 , (uchar * )yin ) ;
  lcd_write_hz( 1 , 1 , (uchar * )pin ) ;
  lcd_write_hz( 2 , 1 , (uchar * )xin ) ;
  lcd_write_hz( 3 , 1 , (uchar * )pin ) ;
  lcd_write_hz( 4 , 1 , (uchar * )fen ) ;
  lcd_write_hz( 5 , 1 , (uchar * )xi ) ;
  lcd_write_hz( 6 , 1 , (uchar * )yi ) ;
  //输出"南京航空航天大学"
  lcd_write_hz( 0 , 3 , (uchar * )nan ) ;
  lcd_write_hz( 1 , 3 , (uchar * )jing ) ;
  lcd_write_hz( 2 , 3 , (uchar * )hang ) ;
  lcd_write_hz( 3 , 3 , (uchar * )kong ) ;
  lcd_write_hz( 4 , 3 , (uchar * )hang ) ;
  lcd_write_hz( 5, 3 , (uchar * )tian ) ;
  lcd_write_hz( 6 , 3 , (uchar * )da ) ;
  lcd_write_hz( 7 , 3 , (uchar * )xue ) ;
}
//***********************************************


//**********显示菜单*****************************
void Show_Menu ( void )
{
  lcd_write_char( 0 , 0 , (uchar *)num[1] ) ;
  lcd_write_char( 1 , 0 , (uchar *)point ) ;
  lcd_write_hz( 1 , 0 , (uchar *)yin ) ;
  lcd_write_hz( 2 , 0 , (uchar *)pin ) ;
  lcd_write_hz( 3 , 0 , (uchar *)fen ) ; 
  lcd_write_hz( 4 , 0 , (uchar *)xi ) ;
  lcd_write_char( 0 , 1 , (uchar *)num[2] ) ; 
  lcd_write_char( 1 , 1 , (uchar *)point ) ;
  lcd_write_hz( 1 , 1 , (uchar *)xin ) ;
  lcd_write_hz( 2 , 1 , (uchar *)pin ) ; 
  lcd_write_hz( 3 , 1 , (uchar *)fen ) ;
  lcd_write_hz( 4 , 1 , (uchar *)xi ) ;
  lcd_write_char( 0 , 2 , (uchar *)num[3] ) ;
  lcd_write_char( 1 , 2 , (uchar *)point ) ;
  lcd_write_hz( 1 , 2 , (uchar *)zhou ) ;
  lcd_write_hz( 2 , 2 , (uchar *)qi ) ;
  lcd_write_hz( 3 , 2 , (uchar *)ce ) ; 
  lcd_write_hz( 4 , 2 , (uchar *)liang )  ;
  //lcd_write_char( 0 , 3 , (uchar *)num[4] ) ;
 // lcd_write_char( 1 , 3 , (uchar *)point ) ;
 // lcd_write_hz( 1 , 3 , (uchar *)shi ) ; 
  //lcd_write_hz( 2 , 3 , (uchar *)zhen ) ; 
  //lcd_write_hz( 3 , 3 , (uchar *)du ) ;
  //lcd_write_hz( 4 , 3 , (uchar *)fen ) ;
  //lcd_write_hz( 5 , 3 , (uchar *)xi ) ;
}
//***********************************************

//**********显示频谱分析*************************
void Show_Fre ( void )
{
  //输出“频率/Hz 幅度”
  lcd_write_hz( 0 , 0 , (uchar *)pin ) ;
  lcd_write_hz( 1 , 0 , (uchar *)lv ) ;
  lcd_write_char( 4 , 0 , (uchar *)line ) ;
  lcd_write_char( 5 , 0 , (uchar *)H ) ;
  lcd_write_char( 6 , 0 , (uchar *)z ) ;
  lcd_write_hz( 4 , 0 , (uchar *)fu ) ;
  lcd_write_hz( 5 , 0 , (uchar *)du ) ;
}
//***********************************************

//**********写一个频率数*************************
void Write_Fre( uchar xpos,uchar ypos, unsigned int k )
{
  for ( int i = 0 ; i < 5 ; i ++ ) 
  {
    lcd_write_char( xpos+4-i , ypos , (uchar *)num[k%10] ) ;
    k /= 10 ;
  }
}
//***********************************************

//**********向频谱分析界面写数据*****************
void Write_Fre_Data ( void )
{  
  for ( int i = 0 ; i < 3 ; i++ )
  {
    if ( step == 20 ) 
    {
      Write_Fre(0 , i+1 , 20*(p+i) ) ;
      Write_Fre(8 , i+1 , harm[p+i] ) ;
    }
    else
    {
      Write_Fre(0 , i+1 , 20*(p+5*i) ) ;
      Write_Fre(8 , i+1 , harm[p+5*i] ) ;
    }
  }
}
//***********************************************

//**********显示时域分析*************************
void Show_Pow ( void ) 
{
  lcd_write_hz( 0 , 0 , (uchar *)feng ) ;
  lcd_write_hz( 1, 0 , (uchar *)feng ) ;
  lcd_write_hz(2 , 0 , (uchar *)zhi ) ;  
 // lcd_write_char( 3 , 0 , (uchar *)line ) ;
  //lcd_write_char( 4 , 0 , (uchar *)H) ;

  lcd_write_hz( 5 , 0 , (uchar *)jun ) ;
  lcd_write_hz( 6 , 0 , (uchar *)zhi ) ;
  //lcd_write_char( 13 , 0 , (uchar *)line ) ;
  //lcd_write_char( 15 , 0 , (uchar *)H ) ;
  
    lcd_write_hz( 0 , 2 , (uchar *)jun ) ;
  lcd_write_hz( 1 , 2, (uchar *)fang) ;
  lcd_write_hz( 2 , 2 , (uchar *)gen ) ;  
  //lcd_write_char( 3 , 2 , (uchar *)zhi ) ;
   //lcd_write_char(4 , 2 , (uchar *)line ) ;
  //lcd_write_char( 5, 2, (uchar *)H) ;
}
//***********************************************

//**********向时域分析界面写数据*****************
void Write_wave_Data ( float a ,float b,float d)
{ 
  a/=128;
  b=sqrt(b/128);
  Write_Fre(10,1,a);
  Write_Fre(0,3,b);
  Write_Fre(0,1,d);
 /* for ( int i = 0 ; i < 3 ; i++ )
  {
    if ( step == 20 ) 
    {
      Write_Fre(0 , i+1 , fft_r[p+i] ) ;
      Write_Fre(8 , i+1 , fft_i[p+i] ) ;
    }
    else
    {
      Write_Fre(0 , i+1 , fft_r[p+5*i] ) ;
      Write_Fre(8 , i+1 , fft_i[p+5*i] ) ;
    }
  }*/
}
//***********************************************

//**********写一个8*8的字符**********************
void lcd_write_ch( uchar xpos , uchar ypos , uchar *hz_source_addr)
{   
  uchar i=0 ;
  
  for( i = 0 ; i <= 7 ; i++ )
  {
    lcd_write_byte(xpos*8+i,ypos,hz_source_addr+i) ;
  }
}
//***********************************************

//**********画高度为定值的竖直线*****************
void lcd_write_line ( uchar xpos , int h ) 
{
  uchar m ;
  
  m = h ;
  for(int i = 0; i < 5; i++ )
  {
    switch ( m )
    {
    case 0:
      lcd_write_L ( xpos , 7-i , 0x00 ) ;
      break ;
    case 1:
      lcd_write_L ( xpos , 7-i , 0x80 ) ;
      m = 0 ;
      break ;
    case 2:
      lcd_write_L ( xpos , 7-i , 0xc0 ) ;
      m = 0 ;
      break ;
    case 3:
      lcd_write_L ( xpos , 7-i , 0xe0 ) ;
      m = 0 ;
      break ;
    case 4:
      lcd_write_L ( xpos , 7-i , 0xf0 ) ;
      m = 0 ;
      break ;
    case 5:
      lcd_write_L ( xpos , 7-i , 0xf8 ) ;
      m = 0 ;
      break ;
    case 6:
      lcd_write_L ( xpos , 7-i , 0xfc ) ;
      m = 0 ;
      break ;
    case 7:
      lcd_write_L ( xpos , 7-i , 0xfe ) ;
      m = 0 ;
      break ;
    default:
      lcd_write_L ( xpos , 7-i , 0xff ) ;
      m -= 8 ;
      break ;
    }
  }
}
//***********************************************

//**********画频谱图*****************************
void Show_Fre_Map(void)
{
  for ( int m = 0 ; m < 25 ; m++ )
  {
    if ( step == 20 )
    {
      lcd_write_line ( 5*m+2 , fft_i[p+m] ) ;
    }
    else
    {
      lcd_write_line ( 5*m+2 , fft_i[p+5*m] ) ;
    }
  }
}
//***********************************************

//**********画功率谱图*****************************
void Show_Pow_Map(void)
{
  for ( int m = 0 ; m < 25 ; m++ )
  {
    if ( step == 20 )
    {
      lcd_write_line ( 5*m+2 , fft_i[p+m] ) ;
    }
    else
    {
      lcd_write_line ( 5*m+2 , fft_i[p+5*m] ) ;
    }
  }
}
//***********************************************

//**********显示x,y标识**************************
void Show_Zuobiao(void)
{
  //显示"x1:"
  lcd_write_ch(0 , 0 , (uchar *)x ) ;
  lcd_write_ch(1 , 0 , (uchar *)num_half[1] ) ;
  lcd_write_ch(2 , 0 , (uchar *)col ) ;
  //显示"y1:"
  lcd_write_ch(8 , 0 , (uchar *) y ) ;
  lcd_write_ch(9 , 0 , (uchar *)num_half[1] ) ;
  lcd_write_ch(10 , 0 , (uchar *)col ) ;
  //显示"x2:"
  lcd_write_ch(0 , 1 , (uchar *)x ) ;
  lcd_write_ch(1 , 1 , (uchar *)num_half[2] ) ;
  lcd_write_ch(2 , 1 , (uchar *)col ) ;
  //显示"y2:"
  lcd_write_ch(8 , 1 , (uchar *)y ) ;  
  lcd_write_ch(9 , 1 , (uchar *)num_half[2] ) ;
  lcd_write_ch(10 , 1 , (uchar *)col ) ;
  //显示X差
  lcd_write_ch(0 , 2 , (uchar *)delta ) ;
  lcd_write_ch(1 , 2 , (uchar *)x ) ;
  lcd_write_ch(2 , 2 , (uchar *)col ) ;
  //显示Y差
  lcd_write_ch(8 , 2 , (uchar *)delta ) ;  
  lcd_write_ch(9 , 2 , (uchar *)y ) ;
  lcd_write_ch(10 , 2 , (uchar *)col ) ; 
}
//***********************************************

//**********在X,Y处显示标尺**********************
void Draw_Rul(uchar x , uchar y )
{
  uchar a , b ;
  
  a = 7-y/8 ;
  b = y%8 ;
  switch ( b )
  {
  case 0:
    lcd_write_L ( 5*x , a+1 , 0x01 ) ;
    lcd_write_L ( 5*x+1 , a+1 , 0x01 ) ;
    lcd_write_L ( 5*x+3 , a+1 , 0x01 ) ;
    lcd_write_L ( 5*x+4 , a+1 , 0x01 ) ;
    break ;
  case 1:
    lcd_write_L ( 5*x , a , 0x80 ) ;
    lcd_write_L ( 5*x+1 , a , 0x80 ) ;
    lcd_write_L ( 5*x+2 , a , 0x80 ) ;
    lcd_write_L ( 5*x+3 , a , 0x80 ) ;
    break ;
  case 2:
    lcd_write_L ( 5*x , a , 0x40 ) ;
    lcd_write_L ( 5*x+1 , a , 0x40 ) ;
    lcd_write_L ( 5*x+2 , a , 0x40 ) ;
    lcd_write_L ( 5*x+3 , a , 0x40 ) ;
    break ;
  case 3:
    lcd_write_L ( 5*x , a , 0x20 ) ;
    lcd_write_L ( 5*x+1 , a , 0x20 ) ;
    lcd_write_L ( 5*x+2 , a , 0x20 ) ;
    lcd_write_L ( 5*x+3 , a , 0x20 ) ;
    break ;
  case 4:
    lcd_write_L ( 5*x , a , 0x10 ) ;
    lcd_write_L ( 5*x+1 , a , 0x10 ) ;
    lcd_write_L ( 5*x+2 , a , 0x10 ) ;
    lcd_write_L ( 5*x+3 , a , 0x10 ) ;
    break ;
  case 5:
    lcd_write_L ( 5*x , a , 0x08 ) ;
    lcd_write_L ( 5*x+1 , a , 0x08 ) ;
    lcd_write_L ( 5*x+2 , a , 0x08 ) ;
    lcd_write_L ( 5*x+3 , a , 0x08 ) ;
    break ;
  case 6:
    lcd_write_L ( 5*x , a , 0x04 ) ;
    lcd_write_L ( 5*x+1 , a , 0x04 ) ;
    lcd_write_L ( 5*x+2 , a , 0x04 ) ;
    lcd_write_L ( 5*x+3 , a , 0x04 ) ;
    break ;
  case 7:
    lcd_write_L ( 5*x , a , 0x02 ) ;
    lcd_write_L ( 5*x+1 , a , 0x02 ) ;
    lcd_write_L ( 5*x+2 , a , 0x02 ) ;
    lcd_write_L ( 5*x+3 , a , 0x02 ) ;
    break ;
  }
}
//***********************************************

//**********清除X,Y处标尺************************
void Del_Rul ( uchar x , uchar y )
{
  uchar a , b ;
  
  a = 7-y/8 ;
  b = y%8 ;

  if ( b == 0 )
  {
    lcd_write_L ( 5*x , a+1 , 0x00 ) ;
    lcd_write_L ( 5*x+1 , a+1 , 0x00 ) ;
    lcd_write_L ( 5*x+3 , a+1 , 0x00 ) ;
    lcd_write_L ( 5*x+4 , a+1 , 0x00 ) ;
  }
  else
  {
    lcd_write_L ( 5*x , a , 0x00 ) ;
    lcd_write_L ( 5*x+1 , a , 0x00 ) ;
    lcd_write_L ( 5*x+2 , a , 0x00 ) ;
    lcd_write_L ( 5*x+3 , a , 0x00 ) ;
  }
}
//***********************************************


//**********在指定位置写数字*********************
void Write_Num( uchar xpos , uchar ypos , unsigned int k )
{
  for (int i=0; i<5; i++)
  {
    lcd_write_ch( xpos+4-i , ypos , (uchar *) num_half[k%10] ) ;
    k /= 10 ;
  }
}
//***********************************************

//**********写出坐标值***************************
void Write_Zuobiao(void)
{
  Write_Num( 3 , 0 , x1 ) ;
  Write_Num( 11 , 0 , y1 ) ;
  Write_Num( 3 , 1 , x2 ) ;
  Write_Num( 11 , 1 , y2 ) ;
  Write_Num( 3 , 2 , dx ) ;
  Write_Num( 11 , 2 , dy ) ;
}
//***********************************************

//**********显示周期测量*************************
void Show_T ( void ) 
{
  lcd_write_hz( 3 , 2 , (uchar *)hang ) ;
}
//***********************************************

//**********显示失真度分析***********************
void Show_Dis ( void ) 
{
  lcd_write_hz( 3 , 3 , (uchar *)kong ) ;
}
//***********************************************
void initmsp430()
{
   int i;
   WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog 
   BCSCTL1 &= ~XT2OFF;                   // XT2on
    do
    {
      IFG1 &= ~OFIFG;                     // Clear OSCFault flag
      for (i = 0xFF; i > 0; i--);         // Time for flag to set
    }
    while ((IFG1 & OFIFG));               // OSCFault flag still set?    
   BCSCTL2 |= XTS;                           // ACLK = LFXT1 = HF XTAL
}

void lcd_display_wave (float *data ) 

 {
   for(int xpos1=0;xpos1<128;xpos1++)
 {
   int m ;  
  m = (int)data[xpos1] ;
  for(int i = 0 ; i < 4 ; i++ )
  {
    switch ( m )
    {
    case 0:
      lcd_write_L ( xpos1 , 7-i , 0x00 ) ;
      break ;
    case 1:
      lcd_write_L ( xpos1 , 7-i , 0x80 ) ;
      m = 0 ;
      break ;
    case 2:
      lcd_write_L ( xpos1 , 7-i , 0x40 ) ;
      m = 0 ;
      break ;
    case 3:
      lcd_write_L ( xpos1 , 7-i , 0x20 ) ;
      m = 0 ;
      break ;
    case 4:
      lcd_write_L ( xpos1 , 7-i , 0x10 ) ;
      m = 0 ;
      break ;
    case 5:
      lcd_write_L ( xpos1 , 7-i , 0x08 ) ;
      m = 0 ;
      break ;
    case 6:
      lcd_write_L ( xpos1 , 7-i , 0x04 ) ;
      m = 0 ;
      break ;
    case 7:
      lcd_write_L ( xpos1 , 7-i , 0x02 ) ;
      m = 0 ;
      break ;
    default:
      lcd_write_L ( xpos1 , 7-i , 0x00 ) ;
      m -= 8 ;
      break ;
    }
  }
}
}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -