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