Está en la página 1de 7

- 1 -

ACA-ING-CE412
CETYS Universidad
Escuela de Ingeniera
Campus Ensenada

FORMATO DE PRCTICAS DE LABORATORIO.
Fecha de elaboracin 20 de Agosto de 2014
Elaborado por M.C. Manuel Octavio Casillas Gaxiola
Supervisado por Dr. Josu Aarn Lpez Leyva / Gestora de Proyectos de Investigacin

Aceptado por
Ing. Luisa C. Rosas Hernndez / Coordinacin Acadmica Escuela de
Ingeniera


DATOS DE IDENTIFICACIN
Carrera(s) ICE
Nombre de la asignatura Diseo de Interfaces Clave CE412
Nombre de la prctica Controlador de teclado matricial
Duracin (horas) 4
Nmero de la practica 1

JUSTIFICACIN

Los arreglos en forma de matrices son una tcnica de interfaz. Se pueden
utilizar para conectar mltiples entradas (como los botones de un teclado), y
tambin para el control de mltiples salidas (como una serie de LEDs). En
las interfaces matriciales, la Entradas/Salidas se dividen en dos secciones:
filas y columnas. Esta tcnica permite reducir considerablemente el nmero
de pines de E/S necesarios para controlar un conjunto de pulsadores (e.g.,
un teclado). Sin una interfaz matricial un teclado de 64 teclas requerira de
65 pines de E/S de un microcontrolador, si se utiliza un arreglo matricial el
nmero de pines requeridos se reduce 16 (8x8).









Introduccin
Para conectar un teclado matricial con un microcontrolador se tienen que
definir las filas y columnas como entradas y salidas, respectivamente. En
esta configuracin se tienen que multiplexar las salidas (columnas)
secuencialmente, entonces es posible determinar cul tecla ha sido
presionada leyendo las entradas (filas) en funcin de la salida actual
(columna). A continuacin se muestra un ejemplo de interfaz matricial de un
teclado con 16 teclas conectado a un microcontrolador.



Figura 1. Microcontrolador conectado a teclado matricial 4x4











La interfaz matricial tambin puede ser utilizada como salida para controlar
un gran nmero de actuadores con un nmero reducido de puertos de
salida disponibles.

En esta prctica se va desarrollar el cdigo y la circuitera necesaria para
controlar un teclado matricial de 4x3 con un microcontrolador utilizando los
conceptos de funcionamiento de las interfaces matriciales aprendidos
durante el curso.


Objetivos
Comprender el funcionamiento de la interfaz matricial de
entrada y salida de datos.
Desarrollar un controlador de teclado matricial 4x3 utilizando un
microcontrolador PIC.


PROCEDIMIENTO Y REQUISITOS
EQUIPO Y SOFTWARE MATERIAL DE APOYO
Computadora PC con PIC C y Proteus
PIC 16F877A
Programador de PICs
Cristal oscilador de 8 o 4 MHz
4 Resistencias de 1 k
12 botones push
Teclado matricial 4x3
Display LCD 2x16
1 Potencimetro de 1 K
Protoboard





Hoja de datos del PIC 16F877A
Material de clase
La elaboracin de la prctica se basar en la Gua de Elaboracin para Reporte de Prcticas (Rosas, 2013)

Adems, deber entregar un reporte final referente a la presente prctica en acuerdo con los lineamientos
institucionales de elaboracin y presentacin de trabajos escritos, 2 das despus de la fecha de
elaboracin de la prctica.
DESARROLLO DE LA PRCTICA

Para el desarrollo de esta prctica es necesario contar con el software PIC C Compiler y Proteus instalados
correctamente. Al final de la prctica ser necesario desarrollar el circuito completo y cargar el programa al
microcontrolador para verificar su funcionamiento.


1. Crear un nuevo proyecto con el Proyect Wizard de PIC C Compiler. Ajuste adecuadamente el valor
del oscilador. En el men LCD options activar la casilla Use LCD y configure los pines del puerto D
para utilizar con la pantalla de la siguiente manera:


LCD RS PIN_D0
LCD RW PIN_D1
LCD ENABLE PIN_D2
LCD DATA4 PIN_D4
LCD DATA5 PIN_D5
LCD DATA6 PIN_D6
LCD DATA7 PIN_D7


2. Para manejar el teclado matricial se utilizar el puerto B del microcontrolador. Se utilizarn las
resistencias pullups internas del microcontrolador con la siguiente lnea:

port_b_pullups(true);

- 2 -
- 3 -
3. Realice el siguiente cdigo en el editor del programa CCS (Se inicializa con la columna 0):


Verificar el nmero de columna en que se encuentre
Configurar como salida y poner a bajo el PIN de la columna en que se encuentre
Verificar cada una de las filas en busca de un estado bajo
Si se encuentra un estado bajo en alguna de las cuatro filas guardar el no. de fila y columna
- Imprimir en el LCD el dgito correspondiente a la fila y columna presionada
Si no se encuentra ningn estado bajo en las filas (presionada) pasar a la siguiente columna (col++)
Regresar al primer punto


4. Abra el simulador ISIS de Proteus y realice el siguiente circuito.



5. Modifique los parmetros del PIC16F877A haciendo doble-click. Modifique la frecuencia del oscilador
a la configurada y elija la ruta del archivo en lenguaje mquina (.hex) que utilizar el microcontrolador

6. Ejecute la simulacin con el botn PLAY en la parte inferior izquierda y observe los resultados.

7. Cuntas veces se despliega la tecla presionada en la pantalla? Por qu?
- Se despliega, hasta llenar el LCD, porque al estar en un ciclo while (1) es muy rpido esta
accin se repetir, Preguntara (Esta presionado el botn Si y como es muy rpido, se
llena el LCD.

8. Agregue un retardo de 200 milisegundos al programa, compile y observe los resultados. Cuntas
veces se despliega la tecla presionada en la pantalla? Por qu?
Se despliegan menos, pero si mejora mucho, debido a que a tardar ms en leer el dato, y
No despliega tantos.


- 4 -



9. Modifique el programa para que cada vez que se presione una tecla se imprima solamente una vez en
la pantalla el dgito de la tecla presionada. Para esto es necesario utilizar una variable como bandera
cuando una tecla es presionada y reiniciarla cuando se suelte. Adems cuando se presione la tecla #
deber borrarse todo lo que se encuentra en el display LCD.

10. Cargue el cdigo desarrollado al PIC16F877A utilizando el programador de su eleccin. Construya el
circuito completo en un protoboard y verifique su funcionamiento.

11. Deber entregar el circuito funcionando al final de la clase.
- 5 -
ANEXOS Y TRABAJO EXTRA

Cuestionario
1. En el programa desarrollado Qu lgica se est utilizando para saber cundo se presion alguna
tecla? Por qu? (Activo-bajo o Activo-alto)
- Activo en Bajo, porque al tener los pull ups encendidos en el puerto B, nosotros al
detectar un cambio en el puerto (Un 0 Lgico) podemos saber que botn fue apretado,
gracias las combinaciones posibles del teclado.

2. Cuando se le agrega el retardo de 200 ms al programa, se puede decir que el sistema es un sistema
de adquisicin de datos en tiempo real? Por qu?
- Personalmente, no lo considerara un sistema en tiempo real, ya que el tiempo de
despliegue y de lectura es notorio, y al tener ese retardo de 200 ms, es un tiempo muy grande
para ser considerado un sistema en tiempo real.

3. Cul es la tcnica de adquisicin de datos que se est utilizando para leer las teclas presionadas del
teclado matricial?
Sondeo polling

4. Qu problema existe en los teclados matriciales cuando se mantienen presionadas muchas teclas al
mismo tiempo? Cmo se puede resolver? Explique su respuesta.
Se leen nmeros errneos, porque se leer el puerto, y se tendr una combinacin que no es
correspondiente a la tecla que fue presionada en el teclado.

Solucin: Tener una bandera, que verifique si los otros botones del teclado estn presionados

if((bandera==1)&&(input(PIN_B1)==1)&&(input(PIN_B2)==1)&&(input(PIN_B3)==1)&&(input(PIN_B4)==1)){bandera=0;}

5. Modifique el programa para que almacene cuatro dgitos presionados y los compare con una clave
(password) predeterminado. Activar una salida en el puerto A (con un LED) para que se active cuando
la clave ingresada sea la correcta. Verifique el funcionamiento del mismo en el circuito del protoboard.

6. Entregar el reporte de esta prctica (va electrnica, formato PDF) al correo,
manuel.casillas@cetys.mx

7. En el correo especificar, en el asunto: Reporte prctica #1, y pedir confirmacin de correo recibido.


Conclusin Personal
El manejo del teclado matricial, es interesante, porque cambio mi
perspectiva de manejar la lgica, debido a que siempre un 1 lgico es un
cambio para mi circuito, ahora al tener los pull-ups activados, el 0 es quien
me denota un cambio, el estar sorteando entre las filas del teclado, para ver
cul es la correcta, la que fue presionada fue un reto al programar.

El manejo de la bandera, resulta de maravilla, debido que al eliminar
cualquier posibilidad, de que otro botn sea presionado, y solamente imprimir
uno, hace que el teclado y el LCD, funcionen de la manera correcta, son
factores que no fueron pensandos al principio del diseo que se fueron dando
al avanzar la prctica.

- 6 -
ANEXOS
CODIGO EN C

#include "C:\Users\Daniel Ajas\Desktop\Diseo de Interfaces\Practica #1_Teclado Matricial\main.h"


#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_TYPE 2
#include <lcd.c>
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);


