martes, 11 de agosto de 2015

Manejo de teclados matriciales(barrido clásico)

En ocasiones debemos manejar teclados conectados de forma matricial por lo que debemos manipular las filas y columnas de este teclado para saber que tecla ha sido presionada. En la figura 1 podemos observar un teclado 4x4 de membrana con su forma de conexión.

Fig. 1. Teclado de membrana

Para poder realizar el barrido en esta ocasion debemos configurar como entradas las columnas y como salidas las filas, después debemos ir prendiendo fila por fila para observar si se tiene un cambio de estado en alguna columna y de esta manera saber que tecla ha sido presionada.


 Fig. 2. Circuito que se va a utilizar

En la figura 2 podemos observar como está distribuida las conexiones en el teclado y las salidas que vamos a tener. Como se puede ver hay una descripción de como van a ser las teclas, que valor tomarán al presionarlas, en los 4 leds verdes se mostrara este valor de la tecla en binario y en el led rojo nos mostrara si no hemos aun presionado ninguna tecla. Cabe recalcar que los leds se pueden reemplazar por displays de 7 segmentos y otros indicadores, pero por ser una aplicación lo dejaremos solo con leds. Recordar que si se quiere llevar a la vida real el circuito se deben poner resistencias en serie con los leds para limitar la corriente.


Programa:

/*
 * barrido_clasico_de_teclado.asm
 *
 *  Created: 11/08/2015 14:49:55
 *   Author: cdtoap
 */

 .include "m164pdef.inc"

 .def tempo=r16
 .def tecla=r17
 .def ante=r18

 .cseg
 .org 0x00
 ;configuracion de puertos

 ldi tempo,$0F; defino filas como salidas y columnas como entradas
 out ddra,tempo
 ldi tempo,$1F; defino las salidas de los leds
 out ddrb,tempo
 ldi tempo,$00; configuro lo que no voy a usar como entradas para el pull-up
 out ddrc,tempo
 out ddrd,tempo

 ldi tempo,$FF; configuro pull-up y mantengo apagada la lectura
 out porta,tempo
 out portc,tempo
 out portd,tempo
 ldi tempo,$F0; apago los leds de las teclas y dejo encendido el led rojo
 out portb,tempo

 ;configurar pull-up
 in   tempo,mcucr
 andi tempo,$EF
 out  mcucr,tempo
 ;fin de configuracion de puertos

 ldi ante,16; cargamos para que antes tenga el valor de no presionado

 salto0:
 ldi tecla,16
 ldi tempo,$FE; pongo un 0 en la primera fila para ver si se ha presionado algo
 out porta,tempo

 sbis pina,7;salta una instruccion si no ha habido cambio en ese bit
 ldi  tecla,3; carga el valor correspondiente si no salta
 sbis pina,6
 ldi  tecla,2
 sbis pina,5
 ldi  tecla,1
 sbis pina,4
 ldi  tecla,0
 ;el proceso se repite en cada fila

 ldi tempo,$FD; pongo 0 en la segunda fila
 out porta,tempo

 sbis pina,7
 ldi  tecla,7
 sbis pina,6
 ldi  tecla,6
 sbis pina,5
 ldi  tecla,5
 sbis pina,4
 ldi  tecla,4

 ldi tempo,$FB; pongo 0 en la tercera fila
 out porta,tempo

 sbis pina,7
 ldi  tecla,11
 sbis pina,6
 ldi  tecla,10
 sbis pina,5
 ldi  tecla,9
 sbis pina,4
 ldi  tecla,8

 ldi tempo,$F7; pongo 0 en la cuarta fila
 out porta,tempo

 sbis pina,7
 ldi  tecla,15
 sbis pina,6
 ldi  tecla,14
 sbis pina,5
 ldi  tecla,13
 sbis pina,4
 ldi  tecla,12

 cp   ante,tecla; comparo si ha habido un cambio en la tecla ya ingresada antes
 breq salto0; si es igual vaya a revisar hasta que haya un cambio
 mov  ante,tecla; se pone la tecla actual ahora como la anterior
 cpi   tecla,16; si es igual a 16 es porque se ha soltado la tecla pero no hay un cambio
 breq salto0

 ori tecla,0xE0; se asegura pull-up
 out portb,tecla; se prende los leds correspondiente al numero binario
 rjmp salto0

Circuito al presionar la tecla D




No hay comentarios.:

Publicar un comentario