Conexión de teclado hexadecimal 4x4

Anuncio
Capı́tulo 1
Práctica: Teclado 4X4
Acostumbraros a ser obedientes,
porque siempre os ha de tocar obedecer
∼ Madame de Maintenon ∼
1.1.
Enunciado
En1 esta práctica 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 mecánicos de los pulsadores y disponer de una asignación dinámica
de valores a las pulsaciones obtenidas. En una segunda parte buscamos atender el teclado usando
interrupciones, lo que permitirá al microcontrolador no dedicarse en exclusiva a la atención 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 programación necesaria para escanear el teclado matricial y su conexión hardware. La rutina deberá devolver un valor numérico entre 1 y 16 dependiendo de la tecla pulsada. Si
no se pulsó ninguna tecla deberá devolver el valor 0. Es muy interesante hacer una traducción de la
tecla hardware pulsada con el valor serigrafiado en los pulsadores. Realiza la traducción mediante
una tabla.
1.1.2.
Para sacar nota
Los rebotes mecánicos son un efecto no deseado. ¿Cómo los eliminarı́as? Desarróllalo.
Queremos atender el teclado por interrupciones para que el microcontrolador pueda hacer otras
tareas. Modifica el código para que sea posible.
Si el microcontrolador está esperando a que el usuario pulse una tecla, entonces es buena idea
dormir el micro para reducir el consumo eléctrico utilizando la instrucción SLEEP. Las interrupciones
lo despertarán. Comprueba experimentalmente la reducción del consumo.
1
Versión de 19 de abril de 2008
1
2
Enunciado
1.1.3.
Diagramas
Los contactos:
El módulo:
Figura 7.
Esquema mecánico del teclado matricial.
Capı́tulo 1. Práctica: Teclado 4X4
3
1.2.
Solución
1.2.1.
Esquema hardware
A
B
C
D
E
F
G
H
J
K
0
0
1
1
2
A
7
8
9
B
4
5
6
2
3
2
3
0
=
C
10k
X1
U1
16
15
4 MHz
5
4
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
6
D
17
18
1
2
3
C
1
4
4
4
1
ON
3
R1
2
3
6
7
8
9
10
11
12
13
5
6
PIC16F88
7
7
8
8
FILE NAME:
P_teclado.dsn
DESIGN TITLE:
Práctica "Teclado 4x4"
BY:
A
1.2.2.
2
19/04/2008
PAGE:
Hoja principal
9
1
DATE:
B
C
D
E
F
G
Jesús M. Hernández Mangas
H
1
REV:
A
J
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ón 0 x2007
__CONFIG ( FCMDIS & IESODIS );
// Palabra de configuració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ó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á
of
TIME:
1
11:20:28
K
9
4
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Solución
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
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ó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ó 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á pulsada se leerá 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ás teclas a la vez só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
Descargar