Está en la página 1de 4

3.

2 DISPLAYS LCD
En la guía MPLAB para las librerías del compilador C18 (pág. 75) se explican
detalladamente las funciones disponibles así como los argumentos de cada una de
ellas. También, proporciona un pequeño ejemplo de implementación. Recomiendo
que se revise dicho documento para comprender con mayor facilidad el código que
aquí se muestra. El display que vamos a utilizar es un 16×2 basado en el
controlador HITACHI HD44780, el cual es ampliamente utilizado en circuitos de
visualización microcontrolados..

La librería viene pre configurada (xc8 ver 1.2) de la siguiente manera:

 Puerto de datos: Puerto B.


 Modo de operación: 4 bits, parte baja del puerto B (B0:B3). Esto significa que B0
debe conectarse a D4 del display, B1 a D5, B2 a D6 y B3 a D7.
 LCD RS: B5
 LCD RW: B6
 LCD E: B4

Consideraciónes sobre la implementación en el circuito.

Como se puede observar en la configuración de los bits del microcontrolador, he


colocado un comentario respecto a RB5, esto se debe a que he notado que algunas
veces el puerto B funciona erróneamente cuando se coloca la configuración
autogenerada por MPLABX mediante la herramienta “Configuration bits”.

A continuación, mostramos la tabla del registro de configuración del oscilador


(Figura 4)
Figura 4. Registro OSCCON para la Configuración del Oscilador

Podemos ver que por default tiene cargado el valor: 0100 X000 que de acuerdo con
los valores de la tabla anterior corresponderían a la siguiente configuración:

 0 | El dispositivo entra en reposo/bajo consumo cuando se ejecuta la instrucción Sleep.


 100 | Frecuencia del oscilador interno: 1MHz
 X | Depende del estado del bit IESO
 0 | INTOSC La frecuencia del Oscilador Interno no es estable
 00 | Oscilador primario, externo
Aunque el microcontrolador está configurado por defecto con 1MHz es necesario
especificarlo en la palabra de configuración.
Para estas prácticas se utilizará una frecuencia de 4MHz y, como no es necesario
precisión en el tiempo, no pondremos ningún oscilador externo, de esta manera el
valor a cargar será el siguiente:

Funciones de retardo requeridas.

La librería requiere que el usuario defina los siguientes retardos para el display:

Estas funciones deben calcularse manualmente tomando como base la Fosc


anteriormente configurada. Veamos en detalle cada una de ellas:

DelayFor18TCY: requiere 18 ciclos de instrucción, hay dos métodos para conseguir


este retardo. Un método consiste en repetir secuencialmente unas doce veces la
función Nop(). La otra manera es utilizar la función Delay10TCYx() pasándole como
argumento un valor entero que represente el retardo equivalente a 18TCY, haciendo
unos cálculos se puede decir que este valor anda por 2.5 por MHZ. Entonces,
estamos trabajando con un Fosc = 48MHZ tendríamos que 2.5 x 48 = 120, la función
nos quedaría Delay10TCYx(120). Personalmente prefiero este segundo método, la
función completa sería así:

El ejemplo es el siguiente:

1 #include <xc.h>
2 #include <stdio.h>
#include <stdlib.h>
3 #include <plib/xlcd.h>
4 #include <plib/delays.h>
5
6 //CON ESTE ORDEN DE CONFIGURACION FUNCIONA RB5.....
7 #pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2
#pragma config FOSC = HSPLL_HS, FCMEN = OFF, IESO = OFF
8 #pragma config PWRT = OFF, BOR = OFF, VREGEN = OFF
9 #pragma config WDT = OFF, WDTPS = 32768
10 #pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF
11 #pragma config STVREN = ON, LVP = OFF, ICPRT = OFF, XINST = OFF
12
13 #define _XTAL_FREQ 48000000
14
//Retardos requeridos por la librería XLCD
15 void DelayFor18TCY(void);
16 void DelayPORXLCD(void);
17 void DelayXLCD(void);
18
19 int main() {
20 //Configurando LCD 4 bits mutilínea
OpenXLCD(FOUR_BIT & LINES_5X7);
21 //Esperar hasta que el display esté disponible.
22 while(BusyXLCD());
23 //Mover cursor a la derecha...
24 WriteCmdXLCD(0x06);
//Desactivando el cursor.
25 WriteCmdXLCD(0x0C);
26
27 while(1)
28 {
29 //Primera línea
30 SetDDRamAddr(0x00);
putrsXLCD("HOLA");
31 //Segunda línea
32 SetDDRamAddr(0x40);
33 putrsXLCD("MUNDO");
34 }
35
}
36 void DelayFor18TCY(void)
37 {
38 Delay10TCYx(120);
39 }
40
41 void DelayPORXLCD(void)
{
42 Delay1KTCYx(180);
43 return;
44 }
45
46 void DelayXLCD(void)
47 {
Delay1KTCYx(60);
48 return;
49 }
50

También podría gustarte