Anda di halaman 1dari 3

Archivos de cabecera para PIC 16F84A y PIC16F877A

compilador XC8
Codigo de MrElberni

El código del archivo de cabecera para el uso de las pantallas LCD con los PIC es el
siguiente:

#ifndef LCD_H
#define LCD_H
#include “tiempo.h” ///Se incluye para los retardos
#define rs PORTAbits.RA0 //Esto lo puedes
#define tris_rs TRISAbits.TRISA0 //modificar si quieres utilizar
#define rw PORTAbits.RA1 //otros pines del PIC
#define tris_rw TRISAbits.TRISA1 //para los bits de control del LCD
#define e PORTAbits.RA2
#define tris_e TRISAbits.TRISA2
#define db4 PORTBbits.RB4 //Esto lo puedes modificar si quieres
#define tris_db4 TRISBbits.TRISB4 //que los pines para el envio de datos
#define db5 PORTBbits.RB5 //u ordenes sean a través de otro puerto
#define tris_db5 TRISBbits.TRISB5 //pero es este caso siempre tendrá que
#define db6 PORTBbits.RB6 //ser el nibble alto del puerto que utilices.
#define tris_db6 TRISBbits.TRISB6
#define db7 PORTBbits.RB7
#define tris_db7 TRISBbits.TRISB7
void lcd_inicia();
void lcd_pulso();
void lcd_orden(unsigned int);
void lcd_caracter(unsigned int );
void lcd_mensaje(char*);
void lcd_limpiar();
void lcd_acasa();
void lcd_ubicate(char,char);
void lcd_inicia(){
tris_rs=0;
tris_rw=0;
tris_e=0;
tris_db4=0;
tris_db5=0;
tris_db6=0;
tris_db7=0;
rs=0;
rw=0;
e=0;
db4=0;
db5=0;
db6=0;
db7=0;
delay_ms(20);
PORTB=0X03<<4; //Esto también deberá modificarce,
lcd_pulso(); //dependiendo del puerto que utilices para
delay_us(4100); //el envio de datos u ordenes.
PORTB=0X03<<4;
lcd_pulso();
delay_us(4100);
PORTB=0X03<<4;
lcd_pulso();
delay_us(150);
PORTB=0X02<<4;//a 4 bits
lcd_pulso();
lcd_orden(0x28);//a 4 bits,2 lineas, 5×7 puntos
delay_us(80);
lcd_orden(0x0c);//display encendido,no muestra cursor,sin parpadeo
delay_us(80);
lcd_orden(0x01);//Limpia pantalla;
delay_ms(2);
lcd_orden(0x06);//incremento a la derecha, sin desplazamiento de display
delay_us(80);
}
void lcd_pulso(){ //función para habilitar el LCD
e=1;
delay_us(40);
e=0;
delay_us(40);
}
void lcd_orden(unsigned int orden){ //Función para enviar ordenes al LCD
rs=0;
//Se modificará si se usa un puerto diferente al PORTB
PORTB=(((((PORTB>>4&0x0f)|0x0f)&(orden>>4&0x0f))<<4)|(PORTB&0x0f));
lcd_pulso();
PORTB=(((((PORTB>>4&0x0f)|0x0f)&(orden&0x0f))<<4)|(PORTB&0x0f));
lcd_pulso();
}
void lcd_caracter(unsigned int caracter){ //Función para enviar caracteres al LCD
rs=1;
//Se modificará si se usa un puerto diferente al PORTB
PORTB=(((((PORTB>>4&0x0f)|0x0f)&(caracter>>4&0x0f))<<4)|(PORTB&0x0f));
lcd_pulso();
PORTB=(((((PORTB>>4&0x0f)|0x0f)&(caracter&0x0f))<<4)|(PORTB&0x0f));
lcd_pulso();
rs=0;
}
void lcd_mensaje(char* cadena){ //Función para enviar cadenas de caraacteres al LCD
while(*cadena != 0x00){
lcd_caracter(*cadena);
cadena++;
}
}
void lcd_limpiar(){ //Función para limpiar la pantalla LCD
lcd_orden(0x01);
delay_ms(2);
}
void lcd_acasa(){ //Función par enviar el cursor al inicio de la pantalla
lcd_orden(0x02);
delay_us(40);
}
void lcd_ubicate(char linea,char columna){ //Función para ubicar el cursor
lcd_acasa(); //en cualquier ubicación del LCD
if (linea==1){
for(char i=1; i<columna; i++){
lcd_orden(0x14);
}
}
if(linea==2){
for (char i=1;i<(columna+40);i++){
lcd_orden(0x14);
}
}
}
#endif

El código para el archivo de cabecera de los tiempos es el siguiente:

#ifndef TIEMPO_H
#define TIEMPO_H
void delay_ms(unsigned int);
void delay_us(unsigned int);
void delay_ms(unsigned int tiempo){
for(int i=0;i<tiempo;i++){
__delay_ms(1);
}
}
void delay_us(unsigned int tiempo){
for(int i=0;i<tiempo;i++){
__delay_us(1);
}
}
#endif

En el canal de youtube de MrElberni se han publicado 2 vídeos para ver el uso de las
pantallas LCD con el XC8, en ellos se ven la forma de utilizar los archivos indicados
lineas arriba.

Anda mungkin juga menyukai