Está en la página 1de 17

Lcd_y_matrix_F4550

Anexo A

Manejo de la pantalla LCD

Las pantallas LCD son dispositivos que se utilizan para visualizar


informacin. Los dispositivos LCD poseen internamente un
microcontrolador especifico que sirven para regular el funcionamiento de
los mismos.

Las pantallas mas comunes estn formados por una matriz de 5*7 pixels
en una o en varas lneas, en el siguiente proyecto se trabajar con una
pantalla LCD que permite trabajar dos lneas de 16 caracteres cada una y,
que posee un microcontrolador 44780. Esta pantalla que se muestra en la
_gura 37 posee 14 terminales que sern explicados con detalle a
continuacin.

Como se observan los 14 terminales son VSS, VDD, VEE, RS, RW, E, D0,
D1, D2, D3, D4, D5, D6, y D7, estos terminales se dividen en tres
categoras, los tres primeros son los terminales de alimentacin, los
siguientes tres terminales son los utilizados para control del LCD y los
ltimos 8 respectivamente, son utilizados para transferir los datos.

Terminales de Alimentacin

1. VSS: Se aplica la tierra


2. VDD: Se aplica la alimentacin de 5 voltios
3. VEE: Normalmente este terminal se conecta a un potencimetro que
permita variar un voltaje entre 0 a 5 voltios y as observar la diferencia de
brillo y contraste que se puede tener en la pantalla LCD. Si se conecta a
tierra, se indica el mayor contraste.

Terminales de Control

1. RS: Por este terminal, se indica a la pantalla LCD si se va escribir un


comando o una data, se entiende por comandos todas aquellas
instrucciones que sirven para inicializar la pantalla, borrar pantalla,
posicionar el cursor entre otras, para todo esto, se debe colocar un _0_ en
este terminal; por el contrario si se conecta a _1_ , lo que se enva es la
data, generalmente el cdigo ASCII del carcter a mostrar.

2. RW: Este terminal corresponde a Read/Write, es decir, es el terminal


que indica si vamos a leer o a escribir de la pantalla LCD, siendo _1_ para
leer y _0_ para escribir.

3. E: Enable, este terminal permite habilitar el proceso de escritura/lectura


a la pantalla LCD. Si no se activa este terminal, la informacin en D0-D7
no se lee o escribe.

Terminales para Data Estos 8 terminales reciben los caracteres ASCII a


representar, as como
ciertos cdigos de control que regulan los efectos de visualizacin o para
obtener informacin sobre el estado interno del dispositivo.

El dispositivo LCD responde a una serie de comandos con los que se


puede manipular sus distintas opciones de trabajo, para lo cual se hace
referencia a la tabla 2.

Comando RS R/W E D7 D6 D5 D4 D3 D2 D1 D0
Tiempo de
Ejecucin
Clear Display 0 0 1 0 0 0 0 0 0 0 1 1.64 ms
Home 0 0 1 0 0 0 0 0 0 1 x 1.64 ms
Entry Mode Set 0 0 1 0 0 0 0 0 1 I/D S 40 us
Display On/O_ 0 0 1 0 0 0 0 1 D C B 40 us
Cursor Display Shift 0 0 1 0 0 0 1 S/C R/L x x 40 us
Function Set 0 0 1 0 0 1 DL N F x x 40 us
Set CGRAM Address 0 0 1 0 1 Direccin de la CGRAM 40 us
Set DDRAM Address 0 0 1 1 Direccin de la DDRAM 40 us
Read Busy Flags Address 0 1 1 BF Direccin de la CGRAM o DDRAM 40 us
Write Data to CG o DD 1 0 1 Cdigo ASCII para la RAM 40 us
Read Data to CG o DD 1 1 1 Cdigo Almacenado en RAM 40 us

Tabla 2: Cdigos de los Comandos a los que responde el Dispositivo LCD

A continuacin se explica con detalle todas las abreviaturas utilizadas en


la tabla
S: Se refiere a la visualizacin, si vale _1_, indica que cada vez que escribe
un dato, la visualizacin se desplaza automticamente a la siguiente
posicin, por el contrario si vale _0_, funciona de forma normal.

I/D: Se re_ere al cursor, si vale _1_, el cursor se incrementa


automticamente de direccin luego de escribir, si vale _0_, ste se
decrementa.

S/C: Si vale _1_ se desplaza la visualizacin, si vale _0_ se desplaza el


cursor.

R/L: Si vale _1_ el desplazamiento es a la derecha del LCD, si vale _0_ es a


la izquierda.

BF: si vale _1_ el dispositivo LCD se encuentra en funcionamiento u


ocupado, si se encuentra en _0_, indica que esta disponible.

DL: Si vale 1 trabaja con un bus de datos de 8 bits, si vale _0_ trabaja con
bus de solo 4 bits,
que es el caso que se eligi en el proyecto.

N: Si vale _1_ la presentacin se hace en dos lneas, si vale _0_ se hace en


una sola lnea.

F: Este indica el tamao o la caja de los caracteres, si vale _1_ es de 5x10


pixels, si vale _0_, es de 5x7.
A continuacin se explica con detalle todas las abreviaturas utilizadas en
la tabla

S: Se re_ere a la visualizacin, si vale _1_, indica que cada vez que escribe
un dato, la visualizacin se desplaza automticamente a la siguiente
posicin, por el contrario si vale _0_, funciona de forma normal.
I/D: Se re_ere al cursor, si vale _1_, el cursor se incrementa
automticamente de direccin luego de escribir, si vale _0_, ste se
decrementa.

S/C: Si vale _1_ se desplaza la visualizacin, si vale _0_ se desplaza el


cursor.

R/L: Si vale _1_ el desplazamiento es a la derecha del LCD, si vale _0_ es a


la izquierda.

BF: si vale _1_ el dispositivo LCD se encuentra en funcionamiento u


ocupado, si se encuentra en _0_, indica que esta disponible.

DL: Si vale 1 trabaja con un bus de datos de 8 bits, si vale _0_ trabaja con
bus de solo 4 bits,
que es el caso que se eligi en el proyecto.

N: Si vale _1_ la presentacin se hace en dos lneas, si vale _0_ se hace en


una sola lnea.

F: Este indica el tamao o la caja de los caracteres, si vale _1_ es de 5x10


pixels, si vale _0_, es de 5x7.

B: Si vale _1_, parpadeo del cursor encendido y si es _0_ , parpadeo del


cursor apagado.
C: Si vale _1_, el cursor esta activado, si vale _0_ el cursor esta
desactivado.

D: Si vale _1_, la pantalla esta activada, si vale _0_ la pantalla esta


desactivada.

X: Indeterminado

A continuacin se describen la funcin de los comandos que controlan el


dispositivo LCD Clear Display: Este comando borra la pantalla del
dispositivo LCD y coloca el cursor en la primera posicin, que es la
direccin 0, por defecto coloca el bit I/D en _1_ para autoincremento de la
posicin del cursor.

Home: Pone el cursor en la direccin 0 y no vara el contenido de la


memoria DDRAM que guarda los datos y que queda direccionada desde la
posicin 0.

Entry Mode Set: Establece la direccin del movimiento del cursor, si coloca
el bit S en _1_ desplaza la visualizacin cada vez que se escribe un dato,
si S vale _0_ la visualizacin es normal.

Display On/O_: Activa o Desactiva al Display (D) y al cursos (C) y


determina si ste es intermitente o no.
Cursor Display Shift: Mueve el cursor y desplaza la visualizacin sin
cambiar el contenido de la memoria DDRAM.

Function Set: Establece el nmero de lneas que se van a utilizar, con el


bus de datos, siendo
normalmente que sea de 8 bits, por lo que DL=1 y especfica el nmero
de lneas de caracteres, que para que sean dos se debe colocar N=1 y el
formato del carcter si F=0 entonces es de 5x7 pixels.

Set CGRAM Adress: El dispositivo LCD tiene definidos los caracteres ASCII,
sin embargo permite que el usuario pueda definir un mximo de nueve
caracteres nuevos. stos se guardan en CGRRAM. Con este comando se
indica la direccin de la CGRAM a partir de la cual se irn almacenando los
bytes que de_nen al nuevo carcter. Luego de ejecutar este comando
todos los datos que se lean o escriban posteriormente lo hacen desde esa
posicin de la CGRAM.
Set DDRAM Adress: Establece la direccin de la DDRAM, a partir de la cual
todos los datos que se lean o escriban posteriormente lo harn desde esta
posicin. Es los 16 caracteres del primer rengln ocupan las direcciones
80H- 8FH y los del segundo desde C0H- CFH.

Read Busy Flags Adress: Se trata de un comando para la lectura de las


bandera BUSY, que indica si todava se est ejecutando un comando
previo en la pantalla, y adems proporciona la direccin de la CGRAM y
DDRAM que se haya utilizado por ltima vez.

Write Data to CG o DD: Se escribe en la DDRAM los caracteres ASCII, que


se desea visualizar.
Tambin se escriben en la CGRAM los bytes de los nuevos caracteres
creados por el usuario,
en caso de existir los mismo. Se usa una memoria u otra segn haya sido
la instruccin de
direccionamiento anterior, que har que se re_eje el contenido de la
memoria DDRAM o CGRAM.

Read Data to CG o DD: Es muy parecido al comando anterior, pero en este


caso es solo para
lectura de los datos que se encuentren en las memorias DDRAM o CGRAM.

En el archivo de encabezado se declaran los prototipos de las funciones


del LCD y se de_nen los cdigos de los comandos principales mostrados
en la tabla 2. El archivo de encabezado (lcd.h) se muestra en el listado 13:

//*************************************************************************
*
//
//Listado 13 Archivo de encabezado LCD.h
//
//*************************************************************************
*
typedef void VOID;
typedef int INT;
typedef signed char INT8;
typedef signed int INT16;
typedef signed long INT32;
typedef unsigned short WORD;
typedef char CHAR;
typedef unsigned char BYTE;
typedef double FLOAT;
typedef long LONG;
typedef INT8 BOOL;

//Display Config.
#define MAX_DISPLAY_CHAR 16
//LCD Registers addresses (PORT E)
#define LCD_CMD_WR 0x00
#define LCD_DATA_WR 0x01
#define LCD_BUSY_RD 0x02
#define LCD_DATA_RD 0x03
//LCD Commands
#define LCD_CLS 0x01
#define LCD_HOME 0x02
#define LCD_SETMODE 0x04
#define LCD_SETVISIBLE 0x08
#define LCD_SHIFT 0x10
#define LCD_SETFUNCTION 0x20
#define LCD_SETCGADDR 0x40
#define LCD_SETDDADDR 0x80
#define E_PIN_MASK 0x04
#define FALSE 0
#define TRUE 1

//*************************************************************************
*
//***** FUNCTION PROTOTYPES *****
//*************************************************************************
*

VOID lcd_display (CHAR y, CHAR x, CHAR *buf);


VOID lcd_char (CHAR ch);
VOID lcd_init(void);
VOID lcd_wait(void);
VOID wrcmd (CHAR data);
VOID wrdata(CHAR data);
VOID lcd_clear(void);
VOID lcd_reset(void);
VOID setpos(CHAR y, CHAR x);

Listado 14 lcdio.c
/*****************************************************************
//***** PIC18F Driver for LCD in 4-bit mode *****
******************************************************************/
#include "p18cxxx.h"
#include <delays.h>
#include "lcd.h"

VOID wrcmd8 (CHAR cmdcode);


VOID lcd_init ()

// Initialise the LCD Display.


{

PORTB = TRISB = 0x0F;


PORTE = TRISE = 0;
Delay10KTCYx(25);
wrcmd8(LCD_SETFUNCTION+0x10); // Software reset.
wrcmd8(LCD_SETFUNCTION+0x10); //
wrcmd8(LCD_SETFUNCTION+0x12); //
#ifdef BIT8
wrcmd8(LCD_SETFUNCTION+0x18); // 8-bit mode - 2 line - 5x7 font.
#else
wrcmd8(LCD_SETFUNCTION+0x08); // 4-bit mode - 2 line - 5x7 font.
wrcmd(LCD_SETFUNCTION+0x08); // 4-bit mode - 2 line - 5x7 font.
#endif
wrcmd(LCD_SETVISIBLE+0x04); // Display, no cursor - no blink.
wrcmd(LCD_SETMODE+0x02); // Automatic Increment - No Display shift.
wrcmd(LCD_SETDDADDR+0x00); // Address DDRAM with 0 offset 80h.

}
VOID lcd_display (CHAR y, CHAR x, CHAR *buf)

{ INT8 i;
setpos(y,x);

for (i=0 ; buf[i] != 0; i++)


{ wrdata(buf[i]); }
}

VOID lcd_char (CHAR ch)


{ INT8 i;
wrdata(ch);
}

VOID lcd_clear()
// Clear the LCD Screen and reset

// initial position.

{ wrcmd(LCD_CLS);
wrcmd(LCD_SETDDADDR+0x0);
}
VOID setpos (CHAR y, CHAR x)
{

if(y==1)
wrcmd(LCD_SETDDADDR+(x-1));

else
wrcmd(LCD_SETDDADDR+0x40+(x-1));
}

Listado 15 continuacin lcdio.c


VOID wrcmd8 (CHAR cmdcode)

// Write a command to the LCD display.

{ TRISB = 0x0F;
PORTB = cmdcode;

// Write to PORTB to latch data into the display.

// Toggle Pin E to send the command.

PORTE = LCD_CMD_WR;
PORTE |= E_PIN_MASK;

_asm
NOP
NOP
_endasm

PORTE &= ~E_PIN_MASK;


lcd_wait();
}

/***** Utility Functions *****/


VOID wrcmd (CHAR cmdcode)

// Write a command to the LCD display.


// In 4-bit mode we send the MSN first and then
// the LSN. We then call the wait routine to hold
// until the busy flag is cleared.

{ TRISB = 0x0F;

#ifdef BIT8

PORTB = (cmdcode);
#else
PORTB = (cmdcode & 0xF0); // Get the most significant nibble first.
#endif

PORTE = LCD_CMD_WR; // Specify a command write operation.


PORTE |= E_PIN_MASK; // Toggle the E pin to send the command.

_asm
NOP
NOP
_endasm

PORTE &= ~E_PIN_MASK;

#ifdef BIT8

lcd_wait(); // Call the wait routine.

#else

TRISB = 0x0F;
PORTB = (cmdcode << 4); // Repeat for least significant nibble.
PORTE = LCD_CMD_WR;
PORTE |= E_PIN_MASK;
_asm
NOP
NOP
_endasm

PORTE &= ~E_PIN_MASK;


lcd_wait(); // Call the wait routine.
#endif
}

VOID wrdata (CHAR data)

// Write a Character to the LCD Display.


// In 4-bit mode we send the MSN first and then
// the LSN. We then call the wait routine to hold
// until the busy flag is cleared.

{ TRISB = 0x0F;

#ifdef BIT8

PORTB = data;
#else

PORTB = data & 0xF0; // Get the most significant nibble first.
#endif

PORTE = LCD_DATA_WR; // Specify a data write operation.


PORTE |= E_PIN_MASK; // Toggle the E pin to send the command.

_asm
NOP
NOP
_endasm
PORTE &= ~E_PIN_MASK;

#ifdef BIT8

lcd_wait(); // Call the wait routine.

#else

TRISB = 0x0F;
PORTB = (data << 4); // Repeat for least significant nibble.
PORTE = LCD_DATA_WR;
PORTE |= E_PIN_MASK;

_asm
NOP
NOP
_endasm

PORTE &= ~E_PIN_MASK;


lcd_wait(); // Call the wait routine.

#endif

}
VOID lcd_wait ()
{
Delay1KTCYx(10);
}

Anexo B
Manejo del Teclado Matricial
Un teclado matricial es un dispositivo de entrada de datos donde las
lneas necesarias para detectar la tecla pulsada se agrupan de forma
matricial en _las y columnas con el _n de disminuir las lneas requeridas.
Para un teclado de 12 teclas solo se requieren de 7 lneas de
entrada/salida del microcontrolador para manejar el teclado. En la _gura
38 se muestra el esquema de un teclado matricial de 12 teclas.
Las lneas RB1-RB3 en la _gura son ledas por el nible inferior del puerto B
(RB1-RB3), por lo que se tienen que configurar como entradas, mientras
que las del nible superior (RB4-RB7) se configuran como salidas y es
donde se aplican el patrn de estados lgicos para ser ledos por el nible
inferior.

El programa que se muestra en el listado 17 gestiona el manejo del


teclado, en el mismo se saca secuencialmente un nivel bajo por una de las
4 lneas de salida que se aplican a las _las (RB4-RB7), al mismo tiempo
que se lee el nivel lgico que llega al nible inferior o columnas (RB1-RB3).
Si al leer este nible, una de las lneas se encuentra en nivel bajo, se
deduce que la tecla asociada a dicha _la y dicha columna se encuentra
presionada. Cada tecla tiene un cdigo asociado desde el 1 al 12. Luego
estos cdigos pueden ser sustituidos por un cdigo ASCII por medio del
uso de un tabla.

Listado 17 kdbio.c|
#include <p18cxxx.h>
#include <delays.h>
char keypadread(void);
char scankey(void);
char keypadread()

// Find a key, wait for it to be released and return.


{ char key;
key = scankey();
if (key)
while (scankey() != 0);
return key;
}

char scankey()

// Scan the keypad for a keypress.


// Return 0 for no press.

{ char row,col,idx;
unsigned char wait,tmp;
idx=0;
TRISB=0x0F;
for (row=0; row < 4; row++)

{ // Drive appropriate row low and read columns:

LATB = ~(1 << (row+4));


for (wait=0; wait<200; ++wait);
tmp = (PORTB & 0x0F);

// See if any column is active (low):


for (col=1; col<4; col++)
{
if ((tmp & (1<<col)) == 0)
{
idx = (row*4) + col;
break;
}
}
if(idx!=0) break;
}
TRISB=0x00;
return idx;
}

Rutina scankey() Esta rutina es la que realiza el barrido por las _las y
columnas del teclado para detectar si se ha presionado una tecla. La
rutina realiza un solo barrido y si una tecla es presionada retorna el cdigo
de la misma, por el contrario si ninguna tecla es presionada la rutina
retorna cero.

PR Listado 17 kdbio.c

#include <p18cxxx.h>
#include <delays.h>
char keypadread(void);
char scankey(void);
char keypadread()

// Find a key, wait for it to be released and return.

{ char key;
key = scankey();
if (key)
while (scankey() != 0);
return key;
}
char scankey()

// Scan the keypad for a keypress.


// Return 0 for no press.

{ char row,col,idx;
unsigned char wait,tmp;
idx=0;
TRISB=0x0F;
for (row=0; row < 4; row++)

{ // Drive appropriate row low and read columns:

LATB = ~(1 << (row+4));


for (wait=0; wait<200; ++wait);
tmp = (PORTB & 0x0F);

// See if any column is active (low):

for (col=1; col<4; col++)


{
if ((tmp & (1<<col)) == 0)
{
idx = (row*4) + col;
break;
}
}
if(idx!=0) break;
}
TRISB=0x00;
return idx;
}

Rutina scankey() Esta rutina es la que realiza el barrido por las _las y
columnas del teclado para detectar si se ha presionado una tecla. La
rutina realiza un solo barrido y si una tecla es presionada retorna el cdigo
de la misma, por el contrario si ninguna tecla es presionada la rutina
retorna cero.

Rutina keypadread() Esta rutina llama a la rutina scankey y si una tecla


fue presionada la
rutina espera hasta que la tecla deje de estar presionada y luego retorna
el cdigo del tecla.

También podría gustarte