Nota

¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. Profundiza en Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.

¿Por qué unirse?

  • Soporte Experto: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprender y Compartir: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Avances Exclusivos: Accede anticipadamente a anuncios de nuevos productos y avances.

  • Descuentos Especiales: Disfruta de descuentos exclusivos en nuestros productos más nuevos.

  • Promociones Festivas y Sorteos: Participa en sorteos y promociones navideñas.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy!

1.1.7 LCD1602 I2C

Introducción

El LCD1602 es un tipo de pantalla de cristal líquido que puede mostrar 32 (16*2) caracteres al mismo tiempo.

Componentes

../_images/list_i2c_lcd1.png

Principio

LCD1602 I2C

../_images/i2c_lcd16022.png
  • GND: Tierra

  • VCC: Suministro de voltaje, 5V.

  • SDA: Línea de datos en serie. Conéctala a VCC a través de una resistencia de pull-up.

  • SCL: Línea de reloj en serie. Conéctala a VCC a través de una resistencia de pull-up.

Como todos sabemos, aunque el LCD y algunas otras pantallas enriquecen enormemente la interacción hombre-máquina, comparten una debilidad común. Cuando se conectan a un controlador, múltiples pines de E/S serán ocupados por el controlador, que no tiene tantos puertos externos. Además, esto restringe otras funciones del controlador.

Por lo tanto, se ha desarrollado el LCD1602 con un módulo I2C para resolver este problema. El módulo I2C tiene un chip PCF8574 integrado que convierte los datos en serie I2C a datos paralelos para la pantalla LCD.

Dirección I2C

La dirección predeterminada es, básicamente, 0x27, aunque en algunos casos puede ser 0x3F.

Tomando como ejemplo la dirección predeterminada de 0x27, la dirección del dispositivo puede modificarse conectando las almohadillas A0/A1/A2; en el estado predeterminado, A0/A1/A2 es 1, y si la almohadilla está conectada, A0/A1/A2 es 0.

../_images/i2c_address2.jpg

Retroiluminación/Contraste

La retroiluminación se puede habilitar mediante un capuchón de puente, desenchufa el capuchón para desactivar la retroiluminación. El potenciómetro azul en la parte posterior se utiliza para ajustar el contraste (la relación de brillo entre el blanco más brillante y el negro más oscuro).

../_images/back_lcd16022.jpg
  • Capuchón de Puente: La retroiluminación se puede habilitar mediante este capuchón, desenchufa este capuchón para desactivar la retroiluminación.

  • Potenciómetro: Se utiliza para ajustar el contraste (la claridad del texto mostrado), que aumenta en dirección horaria y disminuye en dirección antihoraria.

Diagrama Esquemático

T-Board Name

physical

SDA1

Pin 3

SCL1

Pin 5

../_images/schematic_i2c_lcd1.png

Procedimientos Experimentales

Paso 1: Construye el circuito.

../_images/image961.png

Paso 2: Configura I2C (ver Configuración de I²C. Si ya has configurado I2C, omite este paso.)

Paso 3: Cambia de directorio.

cd ~/davinci-kit-for-raspberry-pi/c/1.1.7/

Paso 4: Compila.

gcc 1.1.7_Lcd1602.c -lwiringPi

Paso 5: Ejecuta.

sudo ./a.out

Después de ejecutar el código, podrás ver "Greetings", "From SunFounder" mostrando en el LCD.

Nota

  • Si aparece un mensaje de error wiringPi.h: No such file or directory, consulta ¿El código en C no funciona?.

  • Si recibes el error Unable to open I2C device: No such file or directory, debes consultar Configuración de I²C para habilitar I2C y verificar si el cableado es correcto.

  • Si el código y el cableado están bien, pero el LCD aún no muestra contenido, puedes girar el potenciómetro en la parte trasera para aumentar el contraste.

Código

#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <string.h>

int LCDAddr = 0x27;
int BLEN = 1;
int fd;

void write_word(int data){
    int temp = data;
    if ( BLEN == 1 )
        temp |= 0x08;
    else
        temp &= 0xF7;
    wiringPiI2CWrite(fd, temp);
}

void send_command(int comm){
    int buf;
    // Envía primero bit7-4
    buf = comm & 0xF0;
    buf |= 0x04;                    // RS = 0, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Hace EN = 0
    write_word(buf);

    // Envía segundo bit3-0
    buf = (comm & 0x0F) << 4;
    buf |= 0x04;                    // RS = 0, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Hace EN = 0
    write_word(buf);
}

void send_data(int data){
    int buf;
    // Envía primero bit7-4
    buf = data & 0xF0;
    buf |= 0x05;                    // RS = 1, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Hace EN = 0
    write_word(buf);

    // Envía segundo bit3-0
    buf = (data & 0x0F) << 4;
    buf |= 0x05;                    // RS = 1, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Hace EN = 0
    write_word(buf);
}

void init(){
    send_command(0x33);     // Debe inicializar en modo de 8 líneas primero
    delay(5);
    send_command(0x32);     // Luego inicializa en modo de 4 líneas
    delay(5);
    send_command(0x28);     // 2 Líneas y 5*7 puntos
    delay(5);
    send_command(0x0C);     // Habilita la pantalla sin cursor
    delay(5);
    send_command(0x01);     // Limpia la pantalla
    wiringPiI2CWrite(fd, 0x08);
}

void clear(){
    send_command(0x01);     //limpia la pantalla
}

void write(int x, int y, char data[]){
    int addr, i;
    int tmp;
    if (x < 0)  x = 0;
    if (x > 15) x = 15;
    if (y < 0)  y = 0;
    if (y > 1)  y = 1;

    // Mueve el cursor
    addr = 0x80 + 0x40 * y + x;
    send_command(addr);

    tmp = strlen(data);
    for (i = 0; i < tmp; i++){
        send_data(data[i]);
    }
}


void main(){
    fd = wiringPiI2CSetup(LCDAddr);
    init();
    write(0, 0, "Greetings!");
    write(1, 1, "From SunFounder");
}

Explicación del Código

void write_word(int data){……}
void send_command(int comm){……}
void send_data(int data){……}
void init(){……}
void clear(){……}
void write(int x, int y, char data[]){……}

Estas funciones se utilizan para controlar el código fuente del LCD1602 I2C. Nos permiten usar fácilmente el LCD1602 I2C. Entre estas funciones, init() se usa para la inicialización, clear() se usa para limpiar la pantalla, write() se utiliza para escribir lo que se muestra, y las otras funciones respaldan las anteriores.

fd = wiringPiI2CSetup(LCDAddr);

Esta función inicializa el sistema I2C con el símbolo del dispositivo especificado. El prototipo de la función:

int wiringPiI2CSetup(int devId);

Los parámetros devId son la dirección del dispositivo I2C, que se puede encontrar mediante el comando i2cdetect (ver Apéndice) y la devId del I2C LCD1602 es generalmente 0x27.

void write(int x, int y, char data[]){}

En esta función, data[] es el carácter que se imprimirá en el LCD, y los parámetros x e y determinan la posición de impresión (la línea y + 1, columna x + 1 es la posición inicial del carácter a imprimir).