Es
un dispositivo de entrada que consiste en un arreglo matricial de 16
teclas (pulsadores). Dispone de un conector SIL (Single In Line) de 8
pines: 4 filas y 4 columnas. La interconexión de los pulsadores es como
se muestra en la imagen:
Cuando
se presiona una tecla se conecta una fila con una columna. La manera de
averiguar la tecla presionada consiste en enviar un nivel lógico a una
de las filas (diferente al nivel de las filas restantes) y buscar la
columna por la que se recibe el mismo nivel lógico. De esta manera se
obtiene la fila y columna al igual que en una matriz.
El diagrama de conexión típico al ATmega8 es el siguiente:
Las
resistencias de 1K son necesarias para evitar hacer un cortocircuito
accidental si se comparten los mismos pines del PIC con otro periférico,
como por ejemplo un Display o un LCD.
Las resistencias de 10K son necesarias para asegurar el nivel lógico 0 en las entradas del ATmega8.
Algoritmo de búsqueda:
- Los pines PD0-PD3 se configuran como Salidas. Los pines PD4-PD7 se configuran como Entradas.
- Las filas del teclado se conectan a los pines PD0-PD3 y las columnas a los pines PD4-PD7.
- Se envía “0” a todas las filas.
- Se envía “1” a la primera fila.
- Se verifica el nivel lógico en cada una de las columnas. Si se pulsó una tecla de la primera fila se obtendrá un “1” en la columna correspondiente.
- Si no se encuentra un “1” (no se pulsó tecla en la primera fila) se envía un “1” a la siguiente fila (a las filas restantes se envía “0”).
- Se verifican las columnas en busca del nivel lógico “1”.
- El procedimiento continúa hasta completar las 4 filas.
- Conociendo la fila por la que se envió “1” y conociendo la columna por la que se recibe “1” se puede conocer la tecla pulsada.
Programa Para ATmega8:
El
programa lee la tecla pulsada en un teclado matricial 4x4 y
simultáneamente muestra la última tecla pulsada en un display de 7
segmentos.
Diagrama de Conexión:
Programa en Assembler:
;---------------------------------------------------------
;Autor: LONELY113
; http://lonely113.blogspot.com
;
;Programa para control de teclado matricial 4x4
;Adicionalmente muestra la tecla pulsada en un display
;Para teclado: Salida: PD0-PD3
; Entradas: PD4-PD7
;Para Display: Salidas: PD1-PD7 (7 segmentos)
; PC0 (Habilitacion catodo comun)
;Oscilador interno de 8 MHz
;---------------------------------------------------------
.nolist
.include "m8def.inc"
.list
.device atmega8
.def KEY=r17
.def TEMP=r18
.def COUNT=r19
.def CHAR=r20
.def ROW=r21
.org 0x0000
; Inicializacion de stack
ldi r16,HIGH(RAMEND)
out SPH,r16
ldi r16,LOW(RAMEND)
out SPL,r16
; Fin inicializacion de Stack
; Inicio de programa
ldi r16,0x01
out DDRC,r16 ; PC0 como salida
ldi r16,0x0F
out DDRD,r16 ; PD7-PD4 como entradas, PD3-PD0 como salidas
sbi PORTC,0
clr TEMP
BEGIN: clr KEY
inc KEY
ldi ROW,0x01
out PORTD,ROW
KEY_V: nop
sbic PIND,4 ; Verifica tecla pulsada en columna 1
rjmp CON2 ; Ir a CON2 si se pulsa tecla
inc KEY ; Incrementar KEY si no se pulsa tecla
sbic PIND,5 ; Verifica tecla pulsada en columna 2
rjmp CON2 ; Ir a CON2 si se pulsa tecla
inc KEY ; Incrementar KEY si no se pulsa tecla
sbic PIND,6 ; Verifica tecla pulsada en columna 3
rjmp CON2 ; Ir a CON2 si se pulsa tecla
inc KEY ; Incrementar KEY si no se pulsa tecla
sbic PIND,7 ; Verifica tecla pulsada en columna 4
rjmp CON2 ; Ir a CON2 si se pulsa tecla
inc KEY ; Incrementar KEY si no se pulsa tecla
cpi KEY,0x11
brbs 1,CON1 ; Comprueba si llego a ultima tecla
lsl ROW
out PORTD,ROW
rjmp KEY_V
CON1: clr KEY
rjmp DISP
CON2: mov TEMP,KEY ; Retiene ultima tecla pulsada
DISP: ldi r16,0xFF
out DDRD,r16 ; PORTD como salida
rcall CONV
out PORTD,CHAR
cbi PORTC,0
nop
sbi PORTC,0
ldi r16,0x0F
out DDRD,r16 ; PD7-PD4 como entradas, PD3-PD0 como salidas
clr r16
out PORTD,r16
out PIND,r16
rjmp BEGIN
; Subrutinas
CONV: ldi ZH,HIGH(2*TABLE)
ldi ZL,LOW(2*TABLE)
add ZL,TEMP
lpm
mov CHAR,r0
ret
; Tabla de datos
TABLE:
.DB 0x00,0x0C,0xB6,0x9E,0xE2,0xCC,0xDA,0xFA,0xF2,0x0E,0xFE,0xDE,0xBC,0xEE,0x7E,0xF8,0x72
Archivos de Programa: