This program gets 7-band frequency data from the MSGEQ7 library and displays a 7-band, 2-row bar graph on an LCD display using custom characters.

Dependencies:   MSGEQ7 TextLCD mbed

Note this program uses great LCD custom character code from Lluis Nadal to create the LCD bar graphs: http://mbed.org/users/lnadal/code/Lcd_Custom_Char/

main.cpp

Committer:
chrisisthefish
Date:
2013-10-16
Revision:
0:ee637039cb58

File content as of revision 0:ee637039cb58:

// LCD_Spectrum_Analyzer
// Created by Chris Wilson
// 10/16/2013

// NOTE: Contains LCD Custom Character code from Lluis Nadal

#include "mbed.h"
#include "MSGEQ7.h"
#include "TextLCD.h"

#define MAX 15

MSGEQ7 eq(p13, p14, p15); //reset, strobe, analog
TextLCD lcd(p30, p29, p28, p27, p26, p25); // rs, e, d4-d7

// Defines LCD bus to write data.
BusOut Lcd_pins(p28, p27, p26, p25); // d4, d5, d6, d7
DigitalOut rs_pin(p30); // LCD pin rs (register select.)
DigitalOut e_pin(p29);  // LCD pin e (enable).

//This data is 8 LCD characters representing an 8-level bar graph
char levels[8][8] = {
    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F},
    {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F},
    {0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F},
    {0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F},
    {0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F},
    {0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
    {0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
    {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}
};

/* Code from Lluis Nadal
http://mbed.org/users/lnadal/code/Lcd_Custom_Char/
*/
// Because we use 4 bit LCD, data must be sent in two steps.
void writePort(int value) {

    Lcd_pins = value >> 4;  // Shifts 4 bit right.
    wait(0.000040f); // Wait 40us.
    e_pin = 0;
    wait(0.000040f);
    e_pin = 1;
    Lcd_pins = value;
    wait(0.000040f);
    e_pin = 0;
    wait(0.000040f);
    e_pin = 1;
}

/* Code from Lluis Nadal
http://mbed.org/users/lnadal/code/Lcd_Custom_Char/
*/
void createChars(){
    for (int j=0; j<8; j++) {
        rs_pin = 0; // We send a command.

        /* 0X40 is the initial CGRAM address. Because each character needs a total amount of 8 memory 
        locations, we increment addres in 8 units after each character.
        */
        writePort(0x40+8*j);

        // Writes data.
        rs_pin = 1; // We send data.
        
        for (int i=0; i<8; i++) {
            writePort(levels[j][i]);
        }
    }
}


int main() {
    int i = 0;
    lcd.cls();
    createChars();
    
    while(1) {
        eq.readInt(MAX); //Read in frequency data, mapped to a max number of 15
        
        for(i = 0; i < 7; i++){
            
            lcd.locate(i, 1); //Draw second (lower) row first
            if(eq.freqDataInt[i] > 7){ //Is the lower level maxed out?
                lcd.putc(7); // If maxed out, display full bars
            }else{
                lcd.putc(eq.freqDataInt[i]);
            }
            
            lcd.locate(i, 0); //Draw first (upper) row
            if(eq.freqDataInt[i] < 8){
                lcd.putc(32); //If empty, draw a space (' ')
            }else{
                lcd.putc(eq.freqDataInt[i] - 8);
            }
        }
        
    }
}