¡Saludos! Siguiendo con los ejemplos en XC8, ahora vamos a tocar el tema de las pantallas LCD, específicamente una de 16x2 (pero la librería también soporta 16x4), debo aclarar que no soy el autor de dicha librería, el autor es Manolis Agkopian (magkopian en GitHub), yo solo hago uso de ella y muestro con un ejemplo como se utiliza.
Circuito:
El circuito usado es el siguiente, un PIC18F25K22 y la LCD16x2 conectada el puerto B, 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):
El código de ejemplo es el siguiente (al final de la publicación están todos los archivos para descarga):
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/******************************************************************************* | |
* | |
* Uso de la libreria LCD | |
* | |
******************************************************************************* | |
* FileName: main.c | |
* Processor: PIC18F25K22 | |
* Complier: XC8 v1.30 | |
* Author: Pedro Sánchez (MrChunckuee) | |
* Blog: http://mrchunckuee.blogspot.com/ | |
* Email: mrchunckuee.psr@gmail.com | |
* Description: Probando libreria para LCD 16x2, debo mencionar que no soy el | |
* autor original de la libreria solo hago uso de ella, en la | |
* cabecera de lcd.c esta el enlace a su GitHub | |
******************************************************************************* | |
* Rev. Date Comment | |
* v1.00 03/02/2017 Creación del ejemplo | |
******************************************************************************/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <stdbool.h> | |
#include <xc.h> | |
#include "FUSES_Config.h" //Only here | |
#include "lcd.h" | |
#define _XTAL_FREQ 16000000 | |
#define LED_1 PORTCbits.RC6 | |
unsigned int RTCC_Count = 0; | |
char text_1[] = " MrChunckuee! "; | |
char text_2[] = "http://mrchunckuee.blogspot.com/"; | |
void MCU_Init(void); | |
void MCU_Delayms(unsigned int time); | |
void RTCC_Init(void); | |
void interrupt high_priority ISR(void){ | |
if(INTCONbits.TMR0IF){ | |
++RTCC_Count; | |
if (RTCC_Count >= 1000){ | |
LED_1 ^= 1; //Blink LED | |
RTCC_Count = 0; | |
} | |
TMR0H = 0xF8; | |
TMR0L = 0x30; | |
INTCONbits.TMR0IF = 0; | |
return; | |
} | |
} | |
int main ( void ) { | |
MCU_Init(); | |
//Definimos el puerto y los pines donde esta la LCD | |
LCD lcd = { &PORTB, 0, 1, 4, 5, 6, 7 }; // PORT, RS, EN, D4, D5, D6, D7 | |
LCD_Init(lcd); | |
LCD_Clear(); | |
while(true) { | |
LCD_Clear(); | |
LCD_Set_Cursor(0,0); | |
LCD_putrs(" LCD 16x2 & XC8 "); | |
LCD_Set_Cursor(1,0); | |
for(char c = 0; c<15; ++c){ | |
LCD_putc(text_1[c]); | |
MCU_Delayms(300); | |
} | |
MCU_Delayms(1000); // Delay 1s | |
LCD_Clear(); | |
LCD_Set_Cursor(0,0); | |
for(char c = 0; c<16; ++c){ | |
LCD_putc(text_2[c]); | |
MCU_Delayms(300); | |
} | |
LCD_Set_Cursor(1,0); | |
for(char c = 16; c<32; ++c){ | |
LCD_putc(text_2[c]); | |
MCU_Delayms(300); | |
} | |
MCU_Delayms(1000); // Delay 1s | |
} | |
} | |
void MCU_Init(void){ | |
ANSELA = 0; | |
ANSELB = 0; | |
ANSELC = 0; | |
//Configura oscilador interno a 16MHz | |
OSCCONbits.IRCF=0b111; //El ciclo de instruccion es de 0.25 us | |
TRISCbits.RC6 = 0; //Pin del LED como salida | |
RTCC_Init(); | |
} | |
void MCU_Delayms(unsigned int time){ | |
unsigned int acc; | |
for(acc=0; acc<time; acc++){ | |
__delay_ms(1); | |
} | |
} | |
void RTCC_Init(void){ | |
//Configuración del TMR0 = 1mS | |
T0CONbits.TMR0ON = 1; //TMR0 On | |
T0CONbits.T08BIT = 0; //16 bits | |
T0CONbits.T0CS = 0; | |
T0CONbits.T0SE = 0; | |
T0CONbits.PSA = 0; | |
T0CONbits.T0PS = 0b000; // Prescaler = 2 | |
TMR0H = 0xF8; | |
TMR0L = 0x30; | |
INTCONbits.TMR0IF = 0; | |
INTCONbits.TMR0IE = 1; | |
INTCON2bits.TMR0IP = 1; | |
RCONbits.IPEN = 1; | |
INTCONbits.GIEH = 1; | |
} |
Aquí un vídeo del circuito en acción:
Pues de momento todo trabaja bien, habría que hacer mas pruebas con otros microcontroladores, o incluso ver si se pueden usar puertos combinados, etc. Lo que si note es que cuando intente usar un FOSC=64MHz me botaba unos errores sobre unos retardos en lcd.c, así que opte por usar 16MHz.
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.
Bibliografía:
- Manolis Agkopian (magkopian), "pic-xc8-lcd-library", https://github.com/magkopian/pic-xc8-lcd-library
4 Comentarios
excelente aporte gracias...
ResponderEliminarEs bueno saber que te ha servido.
Eliminardonde descargaste las librerias: (FUSES_Config.h) y (lcd.h) ?
ResponderEliminar?
FUSES_Config.h la he creado yo y varia dependiendo del PIC que utilice, lcd.h la he retomado del proyecto original (al inicio del blog esta el enlace), ahora el proyecto que muestro yo lo puedes descargar desde github y es la carpeta XC8_005.
Eliminar