# [APORTE] Control de LCD con 1 solo pin del PIC



## arrivaellobo (Feb 3, 2012)

En estos tiempos me estoy dedicando a un proyecto más o menos grande que tengo que presentar, y ya que los pines en los microcontroladores son un bien preciado, he decidido construir una controladora para displays LCD que se controla con un único pin.
La ventaja de esta controladora está más que clara, en vez de utilizar los 6 pines mínimos necesarios para el control del LCD, utilizamos 1, y liberamos el resto. Además, en el pic principal no tenemos que cargar la librería del LCD, lo que ahorra mucha memoria.

Características del controlador:
- CPU -> 16f628A
- Control por puerto RS232
- 5 comandos disponibles
- Control de brillo del backlight por software

Adjunto todo lo necesario para la simulación, el código fuente del controlador, un archivo de ejemplo, y el DNS de proteus.

Un abrazo a todos, y suerte en la vida


----------



## dinoelectro (Feb 3, 2012)

muy bueno!!! felicitaciones


----------



## arrivaellobo (Feb 4, 2012)

Gracias dino!
Dejo por aqui el pcb del controlador, diseñado en Ares.

Un saludo!


----------



## dinoelectro (Feb 4, 2012)

gracias!! LO vOY A CONSTRUIR.. 

OTRA VENTJA que le veo es el ahorro de espacio en el PCB ya que por lo general los LCD forman una telarraña a la hora de rutear jejeje

y no has investigado si se puede hacer lo mismo con un pic mas economico??


----------



## arrivaellobo (Feb 4, 2012)

Se podría hacer el controlador con casi cualquier pic, que tenga suficiente memoria y pines, y que disponga de puerto UART. Además, sería interesante que tuviera oscilador interno, para conseguir un pcb más pequeño.
En Ecuador no se qué pic es más barato con éstas características.
Cual recomiendas?


----------



## asherar (Feb 4, 2012)

Hola arrivaellobo

Muy buena idea hacer una 'DPU', para controlar el LCD separado del resto.

Podrías enumerar las funciones que controlan los 5 comandos ? 
(Disculpá pero, como no uso el proteus, no pude leer tus doc.)

Saludos


----------



## arrivaellobo (Feb 4, 2012)

En el rar del primer post está el archivo "controlador.c". Está escrito en el compilador CCS, y al inicio del archivo viene explicado su uso y la lista de comandos. De todas maneras te pongo aquí la manera de utilizar el controlador:


```
/**************************************************************************************
***************************************************************************************
**             Controlador de display LCD con 1 pin V2.0
**             Programador: Cristian Lobo (arrivaellobo)
**             
**  Funcionamiento:
**     Despues de construir el controlador y grabar el 
**     .hex en el pic, puedes controlar el LCD por
**     medio del puerto RS232 de tu proyecto principal.
**     Incluye al inicio de tu código la sentencia:
**          
**     #use RS232(stream=lcd, baud=9600, bits=8, parity=N, xmit=PIN_XX, rcv=PIN_XX);
**
**     Esto crea un puerto serie, con stream de datos llamado lcd.
**     Para enviar comandos y datos al controlador, utiliza la función fprintf(lcd, "");
**     El comando se envía al inicio de la cadena de texto. Los datos se colocan despues de éste comando.
**
**     Comandos disponibles:
**          F --> Borra el display y se situa en (1,1). Es necesario esperar 3ms despues de ejecutar este
**                comando para que el controlador esté listo.
**          W --> Escribe el texto situado despues de la W en la posicion actual del cursor
**          N --> Borra el LCD y escribe el texto situado despues de la N en la posicion (1,1)
**          G --> Equivale a lcd_gotoxy(x,y). Despues de la G coloca dos digitos, carácter y línea respectivamente.
**          B --> Controla el brillo del backlight. Despues de la B escribe un número de 0-9.
** 
**          Ejemplo de uso:
**             Al inicio del programa queremos que el display tenga un brillo del 50%, que muestre "Hola caracola",
**             y que tras 1 segundo borre el display, brillo del 20% y escriba en (5,2) 16f628.
**
**             const char pic[8]="16f628";
**             delay_ms(50);
**             fprintf(lcd, "B5");
**             delay_ms(3);
**             fprintf(lcd, "NHola caracola\r");
**             delay_ms(1000);
**             fprintf(lcd, "F");
**             delay_ms(3);
**             fprintf(lcd, "B2");
**             delay_ms(3);
**             fprintf(lcd, "G52");
**             delay_ms(3);
**             fprintf(lcd, "W%s\r" ,pic);
**
**     IMPORTANTE: (1)  Para que el controlador sepa cuándo termina la cadena de texto enviada, hay que colocar al
**                      final un retorno de carro, es decir, \r. Esto sólo es necesario usando los comandos W y N.
**                 (2)  Al arrancar el circuito, debes esperar unos 50ms antes de utilizar el controlador
**                 (3)  Cualquier modificación o mejora debería ser posteada en el foro correspondiente a este aporte,
**                      en la web www.forosdeelectronica.com.
**
**************************************************************************************
**************************************************************************************/
```


