Este tutorial incluye todo lo que necesita saber sobre el control de una pantalla LCD de caracteres con Arduino. He incluido un diagrama de cableado y muchos códigos de ejemplo. Estas pantallas son geniales para mostrar los datos de los sensores o el texto y también son bastante baratas.
La primera parte de este artículo cubre los fundamentos de la visualización de texto y números. En la segunda parte, entraré en más detalles sobre cómo mostrar caracteres personalizados y cómo puedes utilizar las otras funciones de la biblioteca LiquidCrystal Arduino.
Como verás, necesitas bastantes conexiones para controlar estas pantallas. Por eso me gusta usarlos con un módulo de interfaz I 2C montado en la parte trasera. Con este módulo I2C, sólo necesitas dos conexiones para controlar el LCD. Mira el tutorial de abajo si quieres usar un módulo I2C también:
Tutoriales recomendados:
Suministros
Componentes de hardware
LCD de 16×2 caracteres | × 1 | Amazon | |
LCD de 20×4 caracteres | × 1 | Amazon | |
Arduino Uno Rev3 | × 1 | Amazon | |
Tablero de pruebas | × 1 | Amazon | |
Cables de puente | ~ 10 | Amazon | |
Potenciómetro de 10 kΩ | × 1 | Amazon | |
Cable USB tipo A/B | × 1 | Amazon |
Software
Makerguides.com is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to products on Amazon.com. As an Amazon Associate we earn from qualifying purchases.
Resumen del hardware
Estas pantallas LCD están disponibles en muchos tamaños diferentes (16×2 1602, 20×4 2004, 16×1, etc.), pero todas utilizan el mismo chip controlador de LCD de interfaz paralela HD44780 de Hitachi. Esto significa que puede intercambiarlos fácilmente. Sólo tendrá que cambiar las especificaciones de tamaño en su código Arduino.
Especificaciones del LCD 16×2
Tensión de funcionamiento | 5 V |
Controlador | Controlador LCD Hitachi HD44780 |
Resolución de la pantalla | 2 líneas x 16 caracteres |
Resolución del carácter | 5 x 8 píxeles |
Dimensiones del módulo | 80 x 36 x 12 mm |
Dimensiones de la zona de visión | 64,5 x 16,4 mm |
Coste | Comprobar el precio |
Para obtener más información, puede consultar las hojas de datos siguientes. Las hojas de datos de 16×2 y 20×4 incluyen las dimensiones del LCD y en la hoja de datos de HD44780 puede encontrar más información sobre el controlador LCD de Hitachi.
Pinout de LCD 16×2
El LCD tiene 16 pines de conexión, numerados del 1 al 16 de izquierda a derecha.
En la siguiente tabla se indica la distribución de pines de una pantalla LCD HD44780 estándar:
Pin no. | Símbolo | Conexión | Función |
---|---|---|---|
1 | VSS | GND Arduino | Señal de tierra |
2 | VDD | 5 V Arduino | Alimentación lógica para el LCD |
3 | V0 | Potenciómetro de 10 kΩ | Ajuste del contraste |
4 | RS | Pin 2 Arduino | Señal de selección de registro |
5 | R/W | GND Arduino | Señal de selección de lectura/escritura |
6 | E | Pin 3 Arduino | Señal de habilitación de la operación |
7 - 14 | D0 - D7 | - | Líneas de bus de datos utilizadas para el modo de 8 bits |
11 - 14 | D4 - D7 | Pin 4 - 7 Arduino | Líneas de bus de datos utilizadas para el modo de 4 bits |
15 | A (LED+) | 5 V Arduino | Ánodo para la retroiluminación del LCD |
16 | K (LED-) | GND Arduino | Cátodo para la retroiluminación del LCD |
Prueba de la pantalla LCD y ajuste del contraste
Para probar la pantalla, tendrá que realizar las conexiones como se muestra en la figura siguiente.
La mayoría de los LCD tienen una resistencia en serie incorporada para la retroiluminación LED. Debería encontrarla en la parte posterior del LCD conectada al pin 15 (Ánodo). Si su pantalla no incluye una resistencia, tendrá que añadir una entre 5 V y el pin 15. Debería ser seguro usar una resistencia de 220Ω, pero este valor podría hacer que su pantalla se oscurezca un poco. Puedes consultar la hoja de datos para conocer la corriente máxima de la retroiluminación y utilizarla para seleccionar un valor de resistencia adecuado.
Después de haber cableado el LCD, tendrá que ajustar el contraste de la pantalla. Esto se hace girando el potenciómetro de 10 kΩ en el sentido de las agujas del reloj o en sentido contrario.
Enchufa el conector USB del Arduino para alimentar el LCD. Deberías ver la luz de fondo encendida. Ahora gire el potenciómetro hasta que aparezca una (LCD 16×2) o 2 filas (LCD 20×4) de rectángulos.
Puedes ajustar el contraste más tarde si es necesario.
Cómo conectar la pantalla LCD a Arduino UNO
Para controlar la pantalla LCD y mostrar los caracteres, tendrá que añadir algunas conexiones adicionales. Comprueba el diagrama de cableado de abajo y la tabla de pines de la introducción de este artículo.
Usaremos el LCD en modo de 4 bits, esto significa que no necesita conectar nada a D0-D3. El pin R/W se conecta a tierra, esto hará que el pin se ponga en LOW y que el LCD pase a modo WRITE.
Una vez que hayas cableado todo, podemos empezar a programar el LCD.
Código de ejemplo de Arduino para el LCD de caracteres
Para controlar el LCD usaremos la librería LiquidCrystal. Esta librería debería venir preinstalada con el IDE de Arduino. Puedes encontrarla yendo a Sketch > Include Library > LiquidCrystal.
La biblioteca LiquidCrystal viene con muchas funciones incorporadas y hace que el control de las pantallas LCD de caracteres sea muy fácil.
El código de ejemplo que sigue le muestra cómo mostrar un mensaje en el LCD. A continuación, le mostraré cómo funciona el código y cómo puede utilizar las otras funciones de la biblioteca LiquidCrystal.
/* Basic Arduino example code for displaying text on 16x2, 20x4 etc. character LCDs. More info: www.www.makerguides.com */ // Include the library: #include// Create an LCD object. Parameters: (RS, E, D4, D5, D6, D7): LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7); void setup() { // Specify the LCD's number of columns and rows. Change to (20, 4) for a 20x4 LCD: lcd.begin(16, 2); } void loop() { // Set the cursor on the third column and the first row, counting starts at 0: lcd.setCursor(2, 0); // Print the string 'Hello World!': lcd.print("Hello World!"); // Set the cursor on the third column and the second row: lcd.setCursor(2, 1); // Print the string 'LCD tutorial': lcd.print("LCD tutorial"); }
Debería ver la siguiente salida en la pantalla LCD:
Cómo funciona el código
Después de incluir la biblioteca, el siguiente paso es crear una nueva instancia de la clase LiquidCrystal. Esto se hace con la función LiquidCrystal(rs, enable, d4, d5, d6, d7)
. Como parámetros utilizamos los pines de Arduino a los que hemos conectado la pantalla. Observa que hemos llamado a la pantalla 'lcd'. Puedes darle un nombre diferente si quieres, como 'menu_display'. Tendrás que cambiar 'lcd' por el nuevo nombre en el resto del sketch.
// Include the library: #include// Create an LCD object. Parameters: (RS, E, D4, D5, D6, D7): LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7);
En el setup()
la pantalla LCD se inicia con la función begin(cols,rows)
. Si utiliza una pantalla LCD de 20×4, cambie esta línea por lcd.begin(20,4);
void setup() { // Specify the LCD's number of columns and rows. Change to (20, 4) for a 20x4 LCD: lcd.begin(16, 2); }
En el loop()
el cursor se sitúa en la tercera columna y primera fila de la pantalla LCD con lcd.setCursor(2,0)
. Tenga en cuenta que el conteo comienza en 0, y el primer argumento especifica la columna. Si no se especifica la posición del cursor, el texto se imprimirá en la posición inicial por defecto (0,0) si la pantalla está vacía, o detrás del último carácter impreso.
A continuación, se imprime la cadena "¡Hola Mundo!" con lcd.print("Hello World!")
. Tenga en cuenta que debe colocar comillas (" ") alrededor del texto. Si desea imprimir números o variables, no son necesarias las comillas.
void loop() { // Set the cursor on the third column and the first row, counting starts at 0: lcd.setCursor(2, 0); // Print the string 'Hello World!': lcd.print("Hello World!"); // Set the cursor on the third column and the second row: lcd.setCursor(2, 1); // Print the string 'LCD tutorial': lcd.print("LCD tutorial"); }
Si quieres ver un ejemplo para mostrar (cambiar) las variables en la pantalla LCD, echa un vistazo a mi tutorial para el sensor de distancia ultrasónico HC-SR04:
En el ejemplo he utilizado una pantalla LCD I2C pero el código después de la configuración es el mismo para ambos.
Otras funciones de la biblioteca LiquidCrystal
La librería LiquidCrystal Arduino tiene muchas otras funciones incorporadas que pueden resultarle útiles. A continuación puede encontrar un resumen de las mismas con una explicación y algunos fragmentos de código.
clear()
Borra la pantalla LCD y coloca el cursor en la esquina superior izquierda (primera fila y primera columna) de la pantalla. Puede utilizar esta función para mostrar diferentes palabras en un bucle.
#include// Creates an LCD object. Parameters: (RS, E, D4, D5, D6, D7) LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7); void setup() { lcd.begin(16, 2); } void loop() { lcd.clear(); lcd.print("Monday"); delay(2000); lcd.clear(); lcd.print("13:45"); delay(2000); }
casa()
Posiciona el cursor en la esquina superior izquierda de la pantalla LCD. Utilice clear() si también desea borrar la pantalla.
cursor()
Muestra el cursor de la pantalla LCD: un guión bajo (línea) en la posición del siguiente carácter a imprimir.
noCursor()
Oculta el cursor del LCD. El siguiente ejemplo crea un cursor parpadeante al final de "cursor()".
#include// Creates an LCD object. Parameters: (RS, E, D4, D5, D6, D7) LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7); void setup() { lcd.begin(16, 2); lcd.print("cursor()"); } void loop() { lcd.cursor(); delay(500); lcd.noCursor(); delay(500); }
parpadeo()
Crea un cursor LCD estilo bloque parpadeante: un rectángulo parpadeante en la posición del siguiente carácter a imprimir.
noBlink()
Desactiva el cursor LCD de estilo bloque. El siguiente ejemplo muestra el cursor parpadeante durante 5 segundos y luego lo desactiva durante 2 segundos.
#include// Creates an LCD object. Parameters: (RS, E, D4, D5, D6, D7) LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7); void setup() { lcd.begin(16, 2); lcd.print("blink() example"); } void loop() { lcd.blink(); delay(5000); lcd.noBlink(); delay(2000); }
mostrar()
Esta función enciende la pantalla LCD y muestra el texto o los cursores que se han impreso en la pantalla.
noDisplay()
Esta función desactiva cualquier texto o cursores impresos en la pantalla LCD. El texto/datos no se borra de la memoria del LCD. Esto significa que se mostrará de nuevo cuando se llame a la función display().
El siguiente ejemplo crea un efecto de texto parpadeante.
#include// Creates an LCD object. Parameters: (RS, E, D4, D5, D6, D7) LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7); void setup() { lcd.begin(16, 2); lcd.print("Blinking text"); } void loop() { lcd.display(); delay(2000); lcd.noDisplay(); delay(2000); }
escribir()
Esta función se puede utilizar para escribir un carácter en la pantalla LCD. Consulte la sección sobre la creación y visualización de caracteres personalizados más abajo para obtener más información.
scrollDisplayLeft()
Desplaza el contenido de la pantalla (texto y cursor) un espacio a la izquierda. Puedes utilizar esta función en la sección de bucle del código en combinación con delay(500), para crear una animación de texto en desplazamiento.
#include// Creates an LCD object. Parameters: (RS, E, D4, D5, D6, D7) LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7); void setup() { lcd.begin(16, 2); lcd.print("scrollDisplayLeft() example"); } void loop() { lcd.scrollDisplayLeft(); delay(500); }
scrollDisplayRight()
Desplaza el contenido de la pantalla (texto y cursor) un espacio hacia la derecha.
autoscroll()
Esta función activa el desplazamiento automático de la pantalla LCD. Esto hace que cada carácter emitido en la pantalla desplace los caracteres anteriores un espacio. Si la dirección actual del texto es de izquierda a derecha (por defecto), la pantalla se desplaza hacia la izquierda; si la dirección actual es de derecha a izquierda, la pantalla se desplaza hacia la derecha. Esto tiene el efecto de imprimir cada nuevo carácter en la misma ubicación en la pantalla LCD.
El siguiente ejemplo de sketch habilita el desplazamiento automático e imprime el carácter 0 a 9 en la posición (16,0) de la LCD. Cambie esto a (20,0) para una LCD de 20×4.
#include// Creates an LCD object. Parameters: (RS, E, D4, D5, D6, D7) LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7); void setup() { lcd.begin(16, 2); } void loop() { lcd.autoscroll(); lcd.setCursor(16, 0); for (int x = 0; x < 10; x++) { lcd.print(x); delay(500); } lcd.clear(); }
noAutoscroll()
Desactiva el desplazamiento automático de la pantalla LCD.
leftToRight()
Esta función hace que el texto fluya hacia la derecha desde el cursor, como si la pantalla estuviera justificada a la izquierda (por defecto).
rightToLeft()
Esta función hace que el texto fluya hacia la izquierda desde el cursor, como si la pantalla estuviera justificada a la derecha.
¿Cómo se crean y se muestran los caracteres personalizados?
Con la función createChar()
es posible crear y mostrar caracteres personalizados en la pantalla LCD. Esto es especialmente útil si desea mostrar un carácter que no forma parte del conjunto de caracteres ASCII estándar.
Información técnica: Las pantallas LCD que se basan en el controlador LCD Hitachi HD44780 tienen dos tipos de memoria: CGROM y CGRAM (Character Generator ROM y RAM). CGROM genera todos los patrones de caracteres de 5 x 8 puntos a partir de los códigos de caracteres estándar de 8 bits. La CGRAM puede generar patrones de caracteres definidos por el usuario.
Para pantallas de 5 x 8 puntos, CGRAM puede escribir hasta 8 caracteres personalizados y para pantallas de 5 x 10 puntos 4. Para más información, consulte la hoja de datos.
Caracteres personalizados Código de ejemplo de Arduino
El siguiente ejemplo de sketch crea y muestra ocho caracteres personalizados (numerados del 0 al 7).
/* Example sketch to create and display custom characters on character LCD with Arduino and LiquidCrystal library. For more info see www.www.makerguides.com */ #include// Creates an LCD object. Parameters: (RS, E, D4, D5, D6, D7) LiquidCrystal lcd = LiquidCrystal(2, 3, 4, 5, 6, 7); // Make custom characters: byte Heart[] = { B00000, B01010, B11111, B11111, B01110, B00100, B00000, B00000 }; byte Bell[] = { B00100, B01110, B01110, B01110, B11111, B00000, B00100, B00000 }; byte Alien[] = { B11111, B10101, B11111, B11111, B01110, B01010, B11011, B00000 }; byte Check[] = { B00000, B00001, B00011, B10110, B11100, B01000, B00000, B00000 }; byte Speaker[] = { B00001, B00011, B01111, B01111, B01111, B00011, B00001, B00000 }; byte Sound[] = { B00001, B00011, B00101, B01001, B01001, B01011, B11011, B11000 }; byte Skull[] = { B00000, B01110, B10101, B11011, B01110, B01110, B00000, B00000 }; byte Lock[] = { B01110, B10001, B10001, B11111, B11011, B11011, B11111, B00000 }; void setup() { // Specify the LCD's number of columns and rows: lcd.begin(16, 2); // Create a new characters: lcd.createChar(0, Heart); lcd.createChar(1, Bell); lcd.createChar(2, Alien); lcd.createChar(3, Check); lcd.createChar(4, Speaker); lcd.createChar(5, Sound); lcd.createChar(6, Skull); lcd.createChar(7, Lock); // Clears the LCD screen: lcd.clear(); // Print a message to the lcd: lcd.print("Custom Character"); } void loop() { // Print all the custom characters: lcd.setCursor(0, 1); lcd.write(byte(0)); lcd.setCursor(2, 1); lcd.write(byte(1)); lcd.setCursor(4, 1); lcd.write(byte(2)); lcd.setCursor(6, 1); lcd.write(byte(3)); lcd.setCursor(8, 1); lcd.write(byte(4)); lcd.setCursor(10, 1); lcd.write(byte(5)); lcd.setCursor(12, 1); lcd.write(byte(6)); lcd.setCursor(14, 1); lcd.write(byte(7)); }
Debería ver la siguiente salida en la pantalla LCD:
Cómo funciona el código
Después de incluir la biblioteca y crear el objeto LCD, se definen las matrices de caracteres personalizadas. Cada matriz consta de 8 bytes, 1 byte por cada fila. En este ejemplo se crean 8 caracteres personalizados.
// Make custom characters: byte Heart[] = { B00000, B01010, B11111, B11111, B01110, B00100, B00000, B00000 };
Al observar detenidamente la matriz, verá lo siguiente. Cada fila consta de 5 números que corresponden a los 5 píxeles de un carácter de 5 x 8 puntos. Un 0 significa píxel apagado y un 1 significa píxel encendido.
Es posible editar cada fila a mano, pero recomiendo utilizar esta herramienta visual en GitHub. Esta aplicación crea automáticamente la matriz de caracteres y puedes hacer clic en los píxeles para activarlos o desactivarlos.
En el setup()
Los caracteres personalizados se crean con lcd.createChar(num, data)
.
El primer argumento de esta función es el número del carácter personalizado (0-7) y el segundo argumento es la matriz de caracteres que hemos creado.
// Create a new characters: lcd.createChar(0, Heart); lcd.createChar(1, Bell); lcd.createChar(2, Alien); lcd.createChar(3, Check); lcd.createChar(4, Speaker); lcd.createChar(5, Sound); lcd.createChar(6, Skull); lcd.createChar(7, Lock);
En el loop()
todos los caracteres se muestran con lcd.write()
. Como parámetro utilizamos el número del carácter que reservamos.
lcd.setCursor(0, 1); lcd.write(byte(0));
Conclusión
En este artículo te he mostrado cómo utilizar una pantalla LCD alfanumérica con Arduino. Espero que lo hayas encontrado útil e informativo. Si lo has hecho, ¡compártelo con un amigo al que también le guste la electrónica y hacer cosas!
Me encantaría saber qué proyectos planeas construir (o ya has construido) con estos LCDs. Si tienes alguna pregunta, sugerencia, o si crees que faltan cosas en este tutorial, por favor deja un comentario abajo.
Tenga en cuenta que los comentarios son retenidos por la moderación para evitar el spam.
Benne is professional Systems Engineer with a deep expertise in Arduino and a passion for DIY projects.
Soroush
Friday 16th of June 2023
Hi, information was very helpful. Thankssss!
George
Miércoles 7 de septiembre de 2022
He estado trasteando con la interfaz I2C con la pantalla lcd 16x2 en un stm32 blue pill. conseguir que la pantalla muestre hola mundo no es un problema. Sin embargo estuve trasteando con otro programa que usa una pantalla de diferente tamaño y estuve trasteando con ella y encontré que puedo cambiar las letras para que sean claras con un fondo azul más oscuro a diferencia de la letra oscura estándar con fondo azul claro que es difícil de leer. ¿Tiene alguna idea de lo que la configuración o comandos permite esta inversión de las imágenes a los cambios de fondo? Ayudaría a ver la pantalla con claridad. ¡Gracias de antemano!
John
Sábado 12 de marzo de 2022
La mejor información sobre LCD que he encontrado, sencilla y directa. John
Pete Oster
Jueves 1 de julio de 2021
Tengo una placa de circuito con una pantalla LED de 2 dígitos. ¿Es posible utilizar una configuración como esta para cablear una pantalla digital remota fuera de la placa de circuito original. La placa de circuito original está dentro de un gabinete, y necesito poder leerla en el exterior del gabinete.
ali elsabaa
Martes 4 de mayo de 2021
Muchas gracias por esta importante información. mi primer proyecto será un simple seguidor de línea y utilizaré la pantalla LCD para mostrar los puntos por los que he pasado durante la línea de la pista, y mostrar también la palabra derecha o izquierda cuando el coche está girando