TUTORIAL Teclado matricial OBJETIVOS • Manejar teclados

Anuncio
Curso de Microcontroladores [email protected]
1
TUTORIAL Teclado matricial
OBJETIVOS
•
•
Manejar teclados matriciales por el método RWR.
Conocer el uso y la utilidad de las Pull-Up del puerto B.
INTRODUCCIÓN:
El teclado matricial es uno de los dispositivos de entrada de datos más usados en
aplicaciones como introducción de claves, números en calculadoras, registradoras,
etc.
En esta práctica usaremos un teclado matricial conectado en el puerto B cuya
lectura realizaremos por medio del metodo RWR, asignaremos ciertas funciones a
cada letra (incrementar, decrementar etc) y mostraremos la salida utilizando los
display de siete segmentos.
CONCEPTOS TEÓRICOS:
PULL-UPS DE PUERTO B :
Las pull-up de puerto B son unas resistencias que internamente en el
microcontrolador conectan cada pin del puerto B con la alimentación
positiva, dichas resistencias pueden ser activadas y desactivadas por
software. Son controladas por el bit RBPU del registro OPTION_REG el
cual con 1 desactiva dichas pull-up y con 0 las activa.
Las pull-up de puerto B facilitan la conexión de pulsadores en los pines de
dicho puerto, con una configuración de pulsador como la mostrada abajo la
resistencia es la pull - up interna del microcontrolador y solo es necesario
conectar externamente el pulsador y la tierra. Con esta configuración debe
tenerse en cuenta que los pulsadores quedan en lógica negativa (un cero
significa presionado).
Curso de Microcontroladores [email protected]
1
Curso de Microcontroladores [email protected]
2
DESCRIPCIÓN DEL TECLADO MATRICIAL: Existen varios tipos de
teclados matriciales, en nuestro caso usaremos un teclado matricial de 16
teclas organizadas en 4 columnas y 4 filas, este teclado dispone de un
conector de 16 pines de los cuales cuatro corresponden a las filas y cuatro
a las columnas.
El conexionado interno de este teclado es como sigue:
Existen diferentes formas de realizar la lectura de estos teclados, una de
ellas es conocida como el método RWR el cual será utilizado en esta
práctica. Se recomienda consultar otros métodos de lectura del teclado y
comparar ventajas y desventajas, hay varios ejemplos en (www.xrobotics.com)
El método RWR (Read Write Read, leer escribir leer) consiste en, como su
nombre lo indica, en realizar una lectura, luego una escritura, y finalmente
otra lectura, lo obtenido en esta lectura permitirá por medio de unos códigos
que deben establecerse, obtener el digito presionado por el usuario .
Para aplicar el método RWR dividimos el puerto en dos, una parte manejará
las columnas y otra parte manejará las filas, el teclado se conecta al puerto
B del PIC de tal manera que en las líneas RB4 a RB7 queden los pines que
representan las columnas y en las líneas RB0 a RB3 los pines que
representan las filas.
Curso de Microcontroladores [email protected]
2
Curso de Microcontroladores [email protected]
3
Inicialmente, la parte del puerto que maneja las columnas está como
entrada y las filas están como salida entregando un valor lógico bajo, las
entradas de las columnas están fijas a un valor alto por medio de
resistencias de pull-up, para esto usaremos las pull-up del microcontrolador.
El esquema circuital es el siguiente:
La secuencia para realizar una lectura por el método RWR sería:
1) Inicialmente, los pines RB4, RB5, RB6 y RB7 leen 1, que se debe a la
configuración previa de habilitar las “pull-up”. Esta configuración lo que
hace es darle un estado lógico inicial de 1 a los pines del puerto B
configurados como entradas. Los pines RB0 – RB3 están configurados
como salidas y están enviando un valor lógico 0.
2) El usuario presiona un botón, para ejemplificar supongamos que presionó la
tecla 6.
3) El pin RB5 que estaba como entrada lee un 0, que ocurre porque la acción
de presionar la tecla cierra el circuito entre RB5 y RB2 y el RB2 recordemos
estaba enviando un 0.
4) Se lee el estado del puerto B, que para el ejemplo es: 11010000. El PIC se
entera que hemos presionado una tecla ya que ocurre una interrupción por
cambio de estado en Puerto B; en el ejemplo vemos que fue el RB5 el pin
que cambio de estado (por pull-up estaba en 1 y al presionar la tecla pasó a
0).
Curso de Microcontroladores [email protected]
3
Curso de Microcontroladores [email protected]
4
5) Este dato aun no nos dice cual de las 16 teclas fue la presionada, ya que el
11010000 también se da si presionamos las teclas 3, 9 ó #.
6) Se reconfigura el puerto B, esta vez se colocan las líneas RB0 a RB3 como
entradas y las RB4 a RB7 como salidas (TRISB=0b00001111)
7) A PORTB le asigno el valor leído, para el ejemplo es PORTB=0b11010000.
Como las pull-up siguen habilitadas los pines RB0, RB1, y RB3 leen 1. El
pin RB2 lee un 0, ya que la tecla presionada cierra el circuito que conecta a
RB2 con RB5, y este RB5 ahora esta enviando 0.
8) Vuelve a leerse el estado del puerto, en el caso del puerto es: 11011011.
Este valor si es único y con él se puede identificar por completo la tecla
presionada, en este caso el 6.
9) Se reconfigura de nuevo el puerto B como estaba inicialmente para que
pueda ser leída de nuevo otra tecla (pines de mayor peso como entrada, los
de menor como salida de 0)
De esta forma podemos realizar los códigos correspondientes a cada uno de los
dígitos del teclado, con dichos códigos y la respectiva configuración del micro
podemos realizar la implementación de esto en el código.
Configuración del microcontrolador: Para este método de lectura necesitamos
realizar las siguientes configuraciones en el microcontrolador:
•
•
Configurar el OPTION_REG para habilitar las “pull up” (se pone el bit RBPU
en 0).
Configurar las líneas RB4 a RB7 como entradas y las líneas RB0 a RB3
como salidas, sacando un 0 lógico por ellas (TRISB=0b11110000).
A continuación mostraremos un código que lee el teclado matricial y realiza
incrementos de al pulsar la tecla 1 y decrementos al pulsar la tecla 2.
ANTIRREBOTES:
la instrucción while: la sintaxis de esta expresión es la siguiente:
while(condición)
{
Instrucciones a realizar mientras que la condición sea verdadera.
------------}
El bloque incluido por el ciclo while se repetirá mientras que la condición sea
verdadera, una vez se llegue al final del bloque volverá a evaluarse la condición y
Curso de Microcontroladores [email protected]
4
Curso de Microcontroladores [email protected]
5
si es verdadera se ejecutará el bloque un vez más, en caso de ser falsa se
continuará con la sección siguiente al bloque.
Para mantener el micro esperando que se libere la tecla se utilizara el siguiente
código:
while(PORTB!=0b11110000) {};
Esta línea significa que mientras el puerto B sea diferente del valor dado por
defecto cuando las teclas están sueltas (0b11110000) el pic ejecutará el bloque en
el cual no hay instrucciones (en otras palabras, el micro esperará), cuando el
puerto sea igual al valor dado cuando no hay ninguna tecla presionada el pic
continuará la ejecución del código restante. .
#include <pic.h>
#include "delay.h"
#include "delay.c"
char
void
ReadKeypad(void);
ProcesarKeypad(char);
signed
unsigned
unsigned char
bit
char
char
TECLA,Cont=89,DEC,UNI;
AuxTecla;
Display[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
FlagTecla=0;
void
main(void)
{
//Configuracion del conversor A/D como entradas/salidas digitales
ANSEL=0x00;
//Entradas analogas como digitales
ANSELH=0x00; //Entradas analogas como digitales
//
configuracion del teclado
TRISB=0b11110000; //configuracion inicial del puerto metodo RWR
RBPU=0;
//activo resistencias de pull-up
PORTB=0b00000000;
TRISA0=0;
TRISA1=0;
TRISC=0b10000000;
PORTA=0;
PORTC=0;
while(1)
{
AuxTecla=ReadKeypad(); // deteccion de la activacion de una tecla
if((AuxTecla!=0b11110000)&&(FlagTecla==0))
{
ProcesarKeypad(AuxTecla);
FlagTecla=1;
}
if(AuxTecla==0b11110000)
{
FlagTecla=0;
Curso de Microcontroladores [email protected]
5
Curso de Microcontroladores [email protected]
6
}
DEC=Cont/10;
UNI=Cont%10;
//3. Mostrar decenas
RA1=0; //desactivo el display de unidades
RA0=1; //activo el display de decenas
PORTC=Display[DEC];
DelayMs(25);
//4. Mostrar unidades
RA1=1; //desactivo el display de unidades
RA0=0; //activo el display de decenas
PORTC=Display[UNI];
DelayMs(25);
}
}
void
{
ProcesarKeypad(char
CodigoTecla) //comandos a ejecutar segun tecla activada
switch(CodigoTecla)
{
case
0b01110111:
Cont++;
break;
case
0b10110111:
Cont--;
//Tecla 1
//Tecla 2
break;
}
}
char
{
ReadKeypad(void)
//APLICACION del metodo RWR
if(PORTB!=0b11110000)
{
TECLA=PORTB;
TRISB=0b00001111;
PORTB=TECLA;
TECLA=PORTB;
TRISB=0b11110000;
PORTB=0b00000000;
return TECLA;
}
else
{
return 0b11110000;
}
}
LA SENTENCIA SWITCH: La sentencia switch se utiliza para comparar una
variable con varias constantes y realizar una acción si coincide con una de estas,
en nuestro caso seria útil para realizar la decodificación de la tecla, su sintaxis es
la siguiente:
Curso de Microcontroladores [email protected]
6
Curso de Microcontroladores [email protected]
7
switch(variable)
{
case constante1: { - - -Instrucciones a ejecutar
- - - si variable es igual a constante1
Break;
}
case constante2: { - - -Instrucciones a ejecutar
- - - si variable es igual a constante2
Break;
}
.
.
.
}
Para nuestro ejemplo la decodificación de la tecla podría hacerse también de la
siguiente forma:
switch (teclado)
{case 0b10111110: {boton=0; break;}
case 0b01110111: {boton=1; break;}
case 0b10110111: {boton=2; break;}
case 0b11010111: {boton=3; break;}
case 0b01111011: {boton=4; break;}
case 0b10111011: {boton=5; break;}
case 0b11011011: {boton=6; break;}
case 0b01111101: {boton=7; break;}
case 0b10111101: {boton=8; break;}
case 0b11011101: {boton=9; break;}
case 0b01111110: {boton='A'; break;}
case 0b11011110: {boton='B'; break;}
case 0b11101110: {boton='C'; break;}
case 0b11101101: {boton='D'; break;}
case 0b11101011: {boton='E'; break;}
case 0b11100111: {boton='F'; break;}
}
Se sugiere que cada uno realice el código y lo compare con este código ya dado,
la idea es que cada uno diseñe un código que genere distintos conteos al oprimir
diferentes teclas.
Curso de Microcontroladores [email protected]
7
GND
VCC
R1
10k
1
2
3
4
5
6
7
14
13
33
34
35
36
37
38
39
40
U1
RD0
RD1
RD2
RD3
RD4
RD5/P1B
RD6/P1C
RD7/P1D
RE0/AN5
RE1/AN6
RE2/AN7
RE3/MCLR/VPP
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RA0/AN0/ULPWU/C12IN0RC2/P1A/CCP1
RA1/AN1/C12IN1RC3/SCK/SCL
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
RA3/AN3/VREF+/C1IN+
RC5/SDO
RA4/T0CKI/C1OUT
RC6/TX/CK
RA5/AN4/SS/C2OUT
RC7/RX/DT
RA6/OSC2/CLKOUT
RA7/OSC1/CLKIN
RB0/AN12/INT
RB1/AN10/C12IN3RB2/AN8
RB3/AN9/PGM/C12IN2RB4/AN11
RB5/AN13/T1G
RB6/ICSPCLK
RB7/ICSPDAT
PIC16F887
15
16
17
18
23
24
25
26
19
20
21
22
27
28
29
30
8
9
10
1
2
3
4
5
6
7
8
RN1
330
16
15
14
13
12
11
10
9
8
Curso de Microcontroladores [email protected]
8
Curso de Microcontroladores [email protected]
DIAGRAMA DE CONEXIONES.
Descargar