Arduino VU meter and spectrum analyser

And the rest, 10000 char limit per post is a little short :confused:

/*
***********************************************************************
** Le o canal 0 do adc, ao subtrair 512 á sample de 1023 bits cria um
** sinal positivo ou negativo centrado em 0, é preciso para o fft
** usando o FFT feito pelo elm-chan calcula um FFT de 64 pontos
** e preenche as duas linhas do lcd com barras
***********************************************************************
*/

void fft_mode(void){
   count = 0;
   adc_read(0);
   cli();
   while(count != NUM_SAMPLES){
      ADCSRA |= (1<<ADSC);
      while((ADCSRA & (1<<ADSC))){};
      adcVal = ADCW;
      capture[count] = ((int16_t)(adcVal)-512);
      count++;
      }
   sei();

   fft_input(capture,bfly_buff);
   fft_execute(bfly_buff);
   fft_output(bfly_buff,spectrum);
   
   k=0;
   for(i=1; i<17; i++){
      sector1 = spectrum[i]/16;

   if(sector1>7){
      lcd_linha2[k]=FULL;
      lcd_linha1[k]=(sector1-8);
      }
   else{
      lcd_linha2[k]=sector1;
      lcd_linha1[k]=BLANK;
      }

      k++;

   }
}

/*
***********************************************************************
** Função de teste usada para afinar o gerador de barras verticais
***********************************************************************
*/

void lcd_test(void){

   for(i=0; i<16; i++){
   
   sector1=i;

   if(sector1>7){
      lcd_linha2[i]=FULL;
      lcd_linha1[i]=(sector1-8);
      }
   else{
      lcd_linha2[i]=sector1;
      lcd_linha1[i]=BLANK;
      }

   }


}

/*
***********************************************************************
** Carrega da flash os caracteres especiais para fazer as barras e as
** letras L e R na CGRAM do display
***********************************************************************
*/

void vu_mode_init(void){

   lcd_command(_BV(LCD_CGRAM));                  //Coloca CG RAM no endereço 0
   for(i=0; i<48; i++){
      lcd_data(pgm_read_byte_near(&vuChars[i])); }   //Lê os dados da flash e carrega na Ram do LCD

   lcd_gotoxy(0,0);   //Linha 0 coluna 0
   lcd_putc(4);      //Escreve L na esquerda
   lcd_gotoxy(0,1);   //Linha 1 coluna 0
   lcd_putc(5);      //Escreve R na direita
   lcd_linha1[0]=4;
   lcd_linha2[0]=5;
}

/*
***********************************************************************
** Carrega da flash os caracteres especiais para fazer as barras e as
** na CGRAM do display
***********************************************************************
*/

void fft_mode_init(void){
   
   lcd_command(_BV(LCD_CGRAM));                  //Coloca CG RAM no endereço 0
   for(i=0; i<64; i++){
      lcd_data(pgm_read_byte_near(&fftChars[i]));   }   //Lê os dados da flash e carrega na Ram do LCD

   lcd_clrscr();
}

/*
***********************************************************************
** Inicializa o timer1(16 bits) no modo CTC com prescaller de 1024
***********************************************************************
*/

void timer1_init(void){

   TCCR1B |= (1 << WGM12);         // Configure timer 1 for CTC mode
   OCR1A = 1100;               //Para gerar interrupções a 14Hz para o refresh do display, valor obtido experimentalmente
   TIMSK1 |= (1 << OCIE1A);       // Enable CTC interrupt
   TCCR1B |= ((1<<CS12)|(1<<CS10));//Inicia timer 1 com clock div de 1024
}