Prueba todas las maneras de configurar una pantalla LCD alfanumérica

Dependencies:   FRDM_TSI TextLCD mbed

Files at this revision

API Documentation at this revision

Comitter:
Antulius
Date:
Wed May 08 07:39:20 2019 +0000
Parent:
7:af295ac5f904
Commit message:

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
diff -r af295ac5f904 -r 39219ab1efd9 TextLCD.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Wed May 08 07:39:20 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/IPN-ESIME-ZACATENCO/code/TextLCD/#844090a5557e
diff -r af295ac5f904 -r 39219ab1efd9 main.cpp
--- a/main.cpp	Wed May 08 03:37:52 2019 +0000
+++ b/main.cpp	Wed May 08 07:39:20 2019 +0000
@@ -1,6 +1,6 @@
 /* ###########################################################################
 **    Archivo        : main.c
-**    Proyecto       : FRDM-KL46Z_Plantilla
+**    Proyecto       : FRDM-KL46Z_LCD_Test
 **    Procesador     : MKL46Z256VLL4
 **    Herramienta    : Mbed
 **    Version        : Driver 01.01
@@ -18,8 +18,8 @@
 **   Versión        : Beta
 **   Revisión       : A
 **   Release        : 0
+**   Date           : 20/10/2019
 **   Bugs & Fixes   :
-**   Date           : 20/10/2019
 **                    Added support for Led_RGB
 **                    22/09/2018 
 **                    Added LCD Menu, Beta version (with bugs)
@@ -31,37 +31,114 @@
 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 */
 #include "mbed.h"
-
+#include "I2C.h"
+#include "SPI.h"
+#include "Serial.h" 
+#include "TextLCD.h"
+#include "stdio.h"
 /*
 :...............................................................................
 :  Definiciones
 :...............................................................................
 */
-#define Ticker_Rate     1000            // Periodo de interrupción (us)
+#define Ticker_Rate     1000        // Periodo de interrupción (us)
+#define LCD_Filas       4           // Número de Renglones del LCD
+#define LCD_Columnas    20          // Número de Caracteres x Renglón del LCD
+#define Buzz_On         1           // Estado para Buzzer Encendido
+#define Buzz_Off        0           // Estado para Buzzer Apagado
+#define on              0           // Estado para botón presionado
+#define off             1           // Estado para botón sin presionar
+#define hold            2           // Estado para botón mantenido presionado
+#define release         3           // Estado para botón al liberarse 
 /*
 +-------------------------------------------------------------------------------
 |  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
+Ticker      TimerInt;              // Inicializa la Interrupción por Timer
+DigitalOut  led_monitor(LED2); // Inicializa el LED Monitor
+DigitalOut  buzzer (PTE31);         // Inicializa el Buzzer Piezo Eléctrico
+//PwmOut      buzzer (PTE31);         // PWM Control del Elemento Calefactor
+/*
+** -------------------------------------------------------------------
+**    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
+
+/************************************************* 
+* 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
+
+/*************************************************
+* 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
+
+/*************************************************
+* LCD instantiation 
+**************************************************/ 
+//TextLCD LCD(PTC5, PTC6, PTC8, PTC9, PTC10, PCT11, TextLCD::LCD20x2); // 4bit bus: rs, e, d4-d7
+//TextLCD_I2C lcd(&i2c_lcd, 0x7E, TextLCD::LCD20x4);                   // I2C bus, PCF8574A Arduino Shield, LCD Type
+TextLCD_SPI lcd(&spi_lcd, PTD4, TextLCD::LCD16x4, TextLCD::HD44780);   // SPI bus, SN74595 expander, CS pin, LCD Type 
+
 /*
-+-------------------------------------------------------------------------------
-|  Variables Globales de Usuario 
-+-------------------------------------------------------------------------------
+** ===================================================================
+**     Variables Globales del Programa
+** ===================================================================
 */
 uint16_t Rate=Ticker_Rate/2;        // Velocidad de barrido (500us = 0.5ms)
 uint16_t counter=250;               // Cuenta inicial de 250us
+int16_t  N_Interrupciones;          // Contador de Overrunig
 /*
 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 |  Definición de Funciones Prototipo y Rutinas de los Vectores de Interrupción
 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 */
