FRDM-KL46Z_LCD_Test Versión Corregida y Aumentada. Soporte para Display LCD en Modo GPIO, I2C y SPI Correcciones a la Biblioteca TextLCD para completa funcionalidad

Dependencies:   TextLCD mbed

Files at this revision

API Documentation at this revision

Comitter:
Antulius
Date:
Thu Sep 22 05:12:45 2022 +0000
Commit message:
TextLCD Corregida y Aumentada

Changed in this revision

TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 261e911dcf75 TextLCD.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Thu Sep 22 05:12:45 2022 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/IPN-ESIME-ZACATENCO/code/TextLCD/#844090a5557e
diff -r 000000000000 -r 261e911dcf75 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Sep 22 05:12:45 2022 +0000
@@ -0,0 +1,745 @@
+/* ###########################################################################
+**    Archivo        : main.c
+**    Proyecto       : FRDM-KL46Z_LCD_Test
+**    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 prueba todas las configuraciones para operar un
+**         display LCD alfanumérico en modo de 4 bits
+**         - Utilizando los GPIO's
+**         - Utilizando el SPI y el C.I. SN74HC595 o CD4094
+**         - Utilizando el I2C y el Modulo PCF8574 y PCF8574A
+**         soporta las siguintes pantallas LCD alfanuméricas:
+**         1x8, 1x16, 2x16, 2x20, 4x16, 4x20
+**   Componentes     : GPIO, Timer, SPI, I2C, TextLCD.
+**   Configuraciones : TextLCD, TextLCD_SPI, TextLCD_I2C
+**   Autores         :
+**         ATEAM Development Group:
+**          - Antulio Morgado Valle
+**
+**   Versión        : Beta
+**   Revisión       : A
+**   Release        : 0
+**   Date           : 20/10/2019
+**   Bugs & Fixes   :
+**                    Added support for Led_RGB
+**                    22/09/2018 
+**                    Added LCD Menu, Beta version (with bugs)
+**
+** El permiso se otorga por este medio, sin cargo, a cualquier persona que 
+** obtenga una copia de este software y los archivos de documentación asociados
+** (el "Software"), para operar en el Software sin restricciones, incluidos, 
+** entre otros, los derechos de uso, copia, modificación, fusión, publicación, 
+** distribución, sublicencia y/o venta de copias de el Software, y para permitir
+** que las personas a quienes se suministra el Software lo hagan, sujeto a las 
+** siguientes condiciones:
+**
+** El aviso de copyright anterior y este aviso de permiso se incluirán en todas
+** las copias o partes sustanciales del Software.
+**
+** EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESO
+** O IMPLÍCITO, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD,
+** APTITUD PARA UN PROPÓSITO PARTICULAR Y NO INCUMPLIMIENTO. EN NINGÚN CASO,
+** LOS AUTORES O TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES POR CUALQUIER
+** RECLAMACIÓN, DAÑOS U OTRAS RESPONSABILIDADES, YA QUE SEA RESPONSABLE DE UN
+** CONTRATO, CORTE U OTRA MANERA, DERIVADOS DE, FUERA O EN CONEXIÓN CON 
+** EL SOFTWARE O EL USO O OTRAS REPARACIONES EN EL SOFTWARE.
+** ###########################################################################*/
+/*
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:  Includes
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+*/
+#include "mbed.h"
+#include "TextLCD.h"
+#include "I2C.h"
+#include "SPI.h"
+#include "Serial.h" 
+#include "stdio.h"
+/*
+:...............................................................................
+:  Definiciones
+:...............................................................................
+*/
+#define ON              0           // Estado para boton presionado
+#define OFF             1           // Estado para boton sin presionar
+#define HOLD            2           // Estado para boton mantenido
+#define RELEASE         3           // Estado para boton liberado
+#define REPEAT          4           // Estado para boton repetido
+#define FALSE           0           // Estado FALSO
+#define TRUE            1           // Estado VERDADERO
+#define HIGH            1           // Estado ALTO
+#define LOW             0           // Estado BAJO
+#define BUZZ_ON         0           // Estado para Buzzer Encendido
+#define BUZZ_OFF        1           // Estado para Buzzer Apagado
+#define LCD_INTERFACE   1           // Tipo Interfaz del LCD: 0=Normal, 1=I2C, 2=SPI
+#define I2C_ADDRESS     0x7E        // Dirección I2C para Interfaz al LCD: 0x7E, 0x4E
+#define TICKER_RATE     1000        // Periodo de Interrupción (us)
+#define BAUD_RATE       115200      // Velocidad de Transmisión (Bauds))
+                                    // 300, 600, 1200, 2400, 4800, 9600,
+                                    // 14400, 19600, 28800, 38400, 57600
+                                    // 115200, 230400
+/*
++-------------------------------------------------------------------------------
+|  Configuración de Puertos 
++-------------------------------------------------------------------------------
+*/
+Ticker      TimerInt;               // Inicializa la Interrupción por Timer
+DigitalOut  led_monitor(LED2);      // Inicializa el LED Monitor
+PwmOut      buzzer (PTE31);         // Inicializa el PWM para el Buzzer
+PwmOut      backlight(PTA13);       // Inicializa el LED Backlight del LCD (Externo)
+AnalogIn    light (PTB0);           // Inicializa Canal Analógico para BackLight
+/*
+** -------------------------------------------------------------------
+**    Inicialización de los Pines de Funciones Especiales.
+** -------------------------------------------------------------------
+*/
+
+/*************************************************
+* Host PC Communication channels
+**************************************************/
+Serial      terminal(USBTX, USBRX); // Inicializa la Comunicación Serial a la PC
+//Serial      terminal(PTA2,PTA1);          // Terminal Serial
+//Serial      terminal(PTE0, PTE1);         // Tx, Rx Using MAX3232 or BlueTooth
+
+/*************************************************
+* Bluetooth Communication support
+************************************************** 
+* Initialize the library with the numbers of the interface pins
+* Board Freedom FRDM-KL46Z
+* IDE  Mbed On Line Compiler
+***************************************************/
+Serial   bluetooth(PTE0, PTE1);             // Tx, Rx
+
+/**************************************************
+* Instantiation for creating a TextLCD interface 
+* for using control and functions over selected port 
+***************************************************/
+// LCD instantiation 
+#if LCD_INTERFACE == 0
+/************************************************* 
+* GPIO Pin Port
+************************************************** 
+* Initialize the library with the numbers of the interface pins
+* Board Freedom FRDM-KL46Z
+* IDE  Mbed On Line Compiler
+* LCD    GPIO 
+* Pin    Board
+* VSS    5V
+* VDD    GND
+* VO     POT 1K
+* RS     PTC6 
+* RW     GND  
+* E      PTC7
+* D4     PTC8
+* D5     PTC9
+* D6     PTC10
+* D7     PTC11
+* BL+    PTA13 
+* BL-    GND 
+***************************************************/
+TextLCD lcd(PTC6,PTC7, PTC8, PTC9, PTC10, PTC11, TextLCD::LCD16x2); // 4bit bus: rs, e, d4-d7 (lsb -> msb) 
+DigitalOut  LE      (PTC4);                         // Pin para Latch Enable (SN74HC573)
+#endif
+#if LCD_INTERFACE == 1
+/************************************************* 
+* I2C Communication
+************************************************** 
+* Initialize the library with the numbers of the interface pins
+* Board Freedom FRDM-KL46Z
+* IDE  Mbed On Line Compiler
+* LCD  I2C              PCF8574A
+* Pin  Board            LCD
+*      I2C_SCL          SCL (white) + resistance pull-up 4.7k
+*      I2C_SDA          SDA (blue)  + resistance pull-up 4.7k
+*      5V               5V  (red)
+*      GND              GND (black)
+***************************************************/
+I2C         i2c_lcd(PTC2,PTC1);             // SDA, SCL
+TextLCD_I2C lcd(&i2c_lcd, I2C_ADDRESS, TextLCD::LCD20x4);  // Address 0x4E or 0x7E I2C bus, PCF8574A Arduino Shield, LCD Type
+#endif
+#if LCD_INTERFACE == 2
+/*************************************************
+* SPI Communication
+************************************************** 
+* Initialize the library with the numbers of the interface pins
+* Board Freedom FRDM-KL46Z
+* IDE  Mbed On Line Compiler
+* LCD  SPI  SN74HC595
+* Pin  Board     LCD
+*      SPI_MOSI  SER   (white) 
+*      SPI_MISO  none  (blue)  
+*      SPI_CLK   SRCLK
+*      SPI_PCS   RCLK
+*      5V        5V  (red)
+*      GND       GND (black)
+***************************************************/
+SPI         spi_lcd(PTD6,PTD7,PTD5,PTD4);   // MOSI, MISO, SCLK, SSEL
+DigitalOut  SSel(PTD4);                     // Inicializa el Pin de Seleccion de Esclavo SPI
+TextLCD_SPI lcd(&spi_lcd, PTD4, TextLCD::LCD20x4, TextLCD::HD44780);    // SPI bus, SN74595 expander, CS pin, LCD Type 
+#endif
+
+/*
+** ===================================================================
+**     Variables Globales del Programa
+** ===================================================================
+*/
+uint16_t Rate=TICKER_RATE/2;    // Velocidad de barrido (500us = 0.5ms)
+uint16_t counter=250;           // Cuenta inicial de 250us
+uint16_t heartbeat;             // Contador de Overrunig
+/*
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+|  Definición de Funciones Prototipo y Rutinas de los Vectores de Interrupción
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+*/
+void Setup(void);                   // Rutina de Inicialización para el Hardware
+void Caratula(void);                // Carátula de Bienvenida
+void Ticker_OnInterrupt(void);      // Rutina de Atención para el Ticker
+void Buzzer_Beep(void);             // Pitidos del Buzzer
+void I2C_Scanner(void);             // Busca dispositivos conectados al bus I2C
+void Test_LCD(void);                // Prueba la operación del LCD
+void Blinking_Led(void);            // Rutina de Parpadeo del Led monitor
+/* END definitions */ 
+/*
+#===============================================================================
+|
+|               P R O G R A M A     P R I N C I P A L
+|
+#=============================================================================== 
+*/
+int main()
+{
+//=================== Secuencia  Principal =====================================
+  Setup();                  // Inicializa el Hardware
+  Caratula();               // Carátula de Bienvenida
+  lcd.cls();                // Limpia la Pantalla LCD
+//=================== Lazo Principal ===========================================
+  while (true)              // El Lazo del Programa principal está aquí !!!
+    {
+        lcd.cls();
+        lcd.locate(0,0);                  
+        lcd.printf("Bienvenidos Sean");       // El LCD saluda al Mundo
+        lcd.printf("    a la \n");              // y a la          
+        lcd.setInvert(ON);      
+        lcd.printf("Gloriosa ESIME !\n");       // Gloriosa ESIME ! 
+        lcd.setInvert(OFF);
+        lcd.locate(0,4);                  
+        lcd.printf("Flashings: %d",heartbeat); // Led Flasings Transcurridos
+        wait(0.5); 
+//        Blinking_Led();                 // Parapadeo del LED por Software                         
+    }
+}
+/* END main */
+
+/*
+................................................................................
+:  Rutinas de los Vectores de Interrupción
+................................................................................
+*/
+/*
+** ===================================================================
+**     Vector      :  Ticker_OnInterrupt()
+*/
+/*!
+**     @brief
+**         Called after Ticker is done, [Interrupt service/event]
+**         and it is enabled: 
+**         TimerInt.attach_us(&Ticker_OnInterrupt, TICKER_RATE);
+**         the event is enabled and will be executed every  [TICKER_RATE]
+**     @param
+**         UserDataPtr     - Pointer to the user or
+**                           RTOS specific data. The pointer is passed
+**                           as the parameter of Init method.
+*/
+/* ===================================================================*/
+void Ticker_OnInterrupt()           // Rutina de Atención al Ticker
+{
+    counter--;                      // Aquí va la Rutina de Servicio !
+    if (!counter)
+    {
+        led_monitor = !led_monitor; // Parapadeo del LED por Interrupción (Toggle the LED)
+        if(led_monitor==0) terminal.printf("Led Toggled %d Times!\r",heartbeat);
+        heartbeat++;                // Incrementa el contador de Pulsaciones
+        counter = Rate;             // Restablece el contador
+    }
+}
+/* END Events */   
+/*
+________________________________________________________________________________
+|
+|  Funciones Prototipo
+|_______________________________________________________________________________
+*/
+                // Las Funciones Prototipo van aquí !
+/*
+|-------------------------------------------------------------------------------
+|     Función     :     Caratula()
+|      
+|     Descripción :     Rutina que muestra la Carátula de Bienvenida en la  
+|                       Terminal Serial
+|
+|     Parámetros  :     Ninguno
+|          
+|     Retorna     :     Nada
+|-------------------------------------------------------------------------------
+*/
+void Caratula()                    // Carátula de Bienvenida
+{  terminal.printf ("\t\e[1;37;41mInstituto Politecnico Nacional\e[0m\n\r");
+  terminal.printf ("\e[1;37;42mESCUELA SUPERIOR DE INGENIERIA MECANICA Y ELECTRICA\e[0m\n\r\v");
+  terminal.printf ("\t\e[1;31;40mPrueba \e[1;35;40mde \e[1;33;40mla \e[1;34;40mPantalla \e[1;32;40mLCD \e[0m\n\r\v\v\e[0m");
+}
+/*
+|-------------------------------------------------------------------------------
+|     Función     :     Setup()
+|      
+|     Descripción :     Rutina para inicialización de los puertos y funciones 
+|                       de la Bluepill
+|
+|     Parámetros  :     Ninguno
+|          
+|     Retorna     :     Nada
+|-------------------------------------------------------------------------------
+*/
+void Setup()                    // Inicialización del Hardware del Sistema
+{
+    /* Inicia la comunicación la Terminal */ /* 115200 Bauds, 8 bits, 1 stop, N parity */
+  terminal.baud(115200);                 // Se inicia la comunicación serial.    
+  terminal.printf("Beginig Start Up, Please wait...\n\r"); 
+/* Prueba del Buzzer */    
+  terminal.printf("Testing Buzzer... \n\r");   
+  Buzzer_Beep();
+/* Inicialización del Bluetooth */      
+  bluetooth.baud(115200);                // Se inicia la comunicación Bluetooth.  
+//  bluetooth.scanf("%s", buf);          //Lee un carácter desde el Bluetooth
+//  bluetooth.printf("recv: %s", buf);   //Hace eco al Bluetooth
+//  terminal.printf("recv: %s\r\n", buf);  //Imprime en la Terminal el caracter recibido
+  bluetooth.printf("Bluetooth Starting OK! ... \n\r"); 
+  terminal.printf("Bluetooth Starting OK! ... \n\r"); 
+/* Configufración del Display LCD */    /* Mucho OjO !!! */
+#if LCD_INTERFACE == 1
+/* LCD Utilizando el I2C */
+  i2c_lcd.frequency(100000);    // Frecuencia de operación para el I2C
+  i2c_lcd.start();              // Inicio de operación para el I2C 
+  I2C_Scanner();                // Busca Dispositivos I2C conectados al Bus 
+  terminal.printf("I2C Initialzed...\n\r");  
+#endif
+#if LCD_INTERFACE == 2
+/* LCD Utilizando el Puerto SPI */
+  spi_lcd.frequency(1000000);   // Frecuencia de operación para el SPI = 1MHz
+  spi_lcd.format(8,0);          // Número de Bits y Modo de Operación para el SPI
+//  SPI1 -> SPIx_C1 |= 0x01;      // Formato de la Trama (LSBFE): 0 = MSB (default), 1= LSB
+  SSel=FALSE;                   // Desactiva el Latch del SN74HC595  
+  terminal.printf("SPI Initialzed...\n\r");
+#endif
+/* Prueba de operación de la Interfaz al LCD */
+#if LCD_INTERFACE == 1
+  terminal.printf("LCD on I2C interface Address: 0x%X, \n\r",I2C_ADDRESS);  
+#endif
+#if LCD_INTERFACE == 2
+  terminal.printf("LCD on SPI interface \n\r"); 
+  if ((SPI1 -> SPIx_C1 & 0x01) > 0) terminal.printf ("SPI LSB First \n\r");
+  else terminal.printf ("SPI MSB First \n\r");
+#endif
+/* Prueba de operación del LCD */
+  terminal.printf("LCD Test, please wait...\n\r");  
+  Test_LCD();                   // Rutina de prueba del LCD
+  terminal.printf("LCD Initialized Succesfuly...\n\r");
+/* Arranque de la interrupción por el Ticker */  
+  terminal.printf("Ticker Starting Now...\n\r"); 
+  TimerInt.attach_us(&Ticker_OnInterrupt, TICKER_RATE);   // Le asigna el periodo de interrupción de 1ms (TICKER_RATE=1000)
+}  // end of Setup 
+/*
+|-------------------------------------------------------------------------------
+|     Función     :     Test_LCD()
+|      
+|     Descripción :     Rutina para inicialización del LCD y funciones 
+|                       de la Bluepill
+|
+|     Parámetros  :     Ninguno
+|          
+|     Retorna     :     Nada
+|-------------------------------------------------------------------------------
+*/
+void Test_LCD()
+{
+//  lcd.init(TextLCD::LCDDatalength, 4 ); // Configura el LCD en Modo 4 Bits (Modo GPIO)
+  lcd.setBacklight(TextLCD::LightOn);            // Enciende la Iluminación de Fondo
+  lcd.setCursor(TextLCD::CurOff_BlkOff);         // Apaga el Cursor y Apaga el Parpadeo
+  lcd.cls();                            // Limpia la Pantalla LCD
+  lcd.locate(0,0);                      // Ubica cursor en Col, Ren
+  lcd.printf("Hello World!\n");         // El LCD saluda al Mundo!
+  lcd.setInvert(ON);
+  lcd.printf("Hola Mundo!\n");          // El LCD saluda al Mundo!
+  lcd.setInvert(OFF);
+  lcd.printf("Ciao Mondo!\n");          // El LCD saluda al Mundo!
+  lcd.setInvert(ON);
+  lcd.printf("Bonjour le Monde");       // El LCD saluda al Mundo!
+  wait(5); 
+  lcd.cls();                            // Limpia el Display LCD
+  lcd.setCursor(TextLCD::CurOn_BlkOn);           // Cursor Encendido, Parpadeo Encendido
+  terminal.printf("TextLCD Enhanced Test. Columns=%d, Rows=%d\n\r", lcd.columns(), lcd.rows());   
+  Timer Elpased_Time;                   // Inicializa el Tiempo a Transcurrir
+  Elpased_Time.start();                 // Comienza a contar el tiempo transcurrido
+  for (int row=0; row<lcd.rows(); row++)// Prueba toda la Pantalla
+  {
+    int col=0;      
+    terminal.printf("MemAddr(Col=%d, Row=%d)=0x%02X\n\r", col, row, lcd.getAddress(col, row)); 
+    lcd.putc('0' + row);                 // Enumera los renglones
+    for (col=1; col<lcd.columns()-1; col++) 
+    {    
+      lcd.putc('*');                    // Llena la linea con el carácter "*"
+    }
+  terminal.printf("MemAddr(Col=%d, Row=%d)=0x%02X\n\r", col, row, lcd.getAddress(col, row));      
+  lcd.putc('+');                        // Al final de la línea agrega el "+"
+  }  
+  Elpased_Time.stop();                  // Detiene el Contador de Ticks
+  terminal.printf("All my hard work took %f sec\r\n", Elpased_Time.read()); // Calcula el tiempo transcurrido
+  wait(1);                              // Espera por 1 segundo  
+  terminal.printf("LCD Display and TextLCD Enhanced Test Completed.\n\r");
+  wait(1);                              // Espera 1 segundo
+  lcd.cls();                            // Limpia la Pantalla
+//  lcd.setBacklight(TextLCD::LightOff);  // Apaga la Iluminación de Fondo  
+  lcd.setCursor(TextLCD::CurOff_BlkOn);          // Apaga el Cursor y Enciende el Parpadeo
+// Set and show user defined characters. A maximum of 8 UDCs are supported by the HD44780.
+// They are defined by a 5x7 bitpattern. 
+  lcd.setUDC(0, (char *) udc_0);        // Selecciona el caracter para el cursor |>
+  lcd.putc(0);                          // Lo imprime en la Pantalla LCD
+  lcd.printf(" LCD Ready... ");         // El LCD está listo para usarse  
+  wait(2);                              // Espera 2 segundos
+  lcd.setCursor(TextLCD::CurOff_BlkOff);         // Apaga el Cursor y Apaga el Parpadeo      
+  terminal.printf("LCD Starting OK! ... \n\r");
+}   // end of Test_LCD
+
+/*
+|-------------------------------------------------------------------------------
+|     Función     :     Buzzer_Beep()
+|      
+|     Descripción :     Rutina para prueba del Buzzer
+|
+|     Parámetros  :     Ninguno
+|          
+|     Retorna     :     Nada
+|-------------------------------------------------------------------------------
+*/
+void Buzzer_Beep()                      // Software routine for Buzzer Beep
+{
+//  terminal.printf("Testing Buzzer... \n\r");
+  buzzer = BUZZ_ON;
+  wait_ms(750);
+  buzzer = BUZZ_OFF;
+  wait_ms(125);
+  buzzer = BUZZ_ON;
+  wait_ms(250);
+  buzzer = BUZZ_OFF;   
+  wait_ms(125);
+  buzzer = BUZZ_ON;
+  wait_ms(500);
+  buzzer = BUZZ_OFF;
+//  terminal.printf("Buzzer OK ! \n\r");
+}  
+/*
+|-------------------------------------------------------------------------------
+|     Función     :     Blinking_Led()
+|      
+|     Descripción :     Rutina de parpadeo del Led por software
+|
+|     Parámetros  :     Ninguno
+|          
+|     Retorna     :     Nada
+|-------------------------------------------------------------------------------
+*/
+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
+}
+/*
+|-------------------------------------------------------------------------------
+|     Función     :     I2C_Scanner()
+|      
+|     Descripción :     Rutina de parpadeo del Led por software
+|
+|     Parámetros  :     Ninguno
+|          
+|     Retorna     :     Nada
+|-------------------------------------------------------------------------------
+*/
+void I2C_Scanner()
+{     
+#if LCD_INTERFACE == 1
+  terminal.printf ("I2C scanner. Scanning ...");
+  uint8_t count = 0;
+  char     test[] = { 0b00000000, 0b00000000, // RS=0, EN=1,0, LED+=1, NC, DB4=DB5=DB6=DB7=0 en datos
+                      0b01101100, 0b00101100, // RS=0, EN=1,0, LED+=1, NC, DB4=DB5=1 en datos,
+                      0b01101100, 0b00101100, // RS=0, EN=1,0, LED+=1, NC, DB4=DB5=1 en datos,
+                      0b01101100, 0b00101100, // RS=0, EN=1,0, LED+=1, NC, DB4=DB5=1 en datos, 
+                      0b01100100, 0b00100100, // RS=0, EN=1,0, LED+=1, NC, DB5=1 en datos,
+                      0b01100100, 0b00100100, // RS=0, EN=1,0, LED+=1, NC, DB5=1 en datos, 
+                      0b01100110, 0b00100001, // RS=0, EN=1,0, LED+=1, NC, DB7=N=1 2 líneas, DB6=F=0 5x7puntos,
+                      0b01100000, 0b00100000, // => Display ON/OFF Control.
+                      0b01100001, 0b00100001, // RS=0, EN=1,0, LED+=1, NC, DB7=1 (Display off, cursor off, blink off)
+                      0b01100000, 0b00100000, // => Display Clear.
+                      0b01101000, 0b00101000};// RS=0, EN=1,0, LED+=1, NC, DB4=1 en datos, (Cursor Home};  // Patrón de Prueba
+
+//  char     test[] = {0x55,0xAA,0x0F,0xF0,0xFF,0x00};// Patrón de Prueba    
+  i2c_lcd.frequency(100000);    // Frecuencia de operación para el I2C (100KHz)
+  i2c_lcd.start();              // Inicio de operación para el I2C  
+  for (int i = 8; i < 128; i++)
+  {
+    uint8_t acknoledge = i2c_lcd.write (i,test,22,1);    //(dirección, ap_datos, N°_datos, repetición) 
+    if (acknoledge == 0)
+      {
+      terminal.printf ("\n\rFound address: ");
+      terminal.printf ("%u DEC",i);         // Valor de la dirección en Decimal
+      terminal.printf (" (0x%x HEX)\n\r",i);// Valor de la dirección en Hexadecimal
+      char data = i2c_lcd.read (i);         // Lee el dato en la dirección       
+      terminal.printf ("Data: (0x%hd HEX)\n\r",data);  // Valor del último dato en la dirección en Hexadecimal
+      count++;
+
+      wait (1);                             // maybe unneeded?
+      }                                     // end of good response
+      led_monitor = !led_monitor;           // Parapadeo del LED       
+  }                                         // end of for loop
+  led_monitor = 1;                          // Apaga el LED
+  i2c_lcd.stop();                           // Fin de operación para el I2C    
+  terminal.printf ("\n\rDone.\n\r");
+  terminal.printf ("Found %d Device(s)\n\r",count);
+#endif 
+}  // end of I2C_Scanner                
+
+/* END Program */
+
+/*+-----------------------------------------------------------------------------       
+*+ 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
diff -r 000000000000 -r 261e911dcf75 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Sep 22 05:12:45 2022 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file