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