Saltar al contenido

¡Bienvenidos, controleros y controleras! En esta guía, aprenderás a integrar una interfaz LCD I2C con un microcontrolador PIC, utilizando el compilador CCS C PIC C Compiler. Esta técnica te permitirá reducir la cantidad de pines utilizados y simplificar el cableado de tu proyecto, lo cual es esencial cuando trabajas con microcontroladores como el PIC16F877A. Si aún no estás familiarizado con el protocolo I2C, no te preocupes, ya que también abordaremos cómo funciona y por qué es tan útil en aplicaciones con periféricos como pantallas LCD y otros dispositivos.

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

Antes de comenzar te invito a que te unas a la comunidad de CONTROLEROS y CONTROLERAS en YouTUBE para seguir aprendiendo de estos temas de microcontroladores, control, programación, instrumentación, entre otros:

¿Qué es el Protocolo I2C y por Qué Usarlo con un PIC?

El protocolo I2C (Inter-Integrated Circuit) es una tecnología de comunicación serie que permite conectar múltiples dispositivos a un microcontrolador usando solo dos líneas: SDA (Serial Data Line) y SCL (Serial Clock Line). En lugar de ocupar varios pines para conectar periféricos, como es el caso de un LCD sin I2C, este protocolo te permite manejar múltiples dispositivos con solo dos hilos de comunicación, lo que es extremadamente útil cuando trabajas con microcontroladores como el PIC16F877A.

Funcionamiento Básico del I2C:

En un bus I2C, siempre hay un dispositivo maestro (en este caso, tu microcontrolador PIC) y uno o más dispositivos esclavos (como un LCD, un sensor de temperatura, etc.). El maestro controla el bus, enviando una señal de reloj a través de la línea SCL y transmitiendo datos a través de la línea SDA. Cada dispositivo esclavo tiene una dirección única en el bus, lo que permite al maestro comunicarse específicamente con el dispositivo deseado.

Por ejemplo, al utilizar un LCD 16×2 I2C con un PIC, el microcontrolador envía la dirección del LCD seguida de comandos específicos para mostrar caracteres en la pantalla. Este proceso es similar sin importar si estás trabajando con un PIC, un Arduino, o incluso una Raspberry Pi.

Ventajas de Usar I2C en Proyectos con PIC:

  1. Ahorro de Pines: Usar I2C reduce el número de pines necesarios en el microcontrolador. Esto es crucial en proyectos donde el espacio es limitado o cuando necesitas conectar muchos dispositivos.
  2. Simplicidad en el Cableado: Al utilizar solo dos líneas para la comunicación, el cableado se simplifica considerablemente, reduciendo la posibilidad de errores.
  3. Facilidad para Escalar: Puedes conectar múltiples dispositivos I2C al mismo bus sin complicaciones adicionales, permitiendo la expansión fácil de tus proyectos.

Si deseas profundizar más en el protocolo I2C y cómo se aplica específicamente en microcontroladores PIC, te recomiendo leer nuestra guía completa sobre comunicación I2C con 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

ara evitar ocupar múltiples pines del microcontrolador PIC, podemos utilizar dispositivos como el PCF8574T, un expansor de entradas y salidas digitales que se conecta mediante el protocolo I2C. Este módulo permite manejar un LCD usando solo dos pines del microcontrolador, SDA y SCL, simplificando enormemente el diseño de tu circuito. Consulta el datasheet del PCF8574T para más detalles sobre sus características técnicas.

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 y también para que descargues los archivos de Proteus y del Ejemplo que esta al final de este post:

Antes de continuar con la implementación de la librería I2C_FLEX_LCD en tu proyecto con PIC, es importante entender bien cómo funciona el protocolo I2C, ya que te permitirá integrar fácilmente otros periféricos como sensores y módulos de memoria. Si aún no has leído nuestra guía sobre comunicación I2C con PIC, te recomiendo que lo hagas. Esta guía te dará una comprensión más profunda del protocolo y te ayudará a evitar errores comunes al trabajar con I2C en microcontroladores PIC.

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

