PIC16F877 - Control de matriz led 4x7 y LCD 2x16 con un solo pulsador

Hola lista.

Este circuito y programa que presento está basado en un PIC16F877 y permite seleccionar mediante un solo pulsador un carácter cualquiera de las 27 letras del alfabeto (incluyendo guion y ESPACIO) y visualizarlo en un LCD de 2 x 16 lineas. De esta manera, puede escribirse un mensaje de hasta 32 caracteres en el LCD, seleccionando letra por letra del mismo.

El circuito esta compuesto por una matriz de leds de 4 filas y 7 columnas. Cada led representa un carácter alfabético. Pueden ver si lo simulan, que el circuito comienza escaneando fila por fila de la matriz (las filas van iluminándose una tras otra de arriba hacia abajo).

Con el primer click en el pulsador puede seleccionarse la fila donde se encuentra el carácter buscado. Luego del click en el pulsador, el circuito pasa a escanear la fila elegida (celda por celda, van iluminándose los leds de esa fila, de izquierda a derecha). Cuando se ilumina la celda correspondiente al carácter deseado, con un segundo click en el pulsador, el carácter parpadea (para denotar que ha sido seleccionado) y se visualiza en el LCD.
Luego el circuito continua con el escaneo fila por fila, como al principio.

El programa funciona bien, salvo dos detalles muy importantes que no logro subsanar:

-el display, luego de completada la escritura de sus dos lineas, no se limpia como debería para permitir seguir escribiendo en el.

-la simulacion con el Proteus me tira decenas de mensajes con el texto STACK OVERFLOW EXECUTING CALL INSTRUCTION y STACK OVERFLOW EXECUTING RETURN INSTRUCTION. Supongo que se debe a algún problema en los llamados a las subrutinas correspondientes (estimo que son errores en el incremento del PCL y/o del PCLATH). Al respecto, he probado utilizar las instrucciones PAGESEL, lgoto y lcall para que puedan encontrarse las subrutinas sin problemas, estén en donde estén en la memoria de programa, pero no he tenido éxito.

Agradecería que alguien me ilumine al respecto.

Cordial saludo.
 

Adjuntos

  • lcd.jpg
    lcd.jpg
    85.8 KB · Visitas: 18
  • ARCHIVO ZIP.zip
    23.3 KB · Visitas: 20
Última edición:
Hola lista! Como no he tenido respuesta alguna, me respondo yo! :D

He logrado mejorar el funcionamiento del programa, pero quisiera preguntar algo...

En caso de error al escribir, cuál seria la rutina en assembler para lograr que se borre el carácter escrito por error (a la izquierda), y que el cursor del LCD quede posicionado en dicho lugar para poder así cambiar el carácter erróneo por el que corresponde?

Gracias.

Cordial saludo
 
En caso de error al escribir, ¿cuál sería la rutina en assembler para lograr que se borre el carácter escrito por error (a la izquierda), y que el cursor del LCD quede posicionado en dicho lugar para poder así cambiar el carácter erróneo por el que corresponde?
Me supongo que usando el comando Cursor or Display Shift (Leer hoja de datos del HD44780)

Algó así:
movlw b'00010000'
call lcd_comando


Y tal vez tengas que limpiar la variable que contenía el dato y una serie de operaciones más.
 
Gracias D@rkbytes.

Ya está resuelto el problema. Cuando termine publico el proyecto.

Cordial saludo.



Hola lista!

Acá envío el proyecto terminado. Como podrán ver... se agrandó la matriz (4x8)!

Agradecería lo evalúen y critiquen.

Cordial saludo.



En la simulación con Proteus siguen apareciendo continuamente los mensajes:

STACK OVERFLOW EXECUTING CALL INSTRUCTION

STACK UNDERFLOW EXECUTING RETURN INSTRUCTION

Supongo que se debe a los problemas que mencioné en el primer mensaje (PCL, PCLATH, etc) que no he logrado resolver.

Alguna mente sagaz que me ilumine al respecto será mas que bienvenida!

Cordial saludo
 

Adjuntos

  • PROYECTO TERMINADO.zip
    24.6 KB · Visitas: 20
Última edición:
Atrás
Arriba