Ale C.-
/
FFT_Example
Example Audio Spectrum Analyzer
LCD_Serial.h@0:74f5a741c618, 2011-02-11 (annotated)
- Committer:
- Suky
- Date:
- Fri Feb 11 00:37:57 2011 +0000
- Revision:
- 0:74f5a741c618
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Suky | 0:74f5a741c618 | 1 | /* |
Suky | 0:74f5a741c618 | 2 | @file LCD_Serial.h |
Suky | 0:74f5a741c618 | 3 | @version: 1.0 |
Suky | 0:74f5a741c618 | 4 | |
Suky | 0:74f5a741c618 | 5 | @web www.micros-designs.com.ar |
Suky | 0:74f5a741c618 | 6 | @date 05/02/11 |
Suky | 0:74f5a741c618 | 7 | |
Suky | 0:74f5a741c618 | 8 | *- Version Log --------------------------------------------------------------* |
Suky | 0:74f5a741c618 | 9 | * Fecha Autor Comentarios * |
Suky | 0:74f5a741c618 | 10 | *----------------------------------------------------------------------------* |
Suky | 0:74f5a741c618 | 11 | * 05/02/11 Suky Original * |
Suky | 0:74f5a741c618 | 12 | *----------------------------------------------------------------------------*/ |
Suky | 0:74f5a741c618 | 13 | /////////////////////////////////////////////////////////////////////////// |
Suky | 0:74f5a741c618 | 14 | //// //// |
Suky | 0:74f5a741c618 | 15 | //// //// |
Suky | 0:74f5a741c618 | 16 | //// (C) Copyright 2011 www.micros-designs.com.ar //// |
Suky | 0:74f5a741c618 | 17 | //// Este codigo puede ser usado, modificado y distribuido libremente //// |
Suky | 0:74f5a741c618 | 18 | //// sin eliminar esta cabecera y sin garantia de ningun tipo. //// |
Suky | 0:74f5a741c618 | 19 | //// //// |
Suky | 0:74f5a741c618 | 20 | //// //// |
Suky | 0:74f5a741c618 | 21 | /////////////////////////////////////////////////////////////////////////// |
Suky | 0:74f5a741c618 | 22 | #include "mbed.h" |
Suky | 0:74f5a741c618 | 23 | #include "DataCGRAM.h" |
Suky | 0:74f5a741c618 | 24 | |
Suky | 0:74f5a741c618 | 25 | class LCDSerial:public Stream { |
Suky | 0:74f5a741c618 | 26 | public: |
Suky | 0:74f5a741c618 | 27 | #define LCDClr 0x01 // Borra pantalla, cursor a Inicio |
Suky | 0:74f5a741c618 | 28 | #define LCDHome 0x02 // Cursor a Inicio, DDRAM sin cambios |
Suky | 0:74f5a741c618 | 29 | #define LCDIncCursor 0x06 // Modo incrementa cursor |
Suky | 0:74f5a741c618 | 30 | #define LCDDecCursor 0x04 // Modo decrementa cursor |
Suky | 0:74f5a741c618 | 31 | #define LCDOn 0x0C // Pantalla On |
Suky | 0:74f5a741c618 | 32 | #define LCDOff 0x08 // Pantalla Off |
Suky | 0:74f5a741c618 | 33 | #define LCDCursorOn 0x0E // Pantalla On, cursor On |
Suky | 0:74f5a741c618 | 34 | #define LCDCursorOff 0x0C // Pantalla On, cursor Off |
Suky | 0:74f5a741c618 | 35 | #define LCDCursorBlink 0x0F // Pantalla On, Cursor parpadeante |
Suky | 0:74f5a741c618 | 36 | #define LCDCursorLeft 0x10 // Mueve cursor a la izquierda |
Suky | 0:74f5a741c618 | 37 | #define LCDCursorRight 0x14 // Mueve cursor a la derecha |
Suky | 0:74f5a741c618 | 38 | #define LCDDisplayLeft 0x18 // Mueve Display a la izquierda |
Suky | 0:74f5a741c618 | 39 | #define LCDDisplayRight 0x1C // Mueve Display a la Derecha |
Suky | 0:74f5a741c618 | 40 | /** Crea LCD interface |
Suky | 0:74f5a741c618 | 41 | * |
Suky | 0:74f5a741c618 | 42 | * @param DATA |
Suky | 0:74f5a741c618 | 43 | * @param CLK |
Suky | 0:74f5a741c618 | 44 | * @param E |
Suky | 0:74f5a741c618 | 45 | */ |
Suky | 0:74f5a741c618 | 46 | LCDSerial(PinName DATA,PinName CLK,PinName E,PinName BACK=NC); |
Suky | 0:74f5a741c618 | 47 | void vGotoxy(char x,char y); |
Suky | 0:74f5a741c618 | 48 | void vSetBacklight(bool Value); |
Suky | 0:74f5a741c618 | 49 | void vPutc(char Data); |
Suky | 0:74f5a741c618 | 50 | void vCommand(char Data); |
Suky | 0:74f5a741c618 | 51 | #if DOXYGEN_ONLY |
Suky | 0:74f5a741c618 | 52 | /** Escribe un caracter en LCD |
Suky | 0:74f5a741c618 | 53 | * |
Suky | 0:74f5a741c618 | 54 | * @param c El caracter a escribir en LCD |
Suky | 0:74f5a741c618 | 55 | */ |
Suky | 0:74f5a741c618 | 56 | int putc(int c); |
Suky | 0:74f5a741c618 | 57 | |
Suky | 0:74f5a741c618 | 58 | /** Escribe un string formateado en LCD |
Suky | 0:74f5a741c618 | 59 | * |
Suky | 0:74f5a741c618 | 60 | * @param format A printf-style format string, followed by the |
Suky | 0:74f5a741c618 | 61 | * variables to use in formating the string. |
Suky | 0:74f5a741c618 | 62 | */ |
Suky | 0:74f5a741c618 | 63 | int printf(const char* format, ...); |
Suky | 0:74f5a741c618 | 64 | #endif |
Suky | 0:74f5a741c618 | 65 | private: |
Suky | 0:74f5a741c618 | 66 | #define LcdType 2 // 0=5x7, 1=5x10, 2=varias lineas |
Suky | 0:74f5a741c618 | 67 | #define LCD_LINE_1_ADDRESS 0x00 |
Suky | 0:74f5a741c618 | 68 | #define LCD_LINE_2_ADDRESS 0x40 |
Suky | 0:74f5a741c618 | 69 | #define LCD_LINE_3_ADDRESS 0x14 |
Suky | 0:74f5a741c618 | 70 | #define LCD_LINE_4_ADDRESS 0x54 |
Suky | 0:74f5a741c618 | 71 | #define LCD_COMMAND 0 |
Suky | 0:74f5a741c618 | 72 | #define LCD_DATA 1 |
Suky | 0:74f5a741c618 | 73 | DigitalOut _DATA,_CLK,_E,_BACK; |
Suky | 0:74f5a741c618 | 74 | char NLinea; |
Suky | 0:74f5a741c618 | 75 | // Stream implementation functions |
Suky | 0:74f5a741c618 | 76 | virtual int _putc(int value); |
Suky | 0:74f5a741c618 | 77 | virtual int _getc(); |
Suky | 0:74f5a741c618 | 78 | virtual void vWriteLCD(char Data,char Type); |
Suky | 0:74f5a741c618 | 79 | virtual void vSetCGRAM(const char *Data); |
Suky | 0:74f5a741c618 | 80 | }; |
Suky | 0:74f5a741c618 | 81 | |
Suky | 0:74f5a741c618 | 82 | |
Suky | 0:74f5a741c618 | 83 | LCDSerial::LCDSerial(PinName DATA,PinName CLK,PinName E,PinName BACK) |
Suky | 0:74f5a741c618 | 84 | :_DATA(DATA),_CLK(CLK),_E(E),_BACK(BACK){ |
Suky | 0:74f5a741c618 | 85 | char Temp; |
Suky | 0:74f5a741c618 | 86 | |
Suky | 0:74f5a741c618 | 87 | NLinea=1; |
Suky | 0:74f5a741c618 | 88 | wait_ms(15); |
Suky | 0:74f5a741c618 | 89 | _DATA=0; |
Suky | 0:74f5a741c618 | 90 | _CLK=0; |
Suky | 0:74f5a741c618 | 91 | _E=0; |
Suky | 0:74f5a741c618 | 92 | _BACK=0; |
Suky | 0:74f5a741c618 | 93 | |
Suky | 0:74f5a741c618 | 94 | for(int k=0;k<8;k++){ |
Suky | 0:74f5a741c618 | 95 | _CLK=1; |
Suky | 0:74f5a741c618 | 96 | wait_us(1); |
Suky | 0:74f5a741c618 | 97 | _CLK=0; |
Suky | 0:74f5a741c618 | 98 | wait_us(1); |
Suky | 0:74f5a741c618 | 99 | } |
Suky | 0:74f5a741c618 | 100 | |
Suky | 0:74f5a741c618 | 101 | Temp=0x03; |
Suky | 0:74f5a741c618 | 102 | for(int k=0;k<8;k++){ |
Suky | 0:74f5a741c618 | 103 | _DATA=!!(Temp&0x80); |
Suky | 0:74f5a741c618 | 104 | Temp<<=1; |
Suky | 0:74f5a741c618 | 105 | _CLK=1; |
Suky | 0:74f5a741c618 | 106 | wait_us(1); |
Suky | 0:74f5a741c618 | 107 | _CLK=0; |
Suky | 0:74f5a741c618 | 108 | } |
Suky | 0:74f5a741c618 | 109 | for(int k=0;k<3;k++){ |
Suky | 0:74f5a741c618 | 110 | _E=1; |
Suky | 0:74f5a741c618 | 111 | wait_ms(2); |
Suky | 0:74f5a741c618 | 112 | _E=0; |
Suky | 0:74f5a741c618 | 113 | wait_ms(2); |
Suky | 0:74f5a741c618 | 114 | } |
Suky | 0:74f5a741c618 | 115 | Temp=0x02; |
Suky | 0:74f5a741c618 | 116 | for(int k=0;k<8;k++){ |
Suky | 0:74f5a741c618 | 117 | _DATA=!!(Temp&0x80); |
Suky | 0:74f5a741c618 | 118 | Temp<<=1; |
Suky | 0:74f5a741c618 | 119 | _CLK=1; |
Suky | 0:74f5a741c618 | 120 | wait_us(1); |
Suky | 0:74f5a741c618 | 121 | _CLK=0; |
Suky | 0:74f5a741c618 | 122 | } |
Suky | 0:74f5a741c618 | 123 | _E=1; |
Suky | 0:74f5a741c618 | 124 | wait_us(1); |
Suky | 0:74f5a741c618 | 125 | _E=0; |
Suky | 0:74f5a741c618 | 126 | |
Suky | 0:74f5a741c618 | 127 | vWriteLCD(0x20 | (LcdType<<2),LCD_COMMAND); // Tipo display.- |
Suky | 0:74f5a741c618 | 128 | wait_ms(2); |
Suky | 0:74f5a741c618 | 129 | vWriteLCD(0x01,LCD_COMMAND); // Borramos display.- |
Suky | 0:74f5a741c618 | 130 | wait_ms(2); |
Suky | 0:74f5a741c618 | 131 | vWriteLCD(0x06,LCD_COMMAND); // Incrementa cursor.- |
Suky | 0:74f5a741c618 | 132 | vWriteLCD(0x0C,LCD_COMMAND); // Encendemos display.- |
Suky | 0:74f5a741c618 | 133 | vSetCGRAM(CGRAM_DATA); // Guardamos data en CGRAM.- |
Suky | 0:74f5a741c618 | 134 | } |
Suky | 0:74f5a741c618 | 135 | |
Suky | 0:74f5a741c618 | 136 | void LCDSerial::vWriteLCD(char Data,char Type){ |
Suky | 0:74f5a741c618 | 137 | char data_temp; |
Suky | 0:74f5a741c618 | 138 | |
Suky | 0:74f5a741c618 | 139 | |
Suky | 0:74f5a741c618 | 140 | wait_us(100); |
Suky | 0:74f5a741c618 | 141 | |
Suky | 0:74f5a741c618 | 142 | data_temp=(Data>>4); // Rs es bit 4 |
Suky | 0:74f5a741c618 | 143 | if(Type){ |
Suky | 0:74f5a741c618 | 144 | data_temp|=0x10; |
Suky | 0:74f5a741c618 | 145 | } |
Suky | 0:74f5a741c618 | 146 | for(int i=0;i<8;i++){ |
Suky | 0:74f5a741c618 | 147 | _DATA=!!(data_temp & 0x80); |
Suky | 0:74f5a741c618 | 148 | data_temp<<=1; |
Suky | 0:74f5a741c618 | 149 | _CLK=1; |
Suky | 0:74f5a741c618 | 150 | wait_us(1); |
Suky | 0:74f5a741c618 | 151 | _CLK=0; |
Suky | 0:74f5a741c618 | 152 | } |
Suky | 0:74f5a741c618 | 153 | |
Suky | 0:74f5a741c618 | 154 | _E = 1; |
Suky | 0:74f5a741c618 | 155 | wait_us(1); |
Suky | 0:74f5a741c618 | 156 | _E = 0; |
Suky | 0:74f5a741c618 | 157 | data_temp=(Data&0x0F); // Rs es bit 4 |
Suky | 0:74f5a741c618 | 158 | if(Type){ |
Suky | 0:74f5a741c618 | 159 | data_temp|=0x10; |
Suky | 0:74f5a741c618 | 160 | } |
Suky | 0:74f5a741c618 | 161 | for(int i=0;i<8;i++){ |
Suky | 0:74f5a741c618 | 162 | _DATA=!!(data_temp & 0x80); |
Suky | 0:74f5a741c618 | 163 | data_temp<<=1; |
Suky | 0:74f5a741c618 | 164 | _CLK=1; |
Suky | 0:74f5a741c618 | 165 | wait_us(1); |
Suky | 0:74f5a741c618 | 166 | _CLK=0; |
Suky | 0:74f5a741c618 | 167 | } |
Suky | 0:74f5a741c618 | 168 | _E = 1; |
Suky | 0:74f5a741c618 | 169 | wait_us(1); |
Suky | 0:74f5a741c618 | 170 | _E = 0; |
Suky | 0:74f5a741c618 | 171 | |
Suky | 0:74f5a741c618 | 172 | } |
Suky | 0:74f5a741c618 | 173 | |
Suky | 0:74f5a741c618 | 174 | void LCDSerial::vGotoxy(char x,char y){ |
Suky | 0:74f5a741c618 | 175 | char Direccion; |
Suky | 0:74f5a741c618 | 176 | |
Suky | 0:74f5a741c618 | 177 | switch(y){ |
Suky | 0:74f5a741c618 | 178 | case 1:Direccion = LCD_LINE_1_ADDRESS;NLinea=1;break; |
Suky | 0:74f5a741c618 | 179 | case 2:Direccion = LCD_LINE_2_ADDRESS;NLinea=2;break; |
Suky | 0:74f5a741c618 | 180 | case 3:Direccion = LCD_LINE_3_ADDRESS;NLinea=3;break; |
Suky | 0:74f5a741c618 | 181 | case 4:Direccion = LCD_LINE_4_ADDRESS;NLinea=4;break; |
Suky | 0:74f5a741c618 | 182 | default:Direccion = LCD_LINE_1_ADDRESS;NLinea=1;break; |
Suky | 0:74f5a741c618 | 183 | } |
Suky | 0:74f5a741c618 | 184 | |
Suky | 0:74f5a741c618 | 185 | Direccion+=x-1; |
Suky | 0:74f5a741c618 | 186 | vWriteLCD(0x80|Direccion,LCD_COMMAND); |
Suky | 0:74f5a741c618 | 187 | } |
Suky | 0:74f5a741c618 | 188 | |
Suky | 0:74f5a741c618 | 189 | int LCDSerial::_getc(){ |
Suky | 0:74f5a741c618 | 190 | return(-1); |
Suky | 0:74f5a741c618 | 191 | } |
Suky | 0:74f5a741c618 | 192 | |
Suky | 0:74f5a741c618 | 193 | int LCDSerial::_putc(int value){ |
Suky | 0:74f5a741c618 | 194 | |
Suky | 0:74f5a741c618 | 195 | switch(value){ |
Suky | 0:74f5a741c618 | 196 | case '\f': |
Suky | 0:74f5a741c618 | 197 | vWriteLCD(0x01,LCD_COMMAND); |
Suky | 0:74f5a741c618 | 198 | NLinea=1; |
Suky | 0:74f5a741c618 | 199 | wait_ms(2); |
Suky | 0:74f5a741c618 | 200 | break; |
Suky | 0:74f5a741c618 | 201 | case '\n': |
Suky | 0:74f5a741c618 | 202 | vGotoxy(1,++NLinea); |
Suky | 0:74f5a741c618 | 203 | break; |
Suky | 0:74f5a741c618 | 204 | default: |
Suky | 0:74f5a741c618 | 205 | vWriteLCD(value,LCD_DATA); |
Suky | 0:74f5a741c618 | 206 | } |
Suky | 0:74f5a741c618 | 207 | |
Suky | 0:74f5a741c618 | 208 | return(value); |
Suky | 0:74f5a741c618 | 209 | } |
Suky | 0:74f5a741c618 | 210 | |
Suky | 0:74f5a741c618 | 211 | void LCDSerial::vSetBacklight(bool Value){ |
Suky | 0:74f5a741c618 | 212 | _BACK=Value; |
Suky | 0:74f5a741c618 | 213 | } |
Suky | 0:74f5a741c618 | 214 | |
Suky | 0:74f5a741c618 | 215 | void LCDSerial::vSetCGRAM(const char *Data){ |
Suky | 0:74f5a741c618 | 216 | |
Suky | 0:74f5a741c618 | 217 | vWriteLCD(0x40,LCD_COMMAND); |
Suky | 0:74f5a741c618 | 218 | for(int k=0;k<64;k++){ |
Suky | 0:74f5a741c618 | 219 | vWriteLCD(*Data++,LCD_DATA); |
Suky | 0:74f5a741c618 | 220 | } |
Suky | 0:74f5a741c618 | 221 | } |
Suky | 0:74f5a741c618 | 222 | |
Suky | 0:74f5a741c618 | 223 | void LCDSerial::vPutc(char Data){ |
Suky | 0:74f5a741c618 | 224 | _putc(Data); |
Suky | 0:74f5a741c618 | 225 | } |
Suky | 0:74f5a741c618 | 226 | |
Suky | 0:74f5a741c618 | 227 | void LCDSerial::vCommand(char Data){ |
Suky | 0:74f5a741c618 | 228 | vWriteLCD(Data,LCD_COMMAND); |
Suky | 0:74f5a741c618 | 229 | } |