📄 main.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 + -