Saltar al contenido
Control Automático Educación

Hola controleros y controleras en el dia de hoy vamos a aprender como incorporar una interfaz LCD I2C PIC, usando para ello el compilador CCS C PIC C Compiler.

Antes de comenzar te hago la invitación para que veas todo nuestro CURSO DE MICROCONTROLADORES PIC.

Interfaz LCD I2C PIC

En entradas anteriores hemos aprendido como manejar un LCD usando el microcontrolar PIC16F887, y vimos que para lograr la conexión de este periférico necesitábamos ocupar 7 pines del puerto B o del Puerto D del microcontrolador como lo vemos en el siguiente esquema:

Conexión LCD con PIC

Por eso existen dispositivos como el PCF8574T que es un expansor de Entradas y Salidas Digitales (click aquí para ver su DATASHEET) con el cual podríamos conectar el LCD y controlarlo con nuestro microcontrolador PIC usando el protocolo de comunicación Serial I2C.

PCF8574T

Sin embargo, el PCF8574T puede ser encontrado incorporado en un módulo ya listo o Interfaz LCD I2C para ser usado y donde solo bastaría conectar los 2 hilos de comunicación I2C (SDA y SCL) y 2 hilos de alimentación (VCC y GND)

Interfaz I2C LCD

Está claro que para poder manipular el LCD (click aquí para ver el DATASHEET) via I2C, primero deberemos saber como funciona dicha comunicación y cuales son los comandos del PIC C Compiler – CCS C disponibles para este fin. Es por eso que te invito a que veas la entrada donde explicamos en detalle y con varios videos la Comunicación I2C con PIC.

Librería LCD I2C para PIC

En esta entrada vamos a utilizar una librería llamada I2C_FLEX_LCD, elaborada por Hugo Silva, la cual me parece funciona perfectamente y tiene la ventaja de que sus funciones son parecidas a las funciones de la librería propia del PIC C Compiler. Yo le realicé una pequeña modificación a la librería para poder colocar la dirección del modulo y el tipo de LCD directamente en la función de inicialización.

Puedes Dar CLICK EN el Siguiente Botón para Descargarla:

Funciones de la Librería LCD I2C PIC.

Como veremos las funciones son exactamente las mismas que tiene la propia librería del LCD del PIC C Compiler:

Los pasos que se deben seguir para manejar el LCD son:
1. Incluir en el encabezado del programa la libreríá para manejar la comunicación I2C.

#use i2c(Master,Fast=100000, sda=PIN_B0, scl=PIN_B1,force_sw)

2. Incluir en el encabezado del programa el driver para manejar la interface LCD I2C.

#include <i2c_Flex_LCD.c>

3. En el programa principal se inicializa el driver. Esta parte de la librería fue modificada por mi mismo.

lcd_init(direccionI2C,filas,columnas);

direccionI2C= Es la dirección de los PINES A0, A1 y A2 del integrado( Por defecto viene en 0x4E)

filas= Número de filas del LCD

columnas= Número de columnas del LCD

La dirección puede ser cambiada directamente desde la interfaz LCD I2C como lo vemos en la siguiente imagen (Address) o si tienen el integrado es directamente de sus pines.

I2C LCD Interfaz

Basicamente, si no existe un puente de soldadura (Jumper) en A0, A1 y A2 (ese es el orden en que esta en la figura) indica un 1 lógico. A continuación se muestra las direcciones del integrado (vistas en el datasheet). Para la librería con el PIC, vamos a usar la dirección a 8 bits, si usas un Arduino, generalmente se usa la dirección a 7 bits.

Dirección de la Interfaz I2C LCD

4. Se usan las funciones del LCD que tiene implementadas el driver:

LCD_PUTC(c);// Muestra el caracter “C” en la próxima posición del LCD.

LCD_PUTC(“/f”);//Borra todo lo que haya en el display.

LCD_PUTC(“/n”);// Va al inicio de la segunda línea.

LCD_PUTC(“/b”); //Se mueve una posición hacia atrás.

LCD_GOTOXY(x,y); //Ubica el cursor en la posición indicada por “X” y ”Y”.

lcd_backlight_led(byte bl); //si b1=1 enciende la luz de fondo, si b1=0 apaga la luz de fondo

Ejemplo Interfaz I2C

Deben conectar la interfaz I2C LCD en los pines SDA y SCL respectivamente de el microcontrolador PIC que esten usndo. Dejo dos ejemplos a continuación:

Pines I2C del PIC18F4550 y el PIC16F887

Veamos el siguiente ejemplo de implementación de la librería LCD I2C con PIC18F4550. Si ustedes desean que haga un video explicando el funcionamiento de cada una de las funciones que compone esta librería, háganmelo saber en los comentarios.

i2c pic

 

 

Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:

👉 Invitar a Sergio a un Café ☕️

Que esten muy bien, nos vemos en la siguiente entrada.

Entradas relacionadas

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Comentarios (9)

Hola Sergio.

Estoy siguiendo tu ejemplo, salvo por el detalle que lo programo directamente desde MPLAB X y he tenido que realizar un cambio en la linea de código lcd_init(0x4E,2,16) por que me daba error de compilación y mirando la librería he visto que no hay parámetros de entrada de la función.

Desde que conecto la protoboard y alimento el LCD, en el mismo, se encienden todos los pixeles de la linea superior, y los de la inferior estan apagados. Y corro el programa tanto quemando el archivo en el pic, como haciendo debug. ¿Podría ser que mi PCF8574T este dañado?

Un saludo y gracias 🙂

Responder

Hola Igor, seguramente descargaste la librería de otro lugar. Si descargas la librería directamente desde este post, verás que yo le hice una modificación a la función lcd_init(0x4E,2,16) para adicionarle esos tres parámetros de entrada, eso está explicado en el video, de esa forma tienes la posibilidad de establecer la dirección especifica de tu módulo I2C. Baja la libería que hay aquí y intenta programar de nuevo tu PIC y me cuentas si conseguiste hacerlo. Saludos!!

Responder

Gracias por la respuesta, no he probado antes porque ando liado.

He probado con la librería de este post, y efectivamente el error de la linea lcd_init() ya no lo está. Pero mi LCD continua haciendo exactamente lo mismo. Todos los píxeles de la línea superior esta activa, mientras que los de la linea inferior están apagados.

Responder

Estoy manejando una seal pwm con el pic 16f887, implemento el uso de lcd por i2c como lo manejas en tu ejemplo. Mi práctica consiste en con el teclado matricial seleccionar la velocidad a la cual se quiere girar un motor dc, la cosa es que cuando uso el lcd i2c, el pwm no responde, y si uso el lcd sin i2c si funciona, podrías ayudarme de favor.

Responder

No se que podría estar pasandote, como has configurado tu PWM?

Responder

Para un periodo de 1ms como en tus ejemplos 🙁

Timer2=249;
Poscaler=1;
setup_timer_2(t2_div_by_4,Timer2,Poscaler);
setup_ccp1(ccp_pwm);

Responder

Pero cuando usas el LCD I2C a pesar de que el PWM no te funcione, consigues usar el LCD, es decir ver mensajes o escribir cualquier información via I2C???

Responder

Si la lcd si funciona

Probaste colocar el ADC de 10 bits? (#device ADC=10) A 1 Khz como lo vimos en la entrada, necesitamos una resolución de 10, donde obtendremos el máximo PWM en 1000 cuando colocamos set_pwm1_duty(1000);

Responder