Skip to Content

Cómo utilizar una pantalla LCD de 16×2 caracteres con Arduino

Cómo utilizar una pantalla LCD de 16×2 caracteres con Arduino

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

LCDLCD de 16×2 caracteres× 1Amazon
LCDLCD de 20×4 caracteres× 1Amazon
Arduino Uno Rev 3Arduino Uno Rev3× 1Amazon
Tablero de pruebas× 1Amazon
Cables de puente~ 10Amazon
Potenciómetro de 10 kΩ× 1Amazon
Cable USB tipo A/B× 1Amazon

Software

Arduino IDEArduino IDE

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 funcionamiento5 V
ControladorControlador LCD Hitachi HD44780
Resolución de la pantalla2 líneas x 16 caracteres
Resolución del carácter5 x 8 píxeles
Dimensiones del módulo80 x 36 x 12 mm
Dimensiones de la zona de visión64,5 x 16,4 mm
CosteComprobar 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.

LCD
Los pines de la parte superior de la pantalla está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ímboloConexiónFunción
1VSSGND ArduinoSeñal de tierra
2VDD5 V ArduinoAlimentación lógica para el LCD
3V0Potenciómetro de 10 kΩAjuste del contraste
4RSPin 2 ArduinoSeñal de selección de registro
5R/WGND ArduinoSeñal de selección de lectura/escritura
6EPin 3 ArduinoSeñal de habilitación de la operación
7 - 14D0 - D7-Líneas de bus de datos utilizadas para el modo de 8 bits
11 - 14D4 - D7Pin 4 - 7 ArduinoLíneas de bus de datos utilizadas para el modo de 4 bits
15A (LED+)5 V ArduinoÁnodo para la retroiluminación del LCD
16K (LED-)GND ArduinoCá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.

16x2-caracteres-lcd-con-arduino-uno-ajuste-cableado-de-contrastes
Cableado de ajuste del contraste

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.

16x2 lcd arduino ajuste de contraste
Gire el potenciómetro hasta que vea aparecer una fila 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.

16x2-caracteres-lcd-con-arduino-un-diagrama-cableado-esquema
LCD 16×2 con diagrama de cableado de Arduino

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 "LiquidCrystal.h"

// 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:

Salida LCD
Salida 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 "LiquidCrystal.h"

// 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 "LiquidCrystal.h"

// 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 "LiquidCrystal.h"

// 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 "LiquidCrystal.h"

// 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 "LiquidCrystal.h"

// 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 "LiquidCrystal.h"

// 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 "LiquidCrystal.h"

// 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 "LiquidCrystal.h"

// 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:

16x2-caracteres-lcd-arduino-tutorial-custom-characters
Salida 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.

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