sábado, 8 de octubre de 2011

Teclado Matricial 4x4


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:

10 comentarios:

  1. Hola.

    Necesitaría que este mismo proyecto solo me marcase la tecla pulsada mientra esta siendo pulsada y no la mantenga cuando lo suelte.

    Saludos

    ResponderEliminar
  2. hola, basta con borrar la instruccion 'rjmp DISP' que le sigue a 'clr KEY' en la etiqueta CON1.

    ResponderEliminar
  3. y en el caso que te indique las dos ultimas teclas?

    ResponderEliminar
  4. tendrías que hacer cambios sencillos: Un nuevo display con su respectiva rutina (multiplexado), definir otro registro que almacene la tecla anterior pulsada.

    ResponderEliminar
  5. ME podrian ayudar , con un teclado matricial de 4x4 y dos dsiaplay 7 segmentos que se visualice el numero tecleado y haya un corrimiento al teclear otro

    ResponderEliminar
  6. el codigo funcionaria para el pic 16f887?

    ResponderEliminar
  7. como hago para guardar el dato pulsado en el micro?

    ResponderEliminar
  8. necesito un codigo para teclado y pantalla para un atmega328, gracias.

    ResponderEliminar