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

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 ;)
 

Adjuntos

  • Esquema.jpg
    Esquema.jpg
    123.5 KB · Visitas: 336
  • Controlador LCD 1 pin V2.0.rar
    126.3 KB · Visitas: 251
Última edición:
Gracias dino!
Dejo por aqui el pcb del controlador, diseñado en Ares.

Un saludo!
 

Adjuntos

  • 3D 1.png
    3D 1.png
    153.7 KB · Visitas: 110
  • 3D 2.png
    3D 2.png
    133.4 KB · Visitas: 76
  • pcb.png
    pcb.png
    262.6 KB · Visitas: 80
  • Controlador LCD PCB.rar
    21 KB · Visitas: 164
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??
 
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?
 
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
 
Última edición:
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:

Código:
/**************************************************************************************
***************************************************************************************
**             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.
**
**************************************************************************************
**************************************************************************************/
 
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.
 
Última edición:
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
 
Última edición:
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.
 
Última edición:
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 :LOL:
 
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.
 
Hola, muy buen proyecto...(y)
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...:unsure:

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... :unsure:

*No me acuerdo el número de parte
 
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
 
Hoy he terminado de construir el PCB del controlador. Dejo unas fotos del acabado
 

Adjuntos

  • DSC_0108.JPG
    DSC_0108.JPG
    113.9 KB · Visitas: 82
  • DSC_0109.JPG
    DSC_0109.JPG
    112.1 KB · Visitas: 92
  • DSC_0110.JPG
    DSC_0110.JPG
    114 KB · Visitas: 76
  • DSC_0111.JPG
    DSC_0111.JPG
    122.1 KB · Visitas: 81
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
 
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 !
 
Atrás
Arriba