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

📄 main.c

📁 FFT转换程序
💻 C
字号:
//-------------------------------------------------
// LCD Module:		  	LM6038D
// Display Size:      128x64
// Driver/Controller: ST7565P
// Interface:         serial mode
// by:								Genius:hackerboygn@126.com
// Date:							2007-05-19
// note:							using  4x booster setting
//-------------------------------------------------

#include "global.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "st7565p.h"
#include "ffft.h"



/*------------------------------------------------*/
/* Global variables                               */

//char pool[16];	/* Console input buffer */

union _my_complex_t {
	complex_t 	bfly_buff[FFT_N];
	uint8_t		lcd_buff[FFT_N * 4];
} my_complex_t ;
int16_t capture[FFT_N];			/* Wave captureing buffer */
//complex_t bfly_buff[FFT_N];		/* FFT buffer */
uint16_t spektrum[FFT_N/2];		/* Spectrum output buffer */



//TIMER1 initialize - prescale:1
// WGM: 4) CTC, TOP=OCRnA
// desired value: 500KHz
// actual value: 500.000KHz (0.0%)
void clock_init(void)
{
	TCCR1B = 0x00; //stop
	TCNT1H = 0xFF; //setup
	TCNT1L = 0xE1;
	OCR1AH = 0x00;
	OCR1AL = 0x1F;
	OCR1BH = 0x00;
	OCR1BL = 0x1F;
	ICR1H  = 0x00;
	ICR1L  = 0x1F;
	TCCR1A = 0x10;
	TCCR1B = 0x09; //start Timer
}

/*------------------------------------------------*/
/* Capture waveform                               */

void capture_wave (int16_t *buffer, uint16_t count)
{
//	cli();

	ADMUX = _BV(ADLAR);	// channe0

	do {
		ADCSRA = _BV(ADEN)|_BV(ADSC)|_BV(ADFR)|_BV(ADIF)|_BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0);
		while(bit_is_clear(ADCSRA, ADIF));
		*buffer++ = ADC - 32768;
	} while(--count);

	ADCSRA = 0;

//	sei();
}

void delay(u08 time)
{
	while(time > 0)
	{
		_delay_ms(100);
		time--;
	}
}

void glcdLineRAM(u08 x, u08 val)
{
	u08 temp = 8;
	if (val > 64) val =  64;

	while (val > 8)
	{
		my_complex_t.lcd_buff[64 * (temp - 1) + x] =  0xFF;
		temp--;
		val -= 8;
	}

	my_complex_t.lcd_buff[64 * (temp - 1) + x] = ( 0xFF << (8 - val) );
	temp--;

	while (temp > 0)
	{
		my_complex_t.lcd_buff[64 * (temp - 1) + x] = 0x00;
		temp--;
	}

}

//-----------------------------------
// Main Program
//-----------------------------------
int main()
{
	u08 i, j, *s;
//	char cp[16];
	u16 m, n;

	glcdInit();
	glcdClearScreen();
	DDRB  |= ( _BV(DDB0) | _BV(DDB1) | _BV(DDB2) );
//	DDRB  |= ( _BV(DDB0) | _BV(DDB1) );

	clock_init();
//	TIMSK = 0x00; //timer interrupt sources

	while(1)
	{

		capture_wave(capture, FFT_N);
		fft_input(capture, my_complex_t.bfly_buff);
		fft_execute(my_complex_t.bfly_buff);
		fft_output(my_complex_t.bfly_buff, spektrum);

//		glcdClearScreen();

		PORTB &=~_BV(PB0);

		n = 0;
		for (i = 0;i < 64;i++)
		{
			m = (u16) ((spektrum[i] + 0.5) / 64 );
			glcdLineRAM(i, m);
			if (m > n)   n = m ;
		}
/*
		if (n > 48) 
		{
			PORTB |= _BV(PB1);
		}
		else 
		{
			PORTB &=~_BV(PB1);
		}
*/
		for (i =0; i < 8; i++)
		{
			glcdSetAddress(0, i);
			for (j = 0; j < 64; j++)
			{
				glcdDataWrite( my_complex_t.lcd_buff[64 * i + j] );
			}
		}

		PORTB |= _BV(PB0);
//		delay(1);

	}

	return 1;
}
//end of program

⌨️ 快捷键说明

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