Está en la página 1de 4

Captulo 1

Pr
actica: Teclado 4X4
Acostumbraros a ser obedientes,
porque siempre os ha de tocar obedecer
Madame de Maintenon

1.1.

Enunciado

En1 esta practica vamos a conectar a nuestro PIC un teclado matricial de 4 filas por 4 columnas.
Queremos atender un teclado matricial (pasivo) y aprender como conectarlo. Al mismo tiempo
se busca eliminar los rebotes mecanicos de los pulsadores y disponer de una asignacion dinamica
de valores a las pulsaciones obtenidas. En una segunda parte buscamos atender el teclado usando
interrupciones, lo que permitira al microcontrolador no dedicarse en exclusiva a la atencion del
teclado. Al mismo tiempo tendremos una oportunidad inmejorable de aplicar el modo SLEEP de
bajo consumo del microcontrolador y comprobarlo.

1.1.1.

Especificaciones

Se pide realizar la programacion necesaria para escanear el teclado matricial y su conexion hardware. La rutina debera devolver un valor numerico entre 1 y 16 dependiendo de la tecla pulsada. Si
no se pulso ninguna tecla debera devolver el valor 0. Es muy interesante hacer una traduccion de la
tecla hardware pulsada con el valor serigrafiado en los pulsadores. Realiza la traduccion mediante
una tabla.

1.1.2.

Para sacar nota

Los rebotes mecanicos son un efecto no deseado. Como los eliminaras? Desarrollalo.
Queremos atender el teclado por interrupciones para que el microcontrolador pueda hacer otras
tareas. Modifica el codigo para que sea posible.
Si el microcontrolador esta esperando a que el usuario pulse una tecla, entonces es buena idea
dormir el micro para reducir el consumo electrico utilizando la instruccion SLEEP. Las interrupciones
lo despertaran. Comprueba experimentalmente la reduccion del consumo.

Version de 19 de abril de 2008

Enunciado

1.1.3.

Diagramas

Los contactos:

El modulo:

Figura 7.

Esquema mecnico del teclado matricial.

Captulo 1. Practica: Teclado 4X4

1.2.

Soluci
on

1.2.1.

Esquema hardware

2
A

10k

X1

U1
16
15

4 MHz

C1

C2

33pF

33pF

RA7/OSC1/CLKIN
RA0/AN0
RA6/OSC2/CLKOUT
RA1/AN1
RA2/AN2/CVREF/VREFRA5/MCLR RA3/AN3/C1OUT/VREF+
RA4/AN4/T0CKI/C2OUT
RB0/INT/CCP1
RB1/SDI/SDA
RB2/SDO/RX/DT
RB3/CCP1
RB4/SCK/SCL
RB5/SS/TX/CK
RB6/AN5/T1OSO/T1CKI
RB7/AN6/T1OSI

17
18
1
2
3

C
1

4
4

1
ON

R1

6
7
8
9
10
11
12
13

PIC16F88

8
FILE NAME:

P_teclado.dsn

DESIGN TITLE:

Prctica "Teclado 4x4"

BY:

1.2.2.
2

19/04/2008
PAGE:

Hoja principal

DATE:

Jess M. Hernndez Mangas

1
REV:

Programas

# include < pic .h >


# include " binario . h "

3
4
5
6
7
8
9

// Para el PIC16F88
__CONFIG ( WDTDIS & XT & UNPROTECT & PWRTDIS & CCPRB0 & DEBUGDIS & LVPDIS
& BORDIS & MCLREN );
// Palabra de configuraci
o n 0 x2007
__CONFIG ( FCMDIS & IESODIS );
// Palabra de configuraci
o n 0 x2008

const unsigned char Teclas []={0 ,

10
11
12
13
14
15
16
17
18
19
20
21
22
23

7,
4,
1,
0 xC ,

8 , 9 ,0 xF ,
5 , 6 ,0 xE ,
2 , 3 ,0 xD ,
0 ,0 xB ,0 xA };

unsigned char TECLADO_Scan ()

unsigned
;
;
;
;
;
;

//
//
//
//
//
//

char Tecla =1;


Muestrea el teclado
1. Pone la variable Tecla a 1 para el primer c
o digo
2. Pone todas las filas de salida a 1 , excepto la fila
a muestrear que tiene un 0.
3. Se chequea cada columna de entrada buscando el 0
Si no hay ninguna tecla pulsada la columna se leer
a

of

TIME:

1
11:20:28

4
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

Soluci
on
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//

43

45
46
47
48
49
50
51
52
53
54
55
56
57
58

59
60

62
63
64

if ( Tecla ==17) return 0;


PORTB = PORTB << 1;

// Saco un cero en la fila cero


// Borro la notificaci
o n ( por si interrupciones )
) return Tecla ; // Comprueba la primera columna
) return Tecla ; // Comprueba la segunda columna
) return Tecla ; // Comprueba la tercera columna
) return Tecla ; // Comprueba la cuarta columna
// Si no se puls
o ninguna retorna cero
// Selecciona otra fila

return 0;

void main ()

65
66

unsigned char T ;
ANSEL = 0;
TRISB = 0 xF0 ;
TRISA = 0 x00 ;
RBPU
= 0;
while (1)
{
T
= TECLADO_Scan ();
T
= Teclas [ T ];
PORTA = T ;
}

67
68
69
70
71
72
73
74
75
76
77

como un 1 gracias a las resistencias de pull - up .


Si est
a pulsada se leer
a un 0.
4. Se continua el proceso con todas las filas .
Si se ha pulsado una tecla , se sale de la rutina con
el valor de la tecla pulsada en la variable Tecla
Col . 1
2
3
4
Fila + - - - -+ - - - -+ - - - -+ - - - -+
1
| 1 | 2 | 3 | 4 |
+ - - - -+ - - - -+ - - - -+ - - - -+
2
| 5 | 6 | 7 | 8 |
+ - - - -+ - - - -+ - - - -+ - - - -+
3
| 9 | 10 | 11 | 12 |
+ - - - -+ - - - -+ - - - -+ - - - -+
4
| 13 | 14 | 15 | 16 |
+ - - - -+ - - - -+ - - - -+ - - - -+
Si no se ha pulsado ninguna tecla
se sale con el valor 0 en Tecla .
Si se pulsan dos o m
a s teclas a la vez s
o lo la
primera ( siguiendo el orden ) se detecta .

PORTB = B00001110 ;
RBIF = 0;
while (1)
{
if ( ( PORTB & (1 < <4))==0
Tecla ++;
if ( ( PORTB & (1 < <5))==0
Tecla ++;
if ( ( PORTB & (1 < <6))==0
Tecla ++;
if ( ( PORTB & (1 < <7))==0
Tecla ++;

44

61

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

//
//
//
//

Configuro el PORTA como digital


RB0 .. RB3 salidas , RB4 .. RB7 entradas
RA0 .. RA4 salidas
Resistencias pull - up entrada activadas

// Comprueba el teclado
// Traduce

También podría gustarte