Ahora, implementaremos la librería I2C_FLEX_LCD con el microcontrolador PIC18F4550. Este ejemplo práctico te permitirá visualizar cómo interactúa el PIC con un LCD 16×2 a través del bus I2C. Si te gustaría ver un video detallado que explique el funcionamiento de cada función de esta librería, no dudes en dejar tus comentarios. También puedes descargar los archivos de Proteus y el código fuente al final de este post para que puedas replicar este proyecto por tu cuenta.

i2c pic

Circuito en Proteus disponible para descarga arriba en este post:

Interfaz LCD I2C en Proteus + PIC18F4550
Interfaz LCD I2C en Proteus + PIC18F4550
//************************************************************************************ 
// Display LCD con Librería "i2c_Flex_LCD" Integrado (PCF8574T) 
// Código principal:
// Sergio Castaño
// https://controlautomaticoeducacion.com
//************************************************************************************ 
#include <18f4550.h>
#DEVICE ADC=10
#USE DELAY(clock=20000000,crystal)
#FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#byte porta = 0xf80 // Identificador para el puerto A. 
#byte portb = 0xf81 // Identificador para el puerto B. 
#byte portc = 0xf82 // Identificador para el puerto C. 
#byte portd = 0xf83 // Identificador para el puerto D. 
#byte porte = 0xf84 // Identificador para el puerto E.
 
#use i2c(Master,Fast=100000, sda=PIN_B0, scl=PIN_B1,force_sw)  
#include "i2c_Flex_LCD.c"  

void main() {  
int i=0; 
lcd_init(0x4E,16,2);
lcd_backlight_led(ON); //Enciende la luz de Fondo
  
 while (TRUE) { 
   lcd_clear();  //Limpia el LCD

   // Envio de Strings al LCD usando la función printf
   printf(lcd_putc, "\fSuscribete a"); 
   delay_ms(1000); 
   printf(lcd_putc, "\nControl      "); 
   delay_ms(1000); 
   printf(lcd_putc, "\nAutomatico    "); 
   delay_ms(1000); 
   printf(lcd_putc, "\nEducacion     "); 
   delay_ms(1000); 

   printf(lcd_putc, "\fAprende:"); 
   delay_ms(1000); 
   printf(lcd_putc, "\n- PIC"); 
   delay_ms(1000); 
   printf(lcd_putc, "\n- Arduino"); 
   delay_ms(1000); 
   printf(lcd_putc, "\n- Control"); 
   delay_ms(1000); 

   // Limpia el LCD 
   printf(lcd_putc, "\f"); 
   delay_ms(500); 

   //Función: lcd_gotoxy()
   //Si colocan un gotoxy mayor al del LCD usado, la propia función
   //internamente coloca los límites correctos. A modo de ejemplo
   //coloquemos las esquinas correspondientes a un LCD 20x4 y la función
   //Loa adaptará si se usa un LCD 16x2

   lcd_gotoxy(3, 1);        
   printf(lcd_putc, "Numeros en");    
   lcd_gotoxy(4, 2);        
   printf(lcd_putc, "Esquinas"); 
   delay_ms(500); 
   lcd_gotoxy(1, 1);        
   printf(lcd_putc, "1"); 
   delay_ms(500); 
   lcd_gotoxy(20, 1);        
   printf(lcd_putc, "2"); 
   delay_ms(500); 
   lcd_gotoxy(20, 4);        
   printf(lcd_putc, "3"); 
   delay_ms(500); 
   lcd_gotoxy(1, 4);        
   printf(lcd_putc, "4");    
   delay_ms(2000); 
   

   // Prueba de la función de borrado Backspace
   printf(lcd_putc, "\f ¡Suscribete!\n"); 
   printf(lcd_putc,   "Activa: CAMPANA"); 
   delay_ms(2000); 

   // Ultima columna y fila  2
   //Borro la fila 2 con back space
   lcd_gotoxy(20, 2);        

   // Backspace over 2nd line. 
   for(i = 0; i < lcd_total_columns; i++) 
      { 
       printf(lcd_putc," \b\b"); 
       delay_ms(100); 
      } 

   printf(lcd_putc,   " es GRATIS!!!!!!");  
   delay_ms(3000); 

//Apaga Luz de Fondo 
         lcd_backlight_led(OFF); 
         printf(LCD_PUTC,"\fLCD BackLight\n     OFF      "); 
         delay_ms(3000); 

//Enciende Luz de Fondo
         lcd_backlight_led(ON); 
         printf(LCD_PUTC,"\fLCD BackLight\n     ON      ");  
         delay_ms(3000); 

   }    
} 

Al concluir este tutorial, deberías tener una sólida comprensión de cómo utilizar la interfaz LCD I2C con microcontroladores PIC, específicamente con el PIC18F4550. Este conocimiento no solo es aplicable a LCDs, sino también a otros periféricos que pueden ser conectados mediante I2C, como sensores y módulos de memoria. Te invito a explorar más sobre el uso de I2C con PIC en nuestro artículo dedicado, y si tienes preguntas o sugerencias, ¡deja tus comentarios abajo!


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 una respuesta

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 (43)

POSIBLE solución si NO te funciona en la práctica.

Si alguno tiene problemas al realizar este proyecto en la práctica, verifiquen que código del modelo tiene escrito el circuito integrado de su interfaz I2C, yo me he encontrado con dos opciones en el mercado:
1.- «PCF8574T +2212»: para este usarán la la sentencia de inicialización de la interfaz i2c lcd: i2c_lcd_init(0x4E, filas, columnas);
2.- «PCF8574T ABX919 (…)» para este usarán la sentencia de inicialización de la interfaz i2c lcd: i2c_lcd_init(0x7E, filas, columnas);
Aclaro que estas líneas son válidas (al menos a mí me funcionaron) siempre y cuándo no hayas soldado y cambiado los pines de direccionamiento A2 A1 y A0, estos deben estar sin soldar.
El cambio de dirección en el código, (según mi conclusión) es por qué en realidad este chip expansor de E/S viene en dos modelos el PCF8574T (con la dirección 0010 [0 A2 A1 A0] y el PCF8574AT (con la dirección 0011 [1 A2 A1 A0]).
Estos dos modelos en conjunto permiten conectar hasta 16 dispositivos en la misma linea I2C, pero si solo usas uno, puede causar confusión.

Espero que a alguno le funcione esto, ya que a mi me provoco algunos contratiempos y gastos innecesarios en la compra de nuevas interfaces.
Igual sé que esto no es nada del otro mundo y lo pongo más que nada para las nuevas personas que están iniciando en este tipo de prácticas o estos dispositivos, si aún tienes dudas con gusto puedo apoyarte a través de mi correo (siempre y cuándo no cause problemas con el autor original del post) [email protected]

Responder

Hola me ayudo mucho tu post solo tengo un problema no puedo hacer que se vea una variable en el lcd

estoy usando
int temp;
printf(lcd_putc,temp);

donde temp:
set_adc_channel(1);
delay_us(10);
temp=read_adc();

pero no muestra nada o llena el lcd con caracteres raros

me podrias ayudar
gracias

Responder

Para imprimir variables que sean enteras, flotantes, strings, puedes usar el
printf(lcd_putc,"Temperatura = %d", temp);
donde:
%d = enteros
%f = flotantes

Responder

Display LCD I2C com PIC18F452 funciona na simulação (proteus) mas não funciona na prática. Apenas acende a luz do visor!!! Já mudei a frequência e mesmo assim não funcionou. Desde já obrigado!!!

Responder

Bom Diego, se funcionou na simulação, tem que funcionar em fisico. Verifica as conexões com um multimetro e também verifica o endereço I2C do módulo LCD, além do contraste que vc pode mudar com a chave philips no módulo.

Responder

Buenas tardes inge, ¿funciona en la práctica ese truco de Proteus de usar el teclado matricial y el LCD en el mismo puerto (B)?
En caso que sí, ¿no sería mejor alternativa que usar este proyecto?

PD: Un saludo, he simulado casi todos los proyectos del canal, gracias maestro.

Responder

Hola Diego, si a nivel práctico puedes colocar el LCD y un teclado matricial en el puerto B. El objetivo de esta entrada es mostrar otras posibilidades que existen para emplear el LCD en un proyecto, dado que no todos los proyectos necesariamente van a llevar un teclado. Saludos y que bueno que has estudiado los diversos proyectos del sitio.

Responder

Hola y Buen día Inge.
Primero que nada me gustaría agradecerte y felicitarte por tu gran aportación y conocimiento que compartes con la comunidad. Es información invaluable y para los que nos dedicamos a la electrónica sin duda es una gran aportación, espero y sigas con estos éxitos.
Por otro lado, te escribo por lo siguiente, estuve probando tu librería y definitivamente funciona al 100%, pero cuando intente utilizar la función del CG RAM (LCD_SET_CGRAM_CHAR) para dibujar caracteres, al compilar me marco error, esto quiere decir que no esta implementada esa función. Me gustaría saber si es posible implementarla en la librería y si pudieras hacer un video con respecto al tema, estaría excelente.
De igual manera tengo duda de como se podrían conectar otros dispositivos I2C utilizando la librería del LCD como por ejemplo el RTC, si pudieras incluir el respectivo video explicándolo, estaría genial.
Agradezco de antemano el tiempo que te tomaste en leer mi mensaje.
Saludos desde México, Gracias y Muchos Mas Éxitos.

Responder

es absurdo usar un pic tangrande con tastos pines. usa un pic12 o similar que usa menos pines

Responder

Si, se puede usar el PIC que mejor se adapte al proyecto, la intensión del post es ver como emplear el LCD usando el I2C usando un microcontrolador PIC + CCS C

Responder

Buen dia ante todo un gran abrazo y muchas felicitaciones por tan importantes logros y aportes!, q sigas teniendo muchos exitos!!,,, también te escribo para comentar q estoy trabajand con un pic16F88 la pantalla Lcd 16×2. Conectado via I2c. Ya cambié en el archivo fuente principal la linea dnd configura los pines Sda y Scl, q en este caso son B1 Y B4.. la duda es: » cual cambio debo hacer en el archivo de libreria de apoyo!,??,, «i2c_Flex_LCD», para q funcione con este pic.

Responder

En la librería no es necesario hacer ningún cambio, todos los cambios los haces es en el programa principal. Como ya has configurado el pin RB0 y RB4 con eso debería bastar. Recuerda poner el archivo de la librería en la misma carpeta del archivo principal.

Responder

Buenos días Sergio, he tratado de hacer funcionar este ejemplo pero con un PIC18F4680, el ejemplo sirve para este pic? aún no me funciona, la librería me manda un warning de que «data» nunca se usa, vi en un hilo que recomendabas volver a bajar la libreria yo la baje el 7/Febrero/2021, hay una mas reciente o si me puedes decir cual es el cambio que hay que hacerle por favor.
Gracias-Saludos

Responder

Hola Gerardo, es es la más reciente. En teoría debe funcionar la librería. ya la he probado en varios PIC y sin problemas. Estás conectando el LCD en el pin 18 y 23 (SCL y SDA respectivamente) del 18F4650? A pesar de que te manda un warning ya lo implementaste fisicamente? Desde que no te salga un error puedes implementarlo sin problema.

Responder

Hola Sergio, antes que nada permiteme agradecer que te tomes el tiempo de contestar mi pregunta generalmente eso ocurre muy poco en los blogs y quería reconocerte eso, pasando a mi pregunta es correcto tengo conectado el SCL al pin 18 y el SDA al pin 23 mi pic es el 18F4680, cuando lo compilo me dice que en el archivo i2c_Flex_LCD.c la variable «data» is never used, si lo implemente físicamente y lo he probado con 2 LCD con modulo I2C con IC PCF8574T uno 16×2 y otro 20×4 ambos nuevos y sin puentes en los pines de address, he intentado regular el contraste pero nada, mi directiva la tengo como:

#use i2c(Master, Fast=100000, sda=PIN_C4, scl=PIN_C3, force_sw)
lcd_init(0x4E,20,4)

una diferencia que veo es que uso un XTAL interno #use delay(internal=16MHz)

en este programa uso el puerto serial y su interrupción «enable_interrupts(INT_RDA)», «enable_interrupts(GLOBAL)»
y uso un canal análogico «setup_adc_ports(AN0) y «setup_adc(ADC_CLOCK_INTERNAL)» no se si esto sea motivo de que no funcione.

Agradezco si me regalas de nueva cuenta tus comentarios para encontrar el porque no funciona físicamente.

Saludos y Gracias.

Responder

Gerardo debería funcionar sin problemas. Yo he implementado proyectos de controladores usando esta librería i2c_lcd junto con la interrupción serial y lecturas análogas con el 18F4550 y nunca tuve problemas. De igual forma, revisa la entrada, en la parte de descarga de la biblioteca, he dejado un ejemplo con el PIC18F4680 (código + Proteus) simulado en proteus con cristal interno 16M y por lo menos en simulación está corriendo. Éxitos.

Responder

Hola Sergio Gracias por el soporte al final el modulo I2C estaba dañado en uno de los LCD y el otro tenía otra dirección por default, te agradezco tus respuestas, hay alguna otra forma de invitarte un cafe sin usar paypal.
saludos

Que bueno Gerardo que has podido encontrar la solución. Lo del café pues no tengo otra forma por ahora. Igual muchas gracias y muchos éxitos!!

Hola, probe la libreria con un pic 16f877a y me pasa lo siguiente en proteus me corre de maravilla pero ya montado en la placa de prueba no me funciona. Pero si lo hago con un pic 18f4620 me funciona tanto como en proteus como en fisico.

¿Alguna solucion que tengas a esto porfavor me ayudaria mucho?

Responder

Sergio buenos días. Implemente tu código en un PIC 18F2550 y un LCD de 16 x 1 y no funciona. Modifique la línea 16,2 por 16,1 y eliminé las órdenes que usaban la línea 2.
Alguna idea que explorar , añadir o modificar?

Responder

Has verificado la dirección i2c?

Responder

Ingeniero buen dia, he tratado de hacer un proyecto con un pic 18F4550 con el cual necesito hacer un controlador de temperatura con un MAX 6675 y debe tener un teclado 4×20 y una LCD 4×20, estoy trabado en la forma de poder configurar los mismos y por causas laborales no tengo suficiente tiempo para terminarlo, no es proyecto estudiantil pero aca en la empresa debo habilitar un esterilizador y es para eso. Le agradezco si es tan amable me puede contactar para que por favor me pueda cotizar la terminacion del código o hacer uno nuevo como usted diga, yo le envío el diagrama de flujo, circuito y demás, quedo atento a su pronta respuesta

Responder

bom dia

voce tem alguma biblioteca max31856 para usar com ccs e pic 16f877a

Responder

Tenho não Alcione, da uma procurada em inglês para ver se vc acha. Abç.

Responder

Hola muchas gracias por el post es de gran ayuda, quisiera saber si se puede implementar con esta libreria el control de 2 Lcd i2c con diferentes direcciones, ya que eh estado buscando y modificnado algunas cosas de la libreria pero no he logrado hacerlo, eh visto en arduino si se puede pero en PIC no eh encontrado informacion, de antemano gracias?

Responder

Claro que se puede, es comunicación I2C, puedes conectar varios LCD si lo deseas al bus i2c. No necesitas modificar nada en la librería, es solo direccionar adecuadamente por hardware con los pines A2, A1, A0, verificar que los dos dispositivos tengan direcciones diferentes, por ejemplo el primero con (111) y el segundo con (110) en hexadecimal seria 0x4E y 0x4C respectivamente. En código, debes establecer muy bien a cual de los dos LCDs deseas mandar la información. Para eso usa la función lcd_init. Por ejemplo en nuestro ejemplo para mandar el mensaje «Suscribete a control automatico educacion» y mostrarlo en ambos LCDs seria:

lcd_init(0x4E,16,2);
   printf(lcd_putc, "fSuscribete a"); 
   lcd_init(0x4C,16,2);
   printf(lcd_putc, "fSuscribete (2)"); 
   delay_ms(1000); 
   
   lcd_init(0x4E,16,2);
   printf(lcd_putc, "nControl      "); 
   lcd_init(0x4C,16,2);
   printf(lcd_putc, "nControl (2)     "); 
   delay_ms(1000); 
   
   lcd_init(0x4E,16,2);
   printf(lcd_putc, "nAutomatico    "); 
   lcd_init(0x4C,16,2);
   printf(lcd_putc, "nAutomatico (2)   "); 
   delay_ms(1000); 
   
   lcd_init(0x4E,16,2);
   printf(lcd_putc, "nEducacion     "); 
   lcd_init(0x4C,16,2);
   printf(lcd_putc, "nEducacion     "); 
   delay_ms(1000); 

Lo verifiqué y funciona perfecto. Saludos.

Responder

Hola, Yo lo he intentado hacer con un Pic18f45k50, y no me corre. modifique los parámetros para que funcionara con el Cristal interno.

#include
#DEVICE ADC=10
#DEVICE ICD = TRUE
#use delay(internal=48MHz)
#build(reset=0x02000,interrupt=0x02008)
#org 0x0000,0x1FFF

Cuando lo compilo, me marca un Warning donde el «data» de la libreria nunca se usó
void lcd_gotoxy( byte x, byte y)
{
byte row,column,row_addr,lcd_address;
static char data;

Responder

Hola Juan, le hice un arreglo a la librería, que era justo lo que no me dejaba simularla en proteus. Descargala nuevamente y verifica si te funciona. Adicionalmente agregué a la entrada los archivos de simulación con el proteus donde simulamos el circuito interfaz LCD I2C. Saludos.

Responder

Vorrei implementare il display I2C con un DS1307 e con un DHT22 ma non conosco i comandi per visualizzare i dati, mi sai dire quale codice usare.
Me gustaría implementar la pantalla I2C con un DS1307 y con un DHT22 pero no conozco los comandos para ver los datos, puede decirme qué código usar.
Muchas gracias

Responder

Buen día. Primero que nada muchas gracias por el contenido, es muy útil.
Tengo una duda en donde realizas dos lineas para configurar los fuses, porque en ambas vuelves a repetir algunos parámetros, como el del oscilador (HS). Además, en la parte de #USE DELAY(crystal=20000000), en otros ejemplos usas CLOCK en lugar de crystal, hay alguna diferencia?

Responder

Hola Francisco, ya corregí la linea de los fuses. Para el uso del cristal puedes usar clock o crystal, es indiferente, como lo podrás apreciar en la pagina 191 del manual del CCS C. Saludos!!

Responder

tengo un problema al querer usarlo combinado con el uso de un modulo sonico me marca error

Responder

Hola buenas,

Quiero conectar un display 20×4 para el pic18f4550 a través del I2C, he probado con Proteus y utilizando tu programa y libreria en CCS y no me funciona. He utilizado el PCF8574 en la simulación pero aún así no me funciona.

Muchas gracias!

Responder

Realmente en simulación a mi tampoco me funciona. Sin embargo implementado fisicamente funciona perfectamente. Ya lo he implementado varias veces y varios controleros lo han hecho también. Saludos.

Responder

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