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/

Committer:
chrisisthefish
Date:
Wed Oct 16 06:56:41 2013 +0000
Revision:
0:ee637039cb58
Initial creation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chrisisthefish 0:ee637039cb58 1 // LCD_Spectrum_Analyzer
chrisisthefish 0:ee637039cb58 2 // Created by Chris Wilson
chrisisthefish 0:ee637039cb58 3 // 10/16/2013
chrisisthefish 0:ee637039cb58 4
chrisisthefish 0:ee637039cb58 5 // NOTE: Contains LCD Custom Character code from Lluis Nadal
chrisisthefish 0:ee637039cb58 6
chrisisthefish 0:ee637039cb58 7 #include "mbed.h"
chrisisthefish 0:ee637039cb58 8 #include "MSGEQ7.h"
chrisisthefish 0:ee637039cb58 9 #include "TextLCD.h"
chrisisthefish 0:ee637039cb58 10
chrisisthefish 0:ee637039cb58 11 #define MAX 15
chrisisthefish 0:ee637039cb58 12
chrisisthefish 0:ee637039cb58 13 MSGEQ7 eq(p13, p14, p15); //reset, strobe, analog
chrisisthefish 0:ee637039cb58 14 TextLCD lcd(p30, p29, p28, p27, p26, p25); // rs, e, d4-d7
chrisisthefish 0:ee637039cb58 15
chrisisthefish 0:ee637039cb58 16 // Defines LCD bus to write data.
chrisisthefish 0:ee637039cb58 17 BusOut Lcd_pins(p28, p27, p26, p25); // d4, d5, d6, d7
chrisisthefish 0:ee637039cb58 18 DigitalOut rs_pin(p30); // LCD pin rs (register select.)
chrisisthefish 0:ee637039cb58 19 DigitalOut e_pin(p29); // LCD pin e (enable).
chrisisthefish 0:ee637039cb58 20
chrisisthefish 0:ee637039cb58 21 //This data is 8 LCD characters representing an 8-level bar graph
chrisisthefish 0:ee637039cb58 22 char levels[8][8] = {
chrisisthefish 0:ee637039cb58 23 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F},
chrisisthefish 0:ee637039cb58 24 {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F},
chrisisthefish 0:ee637039cb58 25 {0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F},
chrisisthefish 0:ee637039cb58 26 {0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F},
chrisisthefish 0:ee637039cb58 27 {0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F},
chrisisthefish 0:ee637039cb58 28 {0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
chrisisthefish 0:ee637039cb58 29 {0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
chrisisthefish 0:ee637039cb58 30 {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}
chrisisthefish 0:ee637039cb58 31 };
chrisisthefish 0:ee637039cb58 32
chrisisthefish 0:ee637039cb58 33 /* Code from Lluis Nadal
chrisisthefish 0:ee637039cb58 34 http://mbed.org/users/lnadal/code/Lcd_Custom_Char/
chrisisthefish 0:ee637039cb58 35 */
chrisisthefish 0:ee637039cb58 36 // Because we use 4 bit LCD, data must be sent in two steps.
chrisisthefish 0:ee637039cb58 37 void writePort(int value) {
chrisisthefish 0:ee637039cb58 38
chrisisthefish 0:ee637039cb58 39 Lcd_pins = value >> 4; // Shifts 4 bit right.
chrisisthefish 0:ee637039cb58 40 wait(0.000040f); // Wait 40us.
chrisisthefish 0:ee637039cb58 41 e_pin = 0;
chrisisthefish 0:ee637039cb58 42 wait(0.000040f);
chrisisthefish 0:ee637039cb58 43 e_pin = 1;
chrisisthefish 0:ee637039cb58 44 Lcd_pins = value;
chrisisthefish 0:ee637039cb58 45 wait(0.000040f);
chrisisthefish 0:ee637039cb58 46 e_pin = 0;
chrisisthefish 0:ee637039cb58 47 wait(0.000040f);
chrisisthefish 0:ee637039cb58 48 e_pin = 1;
chrisisthefish 0:ee637039cb58 49 }
chrisisthefish 0:ee637039cb58 50
chrisisthefish 0:ee637039cb58 51 /* Code from Lluis Nadal
chrisisthefish 0:ee637039cb58 52 http://mbed.org/users/lnadal/code/Lcd_Custom_Char/
chrisisthefish 0:ee637039cb58 53 */
chrisisthefish 0:ee637039cb58 54 void createChars(){
chrisisthefish 0:ee637039cb58 55 for (int j=0; j<8; j++) {
chrisisthefish 0:ee637039cb58 56 rs_pin = 0; // We send a command.
chrisisthefish 0:ee637039cb58 57
chrisisthefish 0:ee637039cb58 58 /* 0X40 is the initial CGRAM address. Because each character needs a total amount of 8 memory
chrisisthefish 0:ee637039cb58 59 locations, we increment addres in 8 units after each character.
chrisisthefish 0:ee637039cb58 60 */
chrisisthefish 0:ee637039cb58 61 writePort(0x40+8*j);
chrisisthefish 0:ee637039cb58 62
chrisisthefish 0:ee637039cb58 63 // Writes data.
chrisisthefish 0:ee637039cb58 64 rs_pin = 1; // We send data.
chrisisthefish 0:ee637039cb58 65
chrisisthefish 0:ee637039cb58 66 for (int i=0; i<8; i++) {
chrisisthefish 0:ee637039cb58 67 writePort(levels[j][i]);
chrisisthefish 0:ee637039cb58 68 }
chrisisthefish 0:ee637039cb58 69 }
chrisisthefish 0:ee637039cb58 70 }
chrisisthefish 0:ee637039cb58 71
chrisisthefish 0:ee637039cb58 72
chrisisthefish 0:ee637039cb58 73 int main() {
chrisisthefish 0:ee637039cb58 74 int i = 0;
chrisisthefish 0:ee637039cb58 75 lcd.cls();
chrisisthefish 0:ee637039cb58 76 createChars();
chrisisthefish 0:ee637039cb58 77
chrisisthefish 0:ee637039cb58 78 while(1) {
chrisisthefish 0:ee637039cb58 79 eq.readInt(MAX); //Read in frequency data, mapped to a max number of 15
chrisisthefish 0:ee637039cb58 80
chrisisthefish 0:ee637039cb58 81 for(i = 0; i < 7; i++){
chrisisthefish 0:ee637039cb58 82
chrisisthefish 0:ee637039cb58 83 lcd.locate(i, 1); //Draw second (lower) row first
chrisisthefish 0:ee637039cb58 84 if(eq.freqDataInt[i] > 7){ //Is the lower level maxed out?
chrisisthefish 0:ee637039cb58 85 lcd.putc(7); // If maxed out, display full bars
chrisisthefish 0:ee637039cb58 86 }else{
chrisisthefish 0:ee637039cb58 87 lcd.putc(eq.freqDataInt[i]);
chrisisthefish 0:ee637039cb58 88 }
chrisisthefish 0:ee637039cb58 89
chrisisthefish 0:ee637039cb58 90 lcd.locate(i, 0); //Draw first (upper) row
chrisisthefish 0:ee637039cb58 91 if(eq.freqDataInt[i] < 8){
chrisisthefish 0:ee637039cb58 92 lcd.putc(32); //If empty, draw a space (' ')
chrisisthefish 0:ee637039cb58 93 }else{
chrisisthefish 0:ee637039cb58 94 lcd.putc(eq.freqDataInt[i] - 8);
chrisisthefish 0:ee637039cb58 95 }
chrisisthefish 0:ee637039cb58 96 }
chrisisthefish 0:ee637039cb58 97
chrisisthefish 0:ee637039cb58 98 }
chrisisthefish 0:ee637039cb58 99 }