// TODO: USER CODE!!

lcd_init();
port_b_pullups(true);
set_tris_a(0b00000000);
char clave[4];
char clave2[4];


clave2[0]='7';
clave2[1]='7';
clave2[2]='7';
clave2[3]='8';


int S=0,bandera=0,K=0,C=0;
char lista[4][3]=
{{'1','2','3'},
{'4','5','6'},
{'7','8', '9'},
{'*','0',' '}};

while(TRUE)
{
delay_ms(10);

if(C==4){
int x;
for( x=0 ;x<4; x++)
{
if(clave[x]==clave2[x]){K++;}
}
if(K==4){lcd_putc("Simon"); }else {lcd_putc("no"); }
C=0;K=0;
- 7 -
// lcd_putc(clave[0]);
// lcd_putc(clave[1]);
//lcd_putc(clave[2]);
//lcd_putc(clave[3]);
}

//reset de la variable S
if(S==0)
{
set_tris_b(0b01111111);
output_b(0b01111111);
}
else if(S==1)
{
set_tris_b(0b10111111);
output_b(0b10111111);}
else if(S==2)
{
set_tris_b(0b11011111);
output_b(0b11011111);
}

// verificacione de para la variable bandera
if((bandera==1)&&(input(PIN_B1)==1)&&(input(PIN_B2)==1)&&(input(PIN_B3)==1)&&(input(PIN_B4)==1)){
bandera=0;

}

//impresion en lcd
if((input(PIN_B1)==0)&&(bandera==0))
{
lcd_putc(lista[0][S]);
bandera=1;
clave [C]=lista[0][S];C++; }
else if((input(PIN_B2))==0&&(bandera==0))
{
lcd_putc(lista[1][S]);
bandera=1;
clave[C]=lista[1][S];C++;

}else if((input(PIN_B3))==0&&(bandera==0))
{
lcd_putc(lista[2][S]);
bandera=1;
clave [C]=lista[2][S];C++;
}
else if((input(PIN_B4)==0)&&(bandera==0))
{
lcd_putc(lista[3][S]);
bandera=1;
clave [C]=lista[3][S];C++;
}
else {S++; }
//reset de la variable S
if (S==3){S=0;}


set_tris_b(0b11111111);
}

}

También podría gustarte