Saludos! Recientemente realice unas modificaciones a la libreria para el control de LCDs que habia compartido hace ya tiempo en el post "PIC18F25K22 & XC8: LibrerÃa para pantalla LCD 16x2 - Test basico", una de estas es la creacion de un archivo complementario para mostrar numeros grandes en la LCD, para este proposito usaremos caracteres personalizados de la CGRAM como ya mostre en el post "PIC18F25K22 & XC8: Libreria para LCD - Creacion de caracteres personalizados en la CGRAM".
Indagando un poco por la red, me encontre con el repositorio en GitHub de "UPIIR" el cual presenta un ejemplo de numeros grandes que me ha gustado bastante.
Aunque este repositorio esta pensado para arduino, asi que lo he tomado como base para crear una version para PIC en XC8, haciendo un poco de ingenieria inversa y algo de optimizacion, ha salido esta libreria que complementa la del LCD que mostre en otro post.
La idea principal para poder tener numeros grandes en la LCD, es generar caracteres especiales que combinados den como resultado el numero. Como se aprecia en la siguiente imagen se han guardado 4 caracteres los cuales proyectados en la LCD formaran el numero 1.
Ahora bien, no olvidar que la CGRAM solo te permite almacenar 8 caracteres. Como muestra veamos la fuente que me ha gustado, en la parte superior de la imagen estan los 8 caracteres especiales mas dos que trae la LCD por default (guardadas en el vector 254 y 255), un total de 10 caracteres que combinados podemos tener los numeros del 0 al 9.
Debo aclarar que para este ejemplo que les presento yo NO he diseñado ninguna fuente nueva, solo he migrado y optimizado para mostrar tres de las fuentes mostradas en el repositorio original. Posiblemente si lo ocupe o quiera hacer alguna fuente diferente lo estare haciendo, de momento estas me bastan, recomiendo ver el proyecto original para tener toda la informacion.
Circuito:
Para el circuito usado es el siguiente, un PIC18F25K22 y la LCD20x4 conectada el puerto B (he usado este LCD para comprobar que la libreria propuesta funciona adecudamente en una de este tamaño), un botón de reset y sus debidas resistencias (si no se ocupa dicha función solo es necesario conectar una resistencia de 10K de MCLR a VCC), para este ejemplo estare usando la PIC18BT MCE Development Board v1.0:
Código:
Hablemos un poco del codigo, lo primero fue crear los archivos "LCD_BIGDigits.h" y "LCD_BIGDigits.c" que seran los encargados de tener las funciones para cargar los caracteres y mostrar los numeros.
Si revisamos el codigo de original tenemos lo siguiente:
- Un array encargado de alamacenar los caracteres para CGRAM(bueno en total 8 para cada segmento).
- Un array para saber los caracteres que forman los numero del 0 al 9 (estos don de 2x2).
- Una funcion con con el nombre de la fuente, encargada de cargar sus caracteres a la CGRAM.
- Una funcion para actualizar los numeros en la LCD.
Los puntos 1, 2 y 3 son para cada tipo de fuente, osea que esto se repite para 24 en total que se muestra en el repositorio, el punto 4 aplica para todas las fuentes.
Considerando esto vamos a optimizar el codigo y poder reducirlo (con esto no digo el codifo odirginal este mal, prueba de ello es que el demo funciona) para que sea mas comprensible.
Lo primero tenemos un array de 8x8 donde alacenamos los caracteres como ejemplo tenemos "const uint8_t tron_bold_chars[8][8]" y tambien se tiene un array de 10x4 donde se almacenan los caracteres que ocupan del 0 al 9 como ejemplo tenemos "uint8_t tron_bold_digits[10][4]". Estos arrays seran para cada tipo de fuente que se tenga.
La siguiente usaremos un "typedef enum" para almacenas ahi nuestras fuentes de momento solo tengo tres "FONT_TRON_BOLD, FONT_SQUARE_FOUR y FONT_BLOCKS" si en un futuro se tiene mas basta con agregarlas, esto lo puedes encontrar en "LCD_BIGDigits.h".
La funcion unica para cargar los tipos de fuente propuesta es la siguiente:
void LCD_SetFont(FontType_t FONT){uint8_t i;uint8_t buffer[8];const uint8_t (*char_data)[8];// Assigns the pointer to character data and digit dataswitch(FONT) {case FONT_TRON_BOLD:char_data = tron_bold_chars;current_digits = tron_bold_digits;break;case FONT_SQUARE_FOUR:char_data = square_four_chars;current_digits = square_four_digits;break;case FONT_BLOCKS:char_data = blocks_chars;current_digits = blocks_digits;break;default:return;}// Load the 8 custom characters into the LCDfor (i = 0; i < 8; i++) {memcpy(buffer, char_data[i], 8);LCD_createChar(i, buffer);}}
La funcion es sencilla, primero se recibe un dato del tipo enum (mencionado antes), luego se tiene dos arrays de tipo puntero "const uint8_t (*char_data)[8]" y "const uint8_t (*current_digits)[4]" en donde uno contendra los caracteres y otro los digitos esto se realiza con "switch(FONT)", despues simplemente cargamos los caracteres a la CGRAM de la LCD.
Para escribir los digitos en la LCD, tenemos la siguiente funcion (la misma que del codigo original, solo adapatada para que sea compatible la libreria de la pantalla).
void LCD_DrawBigDigit(uint8_t digit, uint8_t xpos, uint8_t ypos){if (digit > 9 || current_digits == NULL) return;LCD_SetCursor(xpos, ypos);LCD_putc(current_digits[digit][0]);LCD_putc(current_digits[digit][1]);LCD_SetCursor(xpos+1, ypos);LCD_putc(current_digits[digit][2]);LCD_putc(current_digits[digit][3]);}
Por cierto se agrego una condicional para evitar mandar digitos mayores a 9 y tambien para asegurarse que antes de usar "LCD_DrawBigDigit" se haya cargado una fuente con "LCD_SetFont".
Con esto podemos ver el ejemplo, se uso un timer para hacer el cambio de fuentres cada 3 segundos, como se ve en el bucle principal se tiene el mismo demo original solo actualizado para mostrar los datos en una LCD20x4:
VÃdeo:
Aquà un pequeño vÃdeo del circuito en funcionamiento:
Descargas:
Aquà el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquÃ, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.
Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.
Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, asà también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.
Links:
- "HD44780U (LCD-II) Dot Matrix Liquid Crystal Display Controller/Driver", https://cdn.sparkfun.com/assets/9/5/f/7/b/HD44780.pdf
- Upiir (GitHub), "character_display_big_digits", https://github.com/upiir/character_display_big_digits
- MrChunckuee Electronics, "PIC18F25K22 & XC8: Libreria para LCD - Creacion de caracteres personalizados en la CGRAM", https://mrchunckuee.blogspot.com/2025/10/pic18f25k22-xc8-libreria-para-lcd.html





0 Comentarios