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@0:ee637039cb58, 2013-10-16 (annotated)
- Committer:
- chrisisthefish
- Date:
- Wed Oct 16 06:56:41 2013 +0000
- Revision:
- 0:ee637039cb58
Initial creation
Who changed what in which revision?
User | Revision | Line number | New 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 | } |