LCD Serial with shift register

Committer:
Suky
Date:
Sat Feb 12 22:29:22 2011 +0000
Revision:
2:1094a2af1c40
Parent:
1:edf1c14baee3

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }