FRDM-KL46Z_SquashedRaiders Es un ejemplo de un Vídeo Juego utilizando un Display LCD Alfanumérico

Dependencies:   mbed NewTextLCD

Revision:
1:37be6b6987bf
Parent:
0:542b2c739416
--- a/main.cpp	Fri May 31 00:38:50 2019 +0000
+++ b/main.cpp	Wed Jul 03 18:45:39 2019 +0000
@@ -1,18 +1,21 @@
 /* ###########################################################################
 **    Archivo        : main.c
-**    Proyecto       : FRDM-KL46Z_Plantilla
+**    Proyecto       : FRDM-KL46Z_SquashedRaiders
 **    Procesador     : MKL46Z256VLL4
 **    Herramienta    : Mbed
 **    Version        : Driver 01.01
 **    Compilador     : GNU C Compiler
 **    Fecha/Hora     : 14-07-2015, 11:48, # CodeGen: 0
 **    Descripción    :
-**         Este proyecto realiza un juego. El objetivo es eliminar aplastando
-    a cada ladrón que aparece en pantalla, mediante la flecha que aparece
-    en la pantalla LCD. Esto se logra presionando el botón de la tarjeta.
+**         Este proyecto es un video juego. El objetivo es eliminar aplastando
+**         a cada ladrón que aparece en pantalla, mediante la flecha que aparece
+**         en la pantalla lcd. Esto se logra presionando el botón de la tarjeta.
 **         This module contains user's application code.
-**   Componentes     : GPIO, Timer, etc .
+**   Componentes     : NewTextLCD, GPIO, ect.
 **   Configuraciones : Includes, Stacks y Drivers externos
+**   Autores         :
+**         ATEAM Development Group:
+**          - Antulio Morgado Valle
 **
 **   Versión        : Beta
 **   Revisión       : A
@@ -21,7 +24,7 @@
 **   Date           : 20/10/2019
 **                    Added support for Led_RGB
 **                    22/09/2018 
-**                    Added LCD Menu, Beta version (with bugs)
+**                    Added lcd Menu, Beta version (with bugs)
 **
 * ###########################################################################/
 
@@ -36,34 +39,41 @@
 :  Definiciones
 :...............................................................................
 */
-#define Ticker_Rate     1000            // Periodo de interrupción (us)
+#define on  0
+#define off 1
 /*
 +-------------------------------------------------------------------------------
 |  Configuración de Puertos 
 +-------------------------------------------------------------------------------
 */
-Ticker      Barrido;                // Inicializa la Interrupción por Timer
-DigitalOut  led_monitor(LED1);      // Inicializa el LED Monitor
-PwmOut      servo(PTE22);           // Inicializa el PWM
-AnalogIn    sensor1 (PTB0);         // Inicializa Canal Analógico para sensor 1
-Serial      terminal(USBTX, USBRX); // Inicializa la Comunicación Serial a la PC
+DigitalIn   push(SW1,PullUp);           // Botón Derecho (SW1)
+DigitalOut  led_monitor(LED1);          // Inicializa el LED Monitor
+Serial      terminal(USBTX, USBRX);     // Inicializa la Comunicación Serial a la PC
+// I2C Communication
+//I2C         lcd(PTC2,PTC1);             // SDA, SCL
+// SPI Communication
+//SPI         lcd(PTD6,PTD7,PTD5,PTD4);   // MOSI, MISO, SCLK, SSEL
+// LCD instantiation 
+//TextLCD_SPI lcd(&lcd, PTD4, Textlcd::lcd16x4, TextLCD::HD44780);    // SPI bus, SN74595 expander, CS pin, lcd Type 
+//TextLCD_I2C lcd(&i2c_LCD, 0x7E, TextLCD::LCD20x4);                  // I2C bus, PCF8574A Arduino Shield, LCD Type
+TextLCD lcd(PTA1,PTA2,PTD3,PTA12,PTA4,PTA5,TextLCD::LCD20x4);       // HD44780: R/S, E, DB4, DB5, DB6, DB7 
+
 /*
 +-------------------------------------------------------------------------------
 |  Variables Globales de Usuario 
 +-------------------------------------------------------------------------------
 */
-uint16_t Rate=Ticker_Rate/2;        // Velocidad de barrido (500us = 0.5ms)
-uint16_t counter=250;               // Cuenta inicial de 250us
+int pattern[8];
+int pattern1[8];
+int pattern2[8];
+
 /*
 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 |  Definición de Funciones Prototipo y Rutinas de los Vectores de Interrupción
 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 */
-void Barrido_OnInterrupt(void);  
-void Blinking_Led(void); 
-
-TextLCD lcd(PTA1,PTA2,PTD3,PTA12,PTA4,PTA5,TextLCD::LCD20x4);
-DigitalIn push(SW1);
+                // Las Definiciones de Funciones Prototipo 
+                // y Apuntadores a Vectores de Interrupciones van aquí !
 /*
 #===============================================================================
 |
@@ -73,84 +83,83 @@
 */
 int main()
 {
-                // Inicialización de variables, puertos e interrupciones
-Barrido.attach_us(&Barrido_OnInterrupt, Rate);   // Le asigna el periodo de barrido de 1ms (Rate=1000)
+                // Definición del Primer Patrón
+    pattern[0] = 0x0e;      //  0b00001110     ***
+    pattern[1] = 0x0a;      //  0b00001010     * *
+    pattern[2] = 0x0e;      //  0b00001110     *** 
+    pattern[3] = 0x04;      //  0b00000100      * 
+    pattern[4] = 0x1f;      //  0b00011111    *****     
+    pattern[5] = 0x04;      //  0b00000100      * 
+    pattern[6] = 0x0a;      //  0b00000100     * * 
+    pattern[7] = 0x0a;      //  0b00000100     * *
+                // Definición del Segundo Patrón   
+    pattern1[0] = 0x0e;     //  0b00001110     ***
+    pattern1[1] = 0x0a;     //  0b00001010     * *
+    pattern1[2] = 0x0e;     //  0b00001110     ***
+    pattern1[3] = 0x15;     //  0b00010101    * * *
+    pattern1[4] = 0x0e;     //  0b00001110     ***
+    pattern1[5] = 0x04;     //  0b00000100      * 
+    pattern1[6] = 0x0a;     //  0b00001010     * *
+    pattern1[7] = 0x11;     //  0b00010001    *   *
+                // Definición del Tercer Patrón
+    pattern2[0] = 0x04;     //  0b00000100      *
+    pattern2[1] = 0x0e;     //  0b00001110     ***
+    pattern2[2] = 0x1f;     //  0b00001111    *****
+    pattern2[3] = 0x04;     //  0b00000100      *
+    pattern2[4] = 0x04;     //  0b00000100      *
+    pattern2[5] = 0x04;     //  0b00000100      *
+    pattern2[6] = 0x04;     //  0b00000100      * 
+    pattern2[7] = 0x0e;     //  0b00001110     ***  
 
 terminal.baud(115200);      // Se configura la velocidad de transmisión e inicia la comunicación serial.    
 terminal.printf(" System is Wake Up!.\n\r"); 
 
-    while (true)                // El Lazo del Programa principal está aquí !!!
-    {
-//        Blinking_Led();             // Parapadeo del LED por Software
-        servo = sensor1.read(); 
-//        terminal.printf("Blink \r\n");                           
-    }
-    
-    int pattern[8];
-    pattern[0] = 0x0e;           //  *
-    pattern[1] = 0x0a;           //  * *
-    pattern[2] = 0x0e;           //  * 
-    pattern[3] = 0x04;           //   * 
-    pattern[4] = 0x1f;           // ***     
-    pattern[5] = 0x04;           //   * 
-    pattern[6] = 0x0a;           //  * * 
-    pattern[7] = 0x0a;           //  * *
-    int pattern1[8];
-    pattern1[0] = 0x0e;           //  *
-    pattern1[1] = 0x0a;           //  * *
-    pattern1[2] = 0x0e;           //  * 
-    pattern1[3] = 0x15;           // * * *
-    pattern1[4] = 0x0e;           //  *     
-    pattern1[5] = 0x04;           //   * 
-    pattern1[6] = 0x0a;           //  * * 
-    pattern1[7] = 0x11;           // *   *
-    int pattern2[8];
-    pattern2[0] = 0x04;           //   *
-    pattern2[1] = 0x0e;           //  *
-    pattern2[2] = 0x1f;           // *** 
-    pattern2[3] = 0x04;           //   * 
-    pattern2[4] = 0x04;           //   *     
-    pattern2[5] = 0x04;           //   * 
-    pattern2[6] = 0x04;           //   * 
-    pattern2[7] = 0x0e;           //  *
+/* Configufración del Display lcd */    /* Mucho OjO !!! */
+/* lcd Utilizando el SPI */   
+//  lcd.frequency(100000);      // Frecuencia de operación para el SPI
+//  lcd.format(8,0);            // Modo de Operación para el SPI
+
+                // Inicialización de los patrones en la CGRAM
     lcd.writeCGRAM(0, pattern);
     lcd.writeCGRAM(1, pattern1);
     lcd.writeCGRAM(2, pattern2);
     /*Las líneas anteriores permiten realizar las figuras
     para el juego, como la flecha y los movimientos de
     los ladrones*/
-    INICIO:
+INICIO:
     int i=0,j=0,y=0,p=0;
-    uint16_t time=15;        //en ms
-    while(push==1){
-    if(i==9||i==19)y++;
-    if(i==29){
-        y++;
-        i=0;
-    }
-    if(j==20)j=0,y=0;
-    p=y%2;
-    lcd.locate(2,1);
-    lcd.putc(p);
-    lcd.locate(17,1);
-    lcd.putc(p);
-    lcd.locate(4,1);
-    lcd.printf("Get all the\n      raiders!");
-    wait_ms(time);
-    i++;
-    lcd.cls();
+    uint16_t time=15;           // tiempo en ms
+    while(push==1)              // Si no se oprime el Botón
+    {
+        if(i==9||i==19)y++;
+        if(i==29)
+        {
+            y++;
+            i=0;
+        }
+        if(j==20)j=0,y=0;
+        p=y%2;
+        lcd.locate(2,1);
+        lcd.putc(p);
+        lcd.locate(17,1);
+        lcd.putc(p);
+        lcd.locate(4,1);
+        lcd.printf("Get all the\n      raiders!");
+        wait_ms(time);
+        i++;
+        lcd.cls();
     }
     lcd.cls();
     lcd.locate(7,1);
-    lcd.printf("START!");
+    lcd.printf("INICIO!");
     wait(1);
-    lcd.cls();
+    lcd.cls();                          // Limpia laPantalla LCD
     uint8_t atrapados=0,fallos=0,faltan=7;
     //Se muestran textos que dan indicaciones del juego.
     i=0;
    while(true){
     //***Siempre en pantalla*****
-        lcd.locate(0,0);                //* 
+        lcd.locate(0,0);                // Inicio del LCD 
         lcd.printf("Missing %i    Fails %i",faltan,fallos);
         lcd.locate(9,1);
         lcd.printf(">%i",atrapados);
@@ -170,15 +179,19 @@
         wait_ms(time);
         i++;
         lcd.cls();
-    //***Capturando al ladrón**
+    //***Capturando al ladrón***
         if(j>=5&&j<=13)time=6;
         else time=15;
         
-        if(push==0){
+        if(push==0)           // Si se oprime el Botón
+        {
             lcd.locate(11,2);
             lcd.putc(2);
+            led_monitor=on;
             wait_ms(500);
-            if(j==11){
+            led_monitor=off;
+            if(j==11)
+            {
                 faltan--;
                 atrapados++;
                 lcd.cls();
@@ -188,7 +201,8 @@
                 i=0;
                 wait(1);
             }
-            else{
+            else
+            {
                 lcd.cls();
                 lcd.locate(6,1);
                 lcd.printf("FALLASTE!");
@@ -198,11 +212,13 @@
                 wait(1);
             }
         }
-        else{
+        else
+        {
             lcd.locate(11,3);
             lcd.putc(2);
         }
-        if(j==19){
+        if(j==19)
+        {
             lcd.cls();
             lcd.locate(6,1);
             lcd.printf("FALLASTE!");
@@ -211,13 +227,15 @@
             i=0;
             wait(1);
         }
-        if(fallos==3){
+        if(fallos==3)
+        {
             lcd.locate(4,1);
             lcd.printf("Perdiste xD :(");
             wait(2);
             goto INICIO;
         }
-        if(atrapados==7){
+        if(atrapados==7)
+        {
             lcd.locate(4,1);
             lcd.printf("Ganaste! :D");
             wait(2);
@@ -233,34 +251,252 @@
 :  Rutinas de los Vectores de Interrupción
 ................................................................................
 */
-void Barrido_OnInterrupt()          // Rutina de Atención al Ticker
-{
-    counter--;                      // Aquí va la Rutina de Servicio !
-    if (!counter)
-    {
-        terminal.printf("Counter Finish! \r\n");
-        led_monitor = !led_monitor; // Parapadeo del LED por Interrupción (Toggle the LED)
-        counter = Rate;             // Restablece el contador
-    } 
-}
+                // Las Rutinas de Atención a Interrupciones van aquí !
+                
 /* END Events */   
 /*
-__________
+________________________________________________________________________________
 |
 |  Funciones Prototipo
-|_________
+|_______________________________________________________________________________
 */
                 // Las Funciones Prototipo van aquí !
-void Blinking_Led()             // Software Blinking routine for LED 
-{
-        // The on-board LED is connected, via a resistor, to +3.3V (not to GND). 
-        // So to turn the LED on or off we have to set it to 0 or 1 respectively
-        led_monitor = 0;        // turn the LED on
-        wait_ms(200);           // 200 millisecond
-        led_monitor = 1;        // turn the LED off
-        wait_ms(1000);          // 1000 millisecond
-}
+
+/* END functions */  
 
 /* END Program */
 
-/* END Mbed */
\ No newline at end of file
+/*+-----------------------------------------------------------------------------
+*+                 Conexiones al LCD
+*+
+*+ FRDM-KL46Z                PTA1,    PTA2, PTD3,PTA12,PTA4,PTA5  PWM   
+*+              GND Vcc POT       GND                                  GND
+*+ HD44780:     GNG Vcc Vee  R/S  RW   E    DB4   DB5  DB6  DB7   BL+  BL-    
+*+
+*+------------------------------------------------------------------------------       
+*+ Direccinamiento de la RAM del Display:
+*+ 
+*+ Los módulos de 8x1 (obsoletos) están arreglados como una líneas de 
+*+ 8 caracteres de lada a lado.
+*+  "Linea 1" Las direcciones comienzan en 80h a 87h
+*+
+*+ Los módulos de 16x1 están arreglados como dos líneas de 8 caracteres de lada a lado.
+*+  "Linea 1" Las direcciones comienzan en 80h a 87h (primera parte de la línea)
+*+  "Linea 1" Las direcciones comienzan en C0h a C7h (segunda parte de la línea)
+*+  de manera que al escribir caracteres al módulo, el cursor se incrementará automaticamente
+*+  hasta alcanzar el 9° caracter entonces tendrá que mover el cursor a la dirección C0h antes
+*+  de escribir el 9° caracter en el módulo de 1x16.
+*+  
+*+  Módulo de 16x2 es dos líneas por 16 caracteres
+*+  "Linea 1" Las direcciones comienzan en 80h a 8Fh
+*+  "Linea 2" Las direcciones comienzan en C0h a CFh
+*+
+*+  Módulo de 16x4 
+*+  "Linea 1" Las direcciones comienzan en 80h a 8Fh
+*+  "Linea 2" Las direcciones comienzan en C0h a CFh
+*+  "Linea 3" Las direcciones comienzan en 90h a 9Fh
+*+  "Linea 4" Las direcciones comienzan en D0h a DFh
+*+    
+*+  Módulo de 20x1 
+*+  "Linea 1" Las direcciones comienzan en 80h a 93h
+*+  
+*+  Módulo de 20x2 
+*+  "Linea 1" Las direcciones comienzan en 80h a 93h
+*+  "Linea 2" Las direcciones comienzan en C0h a D3h
+*+  
+*+  Módulo de 20x4 
+*+  "Linea 1" Las direcciones comienzan en 80h a 93h
+*+  "Linea 2" Las direcciones comienzan en C0h a D3h
+*+  "Linea 3" Las direcciones comienzan en 94h a A7h
+*+  "Linea 4" Las direcciones comienzan en D4h a E7h
+*+  
+*+  Módulo de 24x2 
+*+  "Linea 1" Las direcciones comienzan en 80h a 98h
+*+  "Linea 2" Las direcciones comienzan en C0h a D8h
+*+  
+*+  Módulo de 32x2 
+*+  "Linea 1" Las direcciones comienzan en 80h a A0h
+*+  "Linea 2" Las direcciones comienzan en C0h a E0h
+*+
+*+  Módulo de 40x2 
+*+  "Linea 1" Las direcciones comienzan en 80h a A7h
+*+  "Linea 2" Las direcciones comienzna en C0h a E7h
+*+ 
+*+
+*+--------------------------------------------------------------------------- */ 
+
+/*+-----------------------------------------------------------------------------
+*+ Inicializaci¢n del Display de Cristal Líquido Alfanumérico en modo de 4 bits
+*+
+*+ Definici¢n de pines:
+*+                            __      Vdd GND
+*+             MOSI MISO SCK SS       |   |    
+*+               |   |   |   |       10K  |   
+*+               |   |   |   |        |   |    
+*+ CD 4094     DATA NC CLOCK STROBE  NC  OE  QS  ---> DATA en la siguiente etapa
+*+ 74HC 595     SER NC SCLK RCLK    SCLR  G  QH' ---> SER en la siguiente etapa
+*+
+*+ CD 4094      Q1  Q2  Q3  Q4   Q5  Q6  Q7  Q8
+*+ 74HC 595     QA  QB  QC  QD   QE  QF  QG  QH
+*+               |   |   |   |    |   |   |   |
+*+               |   |   |   |    |   |   |   |               
+*+ HD44780      R/S  RW  E  BL   DB4 DB5 DB6 DB7 
+*+
+*+ Notas: El pin RW del LCD debe estar estar siempre en "L" o conectado a GND.
+*+        El pin E2 es usado solo para el LCD40x4 (segundo controlador)
+*+        La señal BL = LED+ y debe ser usado para control del Backlight
+*+        Para enviar cualquier dato o instrucci¢n hay que hacer una   _
+*+        transici¢n de bajo a alto en el pin de E (Enable) del LCD. _| |_
+*+
+*+------------------------------------------------------------------------------
+*+
+*+ Ubicaciónn de pines:
+*+      ---------------------------------------------------------------------
+*+      |  _______________________________________________________________  |
+*+      | |                                                               | |
+*+      | |                                                               | |
+*+      | |                                                               | |
+*+      | |                                                               | |
+*+      | |                                                               | |
+*+      | |                                                               | |
+*+      | |_______________________________________________________________| |
+*+      |                                                                   |
+*+      ---------------------------------------------------------------------
+*+                          |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
+*+                          |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
+*+                          16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1
+*+
+*+   1   Vss - GND
+*+   2   Vdd - Vcc
+*+   3   Vee - Ajuste de contraste
+*+   4   RS  - (Register/String) 0=Entrada de Instrucción, 1=Entrada de Dato 
+*+   5   RW  - Lectura/Escritura 0=Escribe al LCD, 1=Lee del LCD
+*+   6   E   - Señal de Habilitación  "101"
+*+   7   DB0 - Línea 0 del bus de datos
+*+   8   DB1 - Línea 1 del bus de datos
+*+   9   DB2 - Línea 2 del bus de datos
+*+   10  DB3 - Línea 3 del bus de datos  _
+*+   11  DB4 - Línea 4 del bus de datos   |
+*+   12  DB5 - Línea 5 del bus de datos    \  Operación en 4 bits
+*+   13  DB6 - Línea 6 del bus de datos    / 
+*+   14  DB7 - Línea 7 del bus de datos  _|
+*+   15  LED+  Ánodo  Backlight
+*+   16  LED-  Cátodo Backlight 
+*+
+*+------------------------------------------------------------------------------                                 
+*+
+*+  +5V ------------*----------- Vcc          PTE19 PTE18 PTE20 PTE21 PTE22 PTE23                
+*+                  |                           RS    E    D4    D5    D6    D7 
+*+                  /
+*+          10k to  \<---------- Vee          R/W ---> GND  
+*+          20k pot /                         A   ---> PWM1 o   R=330 ---> Vcc
+*+                  \                         K   ---> GND
+*+                  |
+*+  GND ------------*----------- Vss
+*+
+*+------------------------------------------------------------------------------
+*+      
+*+ Definici¢n de bits:
+*+
+*+ I/D=1:   (Increment/Decrement) Incremento (+) del Cursor
+*+ I/D=0:   (Increment/Decrement) Decremento (-) del Cursor
+*+ D=0:     (Display) Apaga el Display
+*+ D=1:     (Display) Enciende el Display
+*+ C=0:     (Cursor) Apaga el Cursor
+*+ C=1:     (Cursor) Enciende el Cursor
+*+ B=0:     (Blinking) Apaga el parpadeo del Cursor
+*+ B=1:     (Blinking) Enciende el parpadeo del Cursor
+*+ S=0:     (Shift) Sin corrimiento del Display
+*+ S=1:     (Shift) Con corrimiento del Display
+*+ S/C=1:   (Shift/Cursor) Con corrimiento del Display
+*+ S/C=0:   (Shift/Cursor) Con Movimiento del Cursor
+*+ R/L=1:   (Right/Left) Corrimiento a la Derecha
+*+ R/L=0:   (Right/Left) Corrimiento a la Izquierda
+*+ DL=1:    (Data Lenght) 8 Bits de datos
+*+ DL=0:    (Data Lenght) 4 Bits de datos
+*+ N=1:     (Number Lines) Modo de 2 Líneas de despliege
+*+ N=0:     (Number Lines) Modo de 1 Línea de despliege
+*+ F=1:     (Font) 5X10 Puntos por caracter
+*+ F=0:     (Font) 5X7 Puntos por caracter
+*+ BF=1:    (Busy Flag) Operación interna en proceso
+*+ BF=0:    (Busy Flag) Listo para aceptar instrucciones/datos
+*+ DDRAM:   (Display Data Ram)
+*+ CGRAM:   (Character Generator RAM)
+*+ ACC:     Address of CGRAM
+*+ ADD:     Address of DDRAM These correspond to curser addresses.
+*+ AC:      Address counter used for both DDRAM and CGRAM
+*+
+*+                              RS RW  MSB                         LSB 
+*+ Clear Display                0  0    0   0   0   0   0   0   0   1
+*+ Cursor at Home               0  0    0   0   0   0   0   0   1   0
+*+ Entry Mode Set               0  0    0   0   0   0   0   1  I/D  S
+*+ Display ON/OFF control       0  0    0   0   0   0   1   D   C   B
+*+ Cursor/Display Shift         0  0    0   0   0   1  S/C R/L  x   x
+*+ Function Set                 0  0    0   0   1   DL  N   F   x   x
+*+ CGRAM                        0  0    0   1   -------- ACC --------
+*+ DDRAM                        0  0    1   ---------- ADD ----------
+*+ Busy Flag/Address Read       0  1    1   -----------AC------------
+*+ CGRAM/CDDRAM Data Write      1  0            Write Data
+*+ CGRAM/CDDRAM Data Read       1  1            Read  Data
+*+
+*+
+*+ Tiempos de Ejecución:
+*+ Dependiendo del Oscilador Interno del LCD los tiempos de ejecución de las 
+*+ instrucciones pueden variar.
+*+                                          Fosc
+*+   INSTRUCCION            160Khz          250Khz          270Khz
+*+   Clear Display          120us~4.9ms     82us~1.6ms      40us~1.5ms
+*+   Cursor Home            120us           40~1.6ms        37us~1.5ms
+*+   Todas las demás        120us           40us            37us
+*+   Lectura/Escritura      120us           40us            37us
+*+   Lectura de Busy Flag   1us             1us             1us
+
+*+   El controlador podría estar en modo de 8 bits (reinicio de encendido)
+*+   o en modo de 4 bits (reinicio en caliente) en este punto.
+*+   Siga este procedimiento para asegurarse de que el controlador entre en el
+*+   estado correcto. 
+*+
+*+******************************************************************************
+*+// Patrón de Configuración del LCD  en modo de 4 bits (LSN first)
+*+******************************************************************************
+*+   char init_LCD[] = {0b00000000, 0b00000000, // Datos en DB7=DB6=DB5=DB4=0, LED+=0, EN=0,RW=0,RS=0   
+*+                      0b00111110, 0b00111010, // Datos en DB5=DB4=1, LED+=1, EN=1,0,RW=1,RS=0
+*+                      0b00111110, 0b00111010, // Datos en DB5=DB4=1, LED+=1, EN=1,0,RW=1,RS=0
+*+                      0b00111110, 0b00111010, // Datos en DB5=DB4=1, LED+=1, EN=1,0,RW=1,RS=0 
+*+                      0b00101110, 0b00100010, // Datos en DB5=1, LED+=1, EN=1,0,RW=1,RS=0                       
+*+                      0b00101110, 0b00100010, // => Function Set Control: DB5=1, LED+=1, EN=1,0,RW=1,RS=0 
+*+                      0b10001110, 0b10001110, // => Function Set Control: DB7=N=1 2 líneas, DB6=F=0 5x7puntos, LED+=1, EN=1,0,RW=1,RS=0
+*+                      0b00001110, 0b00000010, // => Display ON/OFF Control: DB7=DB6=DB5=DB4=0, LED+=1, EN=1,0,RW=1,RS=0 
+*+                      0b00101110, 0b00100010, // => Display ON/OFF Control: DB7=1 (Display off, cursor off, blink off),LED+=1, EN=1,0,RW=1,RS=0
+*+                      0b00001110, 0b00000010, // => Display Clear: DB7=DB6=DB5=DB4=0, LED+=1, EN=1,0,RW=1,RS=0 
+*+                      0b00011110, 0b00010010, // => Display Clear: D4=1, LED+=1, EN=1,0,RW=1,RS=0
+*+                      0b00001110, 0b00000010, // => Cursor Home: DB7=DB6=DB5=DB4=0, LED+=1, EN=1,0,RW=1,RS=0                                          
+*+                      0b00101110, 0b00100010, // => Cursor Home: DB5=1, LED+=1, EN=1,0,RW=1,RS=0 , (Cursor Home};
+*+                      0b01001111, 0b00001011, // => Text 0x48: DB5=1, LED+=1, EN=1,0,RW=1,RS=1                                          
+*+                      0b10001111, 0b00101011, // => Text "H" : DB7=1, LED+=1, EN=1,0,RW=1,RS=1 , (ASCII "H"}
+*+                      0b01101111, 0b01101011, // => Text 0x6F: DB5=1, LED+=1, EN=1,0,RW=1,RS=1
+*+                      0b11111111, 0b11111011, // => Text "o" : DB7=DB6=DB5=DB4=1, LED+=1, EN=1,0,RW=1,RS=1 , (ASCII "o"}
+*+                      0b01101111, 0b01101011, // => Text 0x6C: DB6=DB5=1, LED+=1, EN=1,0,RW=1,RS=1                                          
+*+                      0b11001111, 0b11001011, // => Text "l" : DB7=DB6=1, LED+=1, EN=1,0,RW=1,RS=1 , (ASCII "l"}
+*+                      0b01101111, 0b01101011, // => Text 0x61: DB6=DB5=1, LED+=1, EN=1,0,RW=1,RS=1                                          
+*+                      0b00011111, 0b00011011, // => Text "a" : DB4=1, LED+=1, EN=1,0,RW=1,RS=1 , (ASCII "a"}
+*+                      0b00101111, 0b00101011, // => Text 0x21: DB5=1, LED+=1, EN=1,0,RW=1,RS=1                                          
+*+                      0b00011111, 0b00011011};// => Text "!" : DB4=1, LED+=1, EN=1,0,RW=1,RS=1 , (ASCII "!"}
+*+
+*+   La interfaz de hardware entre el MCU y la LCD  en modo de 8 bits solo puede 
+*+   recibir los 4 bits más significativos (Nibble más significativo, MSN) 
+*+   como instrucción para cambier a modo 4.
+*+   En el modo de 4 bits, la pantalla LCD espera el MSN primero, seguido del LSN.
+*+----------------------------------------------------------------------------*
+*+
+*+   Powered by
+*+
+*+          T H E     A N T U L I U ' S   T E A M   R&D  Unltd 
+*+
+*+  Research, Development, Systems, Equipment, Support & Spare Parts.
+*+  (C) Copyright 1989-2019, All Rights Reserved            
+*+
+*+  Welcome to The Beaners Proyect Community!                   
+*+----------------------------------------------------------------------------*/
+
+/* END Mbed */ 
\ No newline at end of file