-void Barrido_OnInterrupt(void);  
-void Blinking_Led(void); 
+void setup(void);                   // Rutina de Inicialización para el Hardware
+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
 /*
 #===============================================================================
 |
@@ -72,16 +149,24 @@
 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)
-
-terminal.baud(115200);      // Se configura la velocidad de transmisión e inicia la comunicación serial.    
+terminal.baud(115200);          // Se configura la velocidad de transmisión e inicia la comunicación serial.    
 terminal.printf(" System is Wake Up!.\n\r"); 
+setup();                        //Inicializa el Hardware Principal
 
     while (true)                // El Lazo del Programa principal está aquí !!!
     {
-//        Blinking_Led();             // Parapadeo del LED por Software
-        servo = sensor1.read(); 
-//        terminal.printf("Blink \r\n");                           
+        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",N_Interrupciones); // Led Flasings Transcurridos
+        wait(0.5); 
+
+//        Blinking_Led();                 // Parapadeo del LED por Software                         
     }
 }
 /* END main */
@@ -91,15 +176,16 @@
 :  Rutinas de los Vectores de Interrupción
 ................................................................................
 */
-void Barrido_OnInterrupt()          // Rutina de Atención al Ticker
+void Ticker_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)
+        N_Interrupciones++;
         counter = Rate;             // Restablece el contador
-    } 
+    }
 }
 /* END Events */   
 /*
@@ -109,7 +195,99 @@
 |_______________________________________________________________________________
 */
                 // Las Funciones Prototipo van aquí !
-void Blinking_Led()             // Software Blinking routine for LED 
+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(" System is Wake Up!.\n\r"); 
+
+/* 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");       
+/* Prueba del Buzzer */    
+  terminal.printf("Testing Buzzer... \n\r");   
+  buzzer_beep();
+  
+/* Configufración del Display LCD */    /* Mucho OjO !!! */
+  
+/* LCD Utilizando el SPI */ 
+  spi_lcd.frequency(1000000);           // Frecuencia de operación para el SPI
+  spi_lcd.format(8,0);                  // Modo de Operación para el SPI
+ 
+/* LCD Utilizando el I2C */ 
+//  I2C_scanner();                // Busca Dispositivos I2C conectados al Bus 
+/*  i2c_lcd.frequency(100000);    // Frecuencia de operación para el I2C (100KHz)
+  i2c_lcd.start();              // Inicio de operación para el I2C
+//  lcd.setBacklight(LightOn );   // Enciende la luz de fondo del LCD
+  terminal.printf("I2C Initialized...\n\r");
+*/ 
+/* Prueba de operación del LCD */
+  terminal.printf("LCD Test, please wait...\n\r");  
+  test_LCD();                   // Rutina de pueba 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 barrido de 1ms (Ticker_Rate=1000)
+}  
+
+void test_LCD()
+{
+  lcd.cls();
+  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(10); 
+  lcd.cls();                            // Limpia el Display LCD
+  lcd.setBacklight(TextLCD::LightOff);  // Apaga la Iluminación de Fondo
+  Timer Elpased_Time;                   //Inicializa el Tiempo a Transcurrir
+  Elpased_Time.start();
+  for (int row=0; row<lcd.rows(); row++)// Prueba toda la Pantalla
+  {
+   uint16_t col=0; 
+    lcd.putc('0' + row);                
+    for (col=1; col<lcd.columns()-1; col++) 
+    {    
+      lcd.putc('*');                    // Llena lalinea con el carácter "*"
+    }
+    lcd.putc('+');                      // Al final pone el carácter "+"
+  }  
+  Elpased_Time.start();                 // Calcula el tiempo transcurrido
+  terminal.printf("All my hard work took %f sec\r\n", Elpased_Time.read());  
+  wait(1);  
+  terminal.printf("LCD Display and TextLCD Enhanced Test Completed.\n\r"); 
+  lcd.cls();  
+  lcd.setCursor(TextLCD::CurOff_BlkOn); //
+// 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);        // Muestra el cursor |>
+  lcd.putc(0);   
+  terminal.printf("LCD Starting OK! ... \n\r");       
+}
+
+void buzzer_beep()
+{
+    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;
+}  
+
+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
@@ -118,6 +296,47 @@
         led_monitor = 1;        // turn the LED off
         wait_ms(1000);          // 1000 millisecond
 }
+/*
+void I2C_scanner()
+{     
+  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[2] = {0x55,0xAA};// 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   
+//      terminal.printf (" (0x%hd HEX)\n\r",i);  // Valor de 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);
+}  // end of setup                 
+*/
 
 /* END Program */