Skip to content

Instantly share code, notes, and snippets.

@jerivas
Last active December 24, 2015 01:19
Show Gist options
  • Save jerivas/6722690 to your computer and use it in GitHub Desktop.
Save jerivas/6722690 to your computer and use it in GitHub Desktop.
//Archivo de cabecera para configuración y uso de módulo LCD
//con el PIC18F4550 en el puerto D y E.
#include "p18f4550.h" //Cabecera de Núcleo
#include "xc.h"
#include "delays.h"
#include "stdlib.h"
//Prototipos de las funciones
void LCD_Retardo_Corto();
void LCD_Retardo_Largo();
void LCD_Inicializar();
void LCD_Limpiar();
void LCD_Posicion(unsigned char x, unsigned char y);
void LCD_Caracter(unsigned char Caracter);
void LCD_display(unsigned char Caracter);
void LCD_Cadena(unsigned char *Cadena);
//Definiciones de pines de la LCD para referencia simplificada
#define LCD_RS LATE0
#define LCD_RW LATE1
#define LCD_E LATE2
#define LCD_DATA LATD
//********************************************************
//Funcion usada para generar los retardos de la linea E de la pantalla LCD
void LCD_Retardo_Corto() {
Delay10TCYx(150);
}
//Funcion usada para generar los retardos de la inicializacion de la LCD
void LCD_Retardo_Largo() {
Delay10TCYx(250);
Delay10TCYx(250);
}
//Funcion de inicializacion de la pantalla LCD
void LCD_Inicializar() {
//Permite un cierto tiempo para que la pantalla inicialice internamente
LCD_Retardo_Largo();
//Envia el comando de inicializacion que establece el modo de 8 bits
LCD_RS = 0;
//Se enviara un comando
LCD_RW = 0;
//La operacion es de escritura
LCD_DATA = 0b00110000; //Comando que establece la interfase de 8 bits
LCD_E = 1;
LCD_Retardo_Corto(); //Pulsa la linea de Enable brevemente
LCD_E = 0;
LCD_Retardo_Corto();
//Espera a que la LCD procese el comando
LCD_Retardo_Largo();
//Envia el mismo comando por segunda vez
//(los puertos retienen sus valores anteriores)
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
//Espera nuevamente
LCD_Retardo_Largo();
//Envia el mismo comando por tercera vez
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
//Espera nuevamente
LCD_Retardo_Largo();
//Envia el comando que activa las 2 filas y establece la fuente grande
LCD_DATA = 0b00111100;
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
//El siguiente comando enciende el display completo y el cursor parpadeante
LCD_DATA = 0b00001111;
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
//Este comando indica al LCD que escriba hacia la derecha y que no desplace
//el texto al ir escribiendo
LCD_DATA = 0b00000110;
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
//Al final se limpia toda la pantalla
LCD_Limpiar();
}
//Funcion de limpieza de la pantalla LCD
void LCD_Limpiar() {
//Envia el comando que hace la operacion de limpieza
LCD_RS = 0;
//Se enviara un comando
LCD_RW = 0;
//La operacion es de escritura
LCD_DATA = 0b00000001;
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
}
//Funcion para establecer la posicion de escritura en la pantalla
void LCD_Posicion(unsigned char x, unsigned char y) {
unsigned char Direccion_DDRAM;
//Determina la direccion base de la DDRAM de acuerdo a la coordenada y
if (y == 0) Direccion_DDRAM = 0x00; //La fila 0 comienza en la direccion 0
else Direccion_DDRAM = 0x40; //La fila 1 comienza en la direccion 0x40
//Suma la coordenada x a la direccion base (aplica mascara)
Direccion_DDRAM += x & 0x0F;
//Una vez encontrada la direccion se envia el comando a la pantalla
LCD_RS = 0;
//Se enviara un comando
LCD_RW = 0;
//La operacion es de escritura
LCD_DATA = 0b10000000 | Direccion_DDRAM;
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
}
//Funcion de impresion de un caracter simple en la pantalla
void LCD_Caracter(unsigned char Caracter) {
LCD_RS = 1;
//Se enviara un dato
LCD_RW = 0;
//La operacion es de escritura
LCD_DATA = Caracter; //Coloca el caracter en el bus
LCD_E = 1;
LCD_Retardo_Corto(); //Provoca una pulsacion del enable
LCD_E = 0;
LCD_Retardo_Corto();
}
//Funcion de impresion de cadenas en pantalla LCD
void LCD_Cadena(unsigned char *Cadena) {
unsigned char i;
//Para imprimir una cadena simplemente se envian los caracteres de uno en
//uno hasta que se encuentra el cero terminador
for (i = 0; Cadena[i] != 0; i++)
LCD_Caracter(Cadena[i]);
}
//Funcion de impresion de un caracter simple en la pantalla
void LCD_display(unsigned char Caracter) {
LCD_RS = 1;
//Se enviara un dato
LCD_RW = 0;
//La operacion es de escritura
LCD_DATA = Caracter + 0x30; //Coloca el caracter en el bus
LCD_E = 1;
LCD_Retardo_Corto(); //Provoca una pulsacion del enable
LCD_E = 0;
LCD_Retardo_Corto();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment