Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Anexo A
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
Terminales de Control
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
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.
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.
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.
X: Indeterminado
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.
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.
//*************************************************************************
*
//
//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 *****
//*************************************************************************
*
Listado 14 lcdio.c
/*****************************************************************
//***** PIC18F Driver for LCD in 4-bit mode *****
******************************************************************/
#include "p18cxxx.h"
#include <delays.h>
#include "lcd.h"
}
VOID lcd_display (CHAR y, CHAR x, CHAR *buf)
{ INT8 i;
setpos(y,x);
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));
}
{ TRISB = 0x0F;
PORTB = cmdcode;
PORTE = LCD_CMD_WR;
PORTE |= E_PIN_MASK;
_asm
NOP
NOP
_endasm
{ TRISB = 0x0F;
#ifdef BIT8
PORTB = (cmdcode);
#else
PORTB = (cmdcode & 0xF0); // Get the most significant nibble first.
#endif
_asm
NOP
NOP
_endasm
#ifdef BIT8
#else
TRISB = 0x0F;
PORTB = (cmdcode << 4); // Repeat for least significant nibble.
PORTE = LCD_CMD_WR;
PORTE |= E_PIN_MASK;
_asm
NOP
NOP
_endasm
{ TRISB = 0x0F;
#ifdef BIT8
PORTB = data;
#else
PORTB = data & 0xF0; // Get the most significant nibble first.
#endif
_asm
NOP
NOP
_endasm
PORTE &= ~E_PIN_MASK;
#ifdef BIT8
#else
TRISB = 0x0F;
PORTB = (data << 4); // Repeat for least significant nibble.
PORTE = LCD_DATA_WR;
PORTE |= E_PIN_MASK;
_asm
NOP
NOP
_endasm
#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.
Listado 17 kdbio.c|
#include <p18cxxx.h>
#include <delays.h>
char keypadread(void);
char scankey(void);
char keypadread()
char scankey()
{ char row,col,idx;
unsigned char wait,tmp;
idx=0;
TRISB=0x0F;
for (row=0; row < 4; row++)
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()
{ char key;
key = scankey();
if (key)
while (scankey() != 0);
return key;
}
char scankey()
{ char row,col,idx;
unsigned char wait,tmp;
idx=0;
TRISB=0x0F;
for (row=0; row < 4; row++)
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.