----------



## asherar (Feb 4, 2012)

Ok. Muchas gracias. 
Voy a ver si puedo hacer algo parecido con los LCD gráficos, 
aunque seguro requerirá más comandos !!!


----------



## Moyano Jonathan (Feb 4, 2012)

La verdad me parece una excelente idea, ahora has tenido algún problema de tiempos de refresco ?


----------



## asherar (Feb 5, 2012)

Como no queda claro para quién va la pregunta, yo opino lo mío. 

Los LCD, tanto 2x16 texto, como gráficos (aún los más chicos) son de por sí un poco lentos de reflejos. 
Cuando digo lentos me refiero al tiempo de ejecución del micro a bordo del display.
Los de texto son un poquitín más lentos que los gráficos, al menos los que he usado. 
No hay que olvidarse que las placas ya traen un micro, así que ahora habrían 3 CPUs en total.  

Sin embargo, como está planteado el tema de usar unos pocos comandos, casi todo el trabajo 
le queda al micro dedicado, y por lo tanto son de esperar los retrasos habituales.

Aún no he probado el control via RS232, pero creo que en algunos casos vale la pena tener 
todo lo del LCD estandarizado, ya listo y probado. 

Veremos qué opina *arrivaellobo*.


----------



## arrivaellobo (Feb 5, 2012)

*Moyano:* A que te refieres exactamente con los tiempos de refresco?
El tiempo que hay que esperar después de enviar un comando al controlador es un poco variable, ya que cada comando tiene su tiempo de ejecución propio. Por ejemplo los comandos F, B y G necesitan 3ms. 
Una tarea adecuada sería medir en el proteus el tiempo de ejecución de cada comando, para tener la medida exacta. Si tengo un hueco libre ésta tarde me dedicaré a eso.
*asherar:* Te refieres a que en algunos casos es mejor usar el LCD directamente?
Es posible. Este controlador lo he creado para un uso general, ya que en 90% de los casos usamos los LCD para mostrar información, y no necesitamos refrescarlo cada 3ms por ejemplo. Por lo que he probado yo hasta ahora con los comandos por rs232 funciona bastante bien, mejor de lo que esperaba. He probado en board el circuito, mandándole muchos comandos seguidos para cambiar el brillo del LCD, y escribir mensajes y tal, y funciona bien. Sólo hay que respetar los tiempos entre comandos, y acordarse del \r... jajaja

Un abrazo


----------



## asherar (Feb 5, 2012)

arrivaellobo dijo:


> *asherar:* Te refieres a que en algunos casos es mejor usar el LCD directamente?
> Es posible. Este controlador lo he creado para un uso general, ya que en 90% de los casos usamos los LCD para mostrar información, y no necesitamos refrescarlo cada 3ms por ejemplo.
> Un abrazo



Justamente, depende mucho de la aplicación. Pero reitero la ventaja de tener 
todo lo del LCD estandarizado, ya listo y probado.

Además, una salida numérica que cambia muy rápido puede resultar incómodo para leer, 
y uno le tiene que poner retrasos adicionales de 1/2 a 1 seg.
Por eso pensé que *Moyano Jonathan* preguntaba por los display gráficos, 
que tienen mucha más memoria que refrescar. 

Saludos.


----------



## arrivaellobo (Feb 5, 2012)

He medido los tiempos de ejecución de cada comando con el proteus, aquí están:
*F --> 2.42ms
W --> 4.34ms
N --> 6.6ms
G --> 220us
B --> 58us*

Me alegro que te parezca bien el proyecto entonces


----------



## Moyano Jonathan (Feb 5, 2012)

Claro mi consulta estaba orientada a por ejemplo ...si nosotros tenemos que mostrar un mensaje pasante por el LCD..cuanto iba a tardar para mostrarlo en pantalla una vez que le enviáramos la trama RS232. Para displays gráficos habría que ver si es posible...algo que tiene el CCS es la opción #use fast_GLCD que crea un buffer intermedio en la RAM del microcontrolador...el único problema es que necesitamos un micro que tenga 1K de RAM para arriba para implementar la idea original del proyecto.


----------



## asherar (Feb 5, 2012)

El pìc 16f876A tiene 4k de memoria flash.


----------



## DJ T3 (Feb 5, 2012)

Hola, muy buen proyecto...
Te pregunto, sugiero, opino, o como quieras verlo...

Ya que utiliza 1 línea para comunicarse con el PIC que maneja el LCD, para ahorrar pines en el PIC principal, ¿no sería bueno que el que maneja el LCD implemente un teclado, y lo envíe de la misma forma, así ahorramos mas pines aún para el PIC principal?, serían 2 pines para comunicarse entre sí. O incluso si se puede, con 1 solo pin para todo...

También conozco una forma de utilizar 3 líneas (mas un 74XXX*) del PIC para manejar el LCD, entonces tenemos mas pines del PIC para mas botones, o teclado, u otras cosas...

Habría que ver si es conveniente en tema de memorias... 

*No me acuerdo el número de parte


----------



## arrivaellobo (Feb 6, 2012)

Para LCD alfanuméricas simples los tiempos de refresco son suficientemente "rápidos", pero para el tema de los LCD gráficos habría que pensarlo más detenidamente, y quizá ajustar más los tiempos. Nunca he trabajado con displays gráficos así que en ese tema no puedo aportar mucho más.
La idea de introducir también un teclado matricial en el controlador no está mal, pero personalmente preferiría hacer un pcb aparte para éste, con una configuración de éste estilo, para manejarlo desde el PIC principal con 1 pin.

Un abrazo a todos


----------



## arrivaellobo (Feb 6, 2012)

Hoy he terminado de construir el PCB del controlador. Dejo unas fotos del acabado


----------



## dinoelectro (Feb 6, 2012)

muy bueno arrivaelobo, .... se me ocurre qu podria usarse el I2C como opcion para no sacrificar el USART del pic... tu crees que seria posible lograrlo??

seria excelente contar con una libreria que te de como opcion comunicar tu controlador LCD  ya sea utilizando USART o I2C


----------



## Moyano Jonathan (Feb 6, 2012)

> El pìc 16f876A tiene 4k de memoria flash.



A lo que yo me refería es que si queremos usar un display gráfico, CCS tiene una manera de hacerlo pero se necesita crear un buffer intermedio en la RAM de 1K...por eso necesitas PIC18F para hacerlo o 
superiores.



> muy bueno arrivaelobo, .... se me ocurre qu podria usarse el I2C como opcion para no sacrificar el USART del pic... tu crees que seria posible lograrlo??
> 
> seria excelente contar con una libreria que te de como opcion comunicar tu controlador LCD ya sea utilizando USART o I2C



Es totalmente posible pero ya necesitas 2 pines del microcontrolador y que además el PIC tenga I2C por hardware para poder configurarlo como esclavo.

Un saludo !


----------



## arrivaellobo (Feb 7, 2012)

Como dice moyano, sería posible hacerlo por I2C y demás protocolos, pero elegí el RS232 porque el compilador CCS puede crear comunicación RS232 por software, por lo que el hardware del pic sigue siendo libre. En el ejemplo que está dentro del RAR puse ese tipo de comunicación por software.

Un saludo


----------



## DJ T3 (Feb 7, 2012)

arrivaellobo dijo:


> ...La idea de introducir también un teclado matricial en el controlador no está mal, pero personalmente preferiría hacer un pcb aparte para éste, con una configuración de éste estilo, para manejarlo desde el PIC principal con 1 pin...



Ok...
Interesante... 

¿Lo has implementado en algún proyecto tuyo al control que pusiste?


Saludos...


----------



## arrivaellobo (Feb 7, 2012)

Te refieres al del LCD?
En eso estoy trabajando ahora... estoy diseñando un proyecto de control para una fábrica, y una de las partes es el controlador de éste post. Lo he probado en algunos montajes y de momento funciona muy bien.
Un saludo


----------



## dinoelectro (Feb 7, 2012)

hola arrivaelobo, ... no necesitas otro microcontrolador para comandar el teclado con un solo pin, puedes hacerlo utilizando el conversor AD a distintas teclas distintas lecturas del conversor AD.. te recomiendo revices el siguiente link:

https://www.forosdeelectronica.com/f24/tecnicas-ahorrar-hardware-picmicros-65344/

saludos!


----------



## arrivaellobo (Feb 8, 2012)

Me has malentendido dino.. me refería a lo mismo que tu, usar el ADC para detectar las variaciones de tensión.
Pero gracias de todos modos!
Espero que te vaya bien


----------



## DJ T3 (Feb 9, 2012)

arrivaellobo dijo:


> Te refieres al del LCD?
> En eso estoy trabajando ahora... estoy diseñando un proyecto de control para una fábrica, y una de las partes es el controlador de éste post. *Lo he probado en algunos montajes y de momento funciona muy bien.*
> Un saludo



A esa parte preguntaba, si el circuito que expones, ya lo habías implementado en otro proyecto...

Gracias por responder...

Me gustaría ver un montaje (y si se puede un videito), del circuito que expones aquí cuando termines... 

Saludos...


----------



## arrivaellobo (Feb 9, 2012)

Te dejo la prueba de que funciona DJ T3.. jajajaja
Un humilde termómetro.


----------



## Moyano Jonathan (Feb 9, 2012)

Excelente el funcionamiento del controlador.


----------



## arrivaellobo (Feb 9, 2012)

Gracias moyano! 
Espero que os animéis a mejorarlo


----------



## DJ T3 (Feb 10, 2012)

arrivaellobo dijo:


> Te dejo la prueba de que funciona DJ T3.. jajajaja
> Un humilde termómetro.
> 
> http://www.youtube.com/watch?v=D0zvXbMhK54



Naaa, espectacular...

Te consulto;
¿Cuánto estimas que puede ser el largo máximo de un cable (por ejemplo) de 2 hilos mas la malla?

Siendo, uno para la alimentación, el otro 0V, y el otro la señal

Lo pregunto, porque por ahí estaría como para lugares donde no entre muchos cables, como me pasó en un local que tuvimos que poner una alarma y no entraba ni el aire...:enfadado:

Saludos, y te felicito...


----------



## arrivaellobo (Feb 10, 2012)

jajaja muchas gracias 

Pues no sabría decirte.. supongo que como son señales débiles, de 5V y muy poca corriente no podrás poner un cable muy largo... me atrevería a decir que de unos 3 o 4 metros máximo.


----------



## dinoelectro (Feb 10, 2012)

DJ T3 dijo:


> Naaa, espectacular...
> 
> Te consulto;
> ¿Cuánto estimas que puede ser el largo máximo de un cable (por ejemplo) de 2 hilos mas la malla?
> ...



bueno aqui te van unos TIPS:


utiliza cable blindado

unir masas (ademas de tierra) 

apantallar cables

utilizar un CI MAX232 (aunque supongo que tendras que realizar algunos cambios en el firmware.

saludos!!!


----------



## arrivaellobo (Feb 10, 2012)

Gracias por el aporte dino!
Sería interesante probarlo y ver el alcance que se puede lograr.

Aprovecho para subir otra vez el proyecto, ya que acabo de corregir un error menor, que hacía que al usar el comando W se imprimiera al final de la línea de texto un caracter extraño.


----------



## DJ T3 (Feb 11, 2012)

dinoelectro dijo:


> bueno aqui te van unos TIPS:
> 
> 
> utiliza cable blindado
> ...



Ok, muchísimas gracias por el tip  (el tema del mallado lo había puesto arriba, nada mas que me referí como "cable mas la malla", porque no me acordaba en ese momento )...



arrivaellobo dijo:


> Aprovecho para subir otra vez el proyecto, ya que acabo de corregir un error menor, que hacía que al usar el comando W se imprimiera al final de la línea de texto un caracter extraño.



Muchísimas gracias de vuelta "arrivaellobo"...


----------



## krlitoz90 (Nov 9, 2012)

arrivaellobo eres un genio brother.. justo ahora estoy haciendo un temporizador q*UE* controla el tiempo de un control de temperatura para termocupla y queria usar un lcd serial para indicar las horas y realizar como un menu.. y que de ai se visuali*C*e por un display multiplexado el tiempo que esta corriendo y me faltan pines porque tambien controlo cargas.. y ese control que as realizado me parece espectacular... te mencionare en mi tesis como el creador de este pequeño y agradable sistema de control de una lcd con un pin.. espectacular


----------



## arrivaellobo (Dic 24, 2012)

krlitoz90 dijo:


> arrivaellobo eres un genio brother.. justo ahora estoy haciendo un temporizador q*UE* controla el tiempo de un control de temperatura para termocupla y queria usar un lcd serial para indicar las horas y realizar como un menu.. y que de ai se visuali*C*e por un display multiplexado el tiempo que esta corriendo y me faltan pines porque tambien controlo cargas.. y ese control que as realizado me parece espectacular... te mencionare en mi tesis como el creador de este pequeño y agradable sistema de control de una lcd con un pin.. espectacular



Nah, no es para tanto..
Utilízalo cuanto te plazca, es Open Source .


----------



## fernandoae (Dic 24, 2012)

Este es otro buen aporte:
www.circuitvalley.com/2011/12/two-wire-serial-lcd-16x2-graphics.html
Y otra buena idea seria hacer algo con un pic 12F675 y un expansor de salidas


----------



## frlugo50 (Dic 30, 2012)

muy bueno el proyecto, pero quisiera saber para q*UE* es el pin Tx q*UE* sale en el pcb y no en la simulacion


----------



## arrivaellobo (Dic 30, 2012)

El pin TX del controlador no esta implementado, pero lo coloqué en el PCB por si en alguna actualizacion del firmware pudiera darle alguna utilidad


----------



## R-Mario (Dic 31, 2012)

Apenas voy viendo este tema, y se me hace asi como que un poquito dificil de entender para que usar un micro que controla a otro micro que controla a otro micro. Que ventajas y desventajas tiene esto a la hora de realizar un proyecto real. O solo es como para hacernos una especia de terminal para nuestros proyectitos. Como sea esta muy buena la idea, a veces resulta engorroso estar cableando toda la LCD en alguna prueba rapida que quieras hacer


----------



## arrivaellobo (Dic 31, 2012)

Sencillamente es la solucion que se me ocurrio para no ocupar tantos pines en mi proyecto y tenerlos disponibles para otras cosas. Seguramente habra una idea mejor, pero para mi fin funcionaba perfectamente.


----------



## asherar (Dic 31, 2012)

Ajna dijo:


> Apenas voy viendo este tema, y se me hace asi como  que un poquito dificil de entender para que usar un micro que controla a  otro micro que controla a otro micro. Que ventajas y desventajas tiene  esto a la hora de realizar un proyecto real. O solo es como para  hacernos una especia de terminal para nuestros proyectitos. Como sea  esta muy buena la idea, a veces resulta engorroso estar cableando toda  la LCD en alguna prueba rapida que quieras hacer



Es como la estrategia de "programación modular" pero aplicado al hardware. 
La idea es meter en un "paquete" todos los detalles del control en un micro dedicado, para simplificar 
el empleo de los displays, mediante un solo cable de datos y unos pocos comandos. 
Es más trabajo la primera vez, pero una vez resueltos todos los detalles ahorra un montón de tiempo 
para la próxima. 

Que tengan todos buen año.


----------



## frlugo50 (Dic 31, 2012)

arrivaellobo, podrias dejar programa q usastes en el video, tengo uno parecido pero me gusto lo del led parpadeando cuando se actualiza la temperatura, muchas gracias.


----------



## arrivaellobo (Dic 31, 2012)

frlugo50 dijo:


> arrivaellobo, podrias dejar programa q usastes en el video, tengo uno parecido pero me gusto lo del led parpadeando cuando se actualiza la temperatura, muchas gracias.



Creo que éste era el código.


----------



## fernandoae (Feb 22, 2013)

Está bueno, y los que se preguntan para que sirve? yo pienso armarlo en una cajita y colocar un jack de audio estereo, y ahi conectar gnd, +5v y rx... para poder utilizar el lcd en varios proyectos y con conexion rápida.
Incluso se podria usar para hacer debbuging o controlar variables...


----------



## fernandoae (Mar 12, 2013)

Estuve jugando un rato con proteus, pero cuando uso el Terminal Serie (el instrumento virtual) no me funciona el comando G, como se usa? o sera algun problema de código?



Ya lo solucioné, fué una patinada mia  en vez de usar W despues del comando goto usaba N... ya que mi navegador me cortaba medio texto y no habia visto que escribe en 1,1. Saludos colegas!


----------



## beta2 (Ago 25, 2013)

hola alguien podria decirme que otro pic se podria utilizar para el controlador


----------



## nonloop (Oct 18, 2017)

Ten*í*a *é*ste post guardado haces meses para cuando tuviera tiempo libre. Lo he implementado, casualmente tengo un par de 16F628A por casa, funciona de maravilla claro está. Aun así estoy reescribiendo el código para usar un PIC mucho más básico con pwm por software, el primer problema hasta ahora es que al cargar la lcd.h se me va la RAM al 92%. Tal vez lo termine *é*sta noche*,* tal*_*ve*z* en un par de meses, de momento intentaré usar un simple 16F630 pero no parece que va*y*a a caber todo ahí. Gracias por tu ex*c*elente aporte.


----------



## arrivaellobo (Oct 18, 2017)

Gracias a ti por re avivar el proyecto!
La verdad es que debería haberlo diseñado para un PIC más barato y pequeño, pero aquel entonces es lo que  más usaba y con él me quedé.


----------

