Sei sulla pagina 1di 11

MANEJO DE TECLADO 4x4 CON PIC 16F84A

--------------------------------------------------------------------------------------------------------------
-----------------------------------------
Un teclado matricial esta constituido por una matriz de pulsadores dispuestos en columnas
y filas, cada pulsador se conecta a una fila y a una columna, el diagrama del teclado y la
forma de conectar el teclado al pic se muestra en la figura:

Como se ve en la figura las filas del teclado se conectan a las lneas RB0,RB1,RB2,RB3
configuradas como salidas mientras que las columnas se conectan a las lneas
RB4,RB5,RB6,RB7 configuradas como entradas .
Para detectar si hay una tecla pulsada se aplica el siguiente procedimiento: Se hace un
barrido por cada una de las filas, inicialmente se aplica a la primera fila un nivel bajo y a las
otras tres un nivel alto si en este instante se pulsa alguna tecla de esta fila entonces el nivel
bajo aparecer en la columna en la que se encontraba la tecla, seguidamente se pasa a
verificar la segunda fila enviando un nivel bajo a esta y a las otras un nivel alto y as
sucesivamente. Verificando los niveles de los terminales de las columnas se podr deducir
si hay alguna tecla pulsada en la fila donde se esta aplicando el nivel bajo, considerando
que si no hay alguna tecla pulsada en las entradas del PIC RB4, RB5, RB6, RB7 se
encontrara un nivel alto.
Para realizar el programa en el pic debemos tener en cuenta que se deben de habilitar las
resistencias internas del pic.
A continuacin la librera para el control del teclado 4x4:
;*************************************************************************
*****************
;Librera para el control de un teclado matricial 4x4 ; que fue publicado en el libro titulado:
"Microcontrolador PIC16F84A
;"del ;autor: ENRIQUE PALACIOS, FERNANDO REMIRO, LUCAS LOPEZ
;TECLADO.inc
;*************************************************************************
*****************
cblock
TECL_TECLAORDEN
endc
TECL_ULTIMATECLA equ d'15'
TECLADO_LEEHEX
call TECLADO_LEEORDENTECLA
btfss STATUS,C
goto TECL_FINLEEHEX
call TECL_CONVIERTEORDENENHEX
bsf STATUS,C
TECL_FINLEEHEX
return
TECL_CONVIERTEORDENENHEX
addwf PCL,F
DT 1h,2h,3h,0Fh
DT 4h,5h,6h,0Eh
DT 7h,8h,9h,0Dh
DT 0Ah,0h,0Bh,0Ch
TECLADO_FINTABLEHEX
if(TECLADO_FINTABLEHEX> 0xFF)
ERROR "Atencion:la tabla a superado el tamo de la pagina de los "
MESSG "Primeros 256bytes de memoria rom, no funconara correctamente "
endif
TECLADO_INICIALIZA
bsf STATUS,RP0
movlw b'11110000'
movwf PORTB
bcf OPTION_REG,7
bcf STATUS,RP0
call TECLADO_ESPERADEJEPULSAR
return
TECLADO_COMPROBACION EQU b'11110000'
TECLADO_ESPERADEJEPULSAR
movlw TECLADO_COMPROBACION
movwf PORTB
TECLADO_SIGUEESPERANDO
call RETARDO_20MS
movf PORTB,W
sublw TECLADO_COMPROBACION
btfss STATUS,Z
goto TECLADO_SIGUEESPERANDO
return
TECLADO_LEEORDENTECLA
clrf TECL_TECLAORDEN
movlw b'11111110'
TECL_CHEQUEAFILA
movwf PORTB
TECL_COMLUMNA1
btfss PORTB,4
goto TECL_GUARDARVALOR
incf TECL_TECLAORDEN,F
TECL_COMLUMNA2
btfss PORTB,5
goto TECL_GUARDARVALOR
incf TECL_TECLAORDEN,F
TECL_COMLUMNA3
btfss PORTB,6
goto TECL_GUARDARVALOR
incf TECL_TECLAORDEN,F
TECL_COMLUMNA4
btfss PORTB,7
goto TECL_GUARDARVALOR
incf TECL_TECLAORDEN,F
TECLA_TERMINARCOLUMNAS
movlw TECL_ULTIMATECLA
subwf TECL_TECLAORDEN,W
btfsc STATUS,C
goto TECL_NOPULSADA
bsf STATUS,C
rlf PORTB,W
goto TECL_CHEQUEAFILA
TECL_NOPULSADA
bcf STATUS,C
goto TECL_FINTECLADOLEE
TECL_GUARDARVALOR
movf TECL_TECLAORDEN,W
bsf STATUS,C
TECL_FINTECLADOLEE
return
Esta librera posee las siguientes subrutinas:
TECLADO_INICILIZA; que se encarga de configurar las lneas del puerto B para el uso
del teclado .
TECLADO_ESPERADEJEPULSAR; se mantiene en esta subrutina hasta que se deje de
pulsar un tecla.
TECLADO_LEEORDENTECLA; Lee el teclado obteniendo en el registro W el orden de la
tecla pulsada.
TECLADO_LEEHEX; Lee el teclado obteniendo en el registro W el valor hexadecimal de
la tecla pulsada
Se debe distinguir entre el orden de una tecla con su respectivo valor; el orden hace
referencia a la posicin de la tecla, este ser el mismo para cualquier teclado; mientras que
el valor hace referencia a la serigrafa del teclado que no es el mismo para todos.
Se activara una interrupcin al encontrarse una tecla presinada.
APLICACION.-
Desarrollar un programa en el cual se visualice en un display el valor de la tecla pulsada.
Para lo cual haremos uso de las libreras : TECLADO.inc, RETARDOS.inc

La conexin del teclado, display, pic se muestran en la figura, se hace uso de el integrado
7448 para decodificar las salidas del puerto A, el programa es el siguiente:
;*************************************************************************
**
;AUTOR:CARLOS ALBERTO YACO TINCUSI
; programa que visualiza en un display de catodo comu el valor de la tecla pulsada en un
teclado 4x4
;fecha : 28-05-07
;*************************************************************************
**
list p=16f84a
include<P16F84A.inc>
cblock 0x0C
contador
endc
org 0
goto inicio
org 4
goto interupcion
inicio
bsf STATUS,RP0
movlw b'00000000'
movwf PORTA
movlw b'11110000'
movlw PORTB
bcf STATUS,RP0
call TECLADO_INICIALIZA
movlw b'10001000'
movwf INTCON
principal
sleep
goto principal
interupcion
call TECLADO_LEEHEX
movwf contador
movlw d'10'
subwf contador,0
btfsc STATUS,C
clrf contador
movfw contador
movwf PORTA
call TECLADO_ESPERADEJEPULSAR
bcf INTCON,0
bsf INTCON,7
goto principal
include<RETARDOS.inc>
include<TECLADO.inc>
end
Al inicio del programa se hace la configuracin del puerto A, as como se habilita la
interrupcin por RBI, luego el pic se encuentra en un estado de bajo consumo (splep) hasta
el momento en que una tecla sea pulsada lo cual produce una interrupcin entonces
llamamos a la subrutina TECLADO_LEEHEX la cual nos devuelve el valor de la tecla
pulsada, mostrando este valor por el PUERTO A, para despus volver a habilitar la
interrupcin por RBI, solo se muestran valores del 0-9 las dems teclas tales como
A,B,C,D,E,F nos dan el valor de cero.
Una imagen del resultado final:

La librera TECLADO.inc la pueden descargar de aqu.
El programa ejemplo tambin lo pueden descargar de aqu
Espero que les sirva de algo
CARLOS YACO
ELECTRONICA BASICA






Programa clase
LIST P = PIC16F84A
INCLUDE "P16F84A.INC"
INCLUDE "MACRO.INC"

CBLOCK 0X0C
TECLA
ENDC

ORG 0X00

KB_PORT BANK1
MOVLW B'11110000'
MOVWF TRISB
BCF OPTION_REG,NOT_RBPU
BANK0
RETURN



KB_SCAN
CLRF TECLA
INCF TECLA,F
MOVLW B'00001110'
MOVWF PORTB

OTRO
NOP
BTFSC PORTB,4
GOTO S1
RETURN

S1 INCF TECLA,F
BTFSC PORTB,5
GOTO S2
RETURN

S2 INCF TECLA,F
BTFSC PORTB,6
GOTO S3
RETURN

S3 INCF TECLA,F
BTFSC PORTB,7
GOTO S4
RETURN

S4 INCF TECLA
MOVLW .17
XORWF TECLA,W
BTFSS STATUS,Z
GOTO S5
MOVLW 0X80
MOVWF TECLA
RETURN
S5 BSF STATUS,C
RLF PORTB,F
GOTO OTRO












LIST P = PIC16F84A
INCLUDE "P16F84A.INC"
INCLUDE "MACRO.INC"

CBLOCK 0X0C
TECLA
ENDC

KB_Port ;Inicializa la puerta B para las entradas del
;teclado. Programa RB0-3 como salidas y RB4-7
;entradas con las resistencias de polarizacin
;habilitadas-------------------------------------------
BSF STATUS,RP0 ;Selecciona Pagina 1 (Banco)
MOVLW 0F0h ;PB4-7 como entradas
MOVWF TRISB ;y PB0-3 como salidas
BSF OPCION,RBPU ;Habilita R de polarizacin en entradas
BCF STATUS,RP0 ;Vuelve a la pagina 0 (Banco)
RETURN ;Retorna.

KB_Scan ;Escanea el teclado
CLRF Tecla ;Borra Tecla y
INCF Tecla,f ;prepara Tecla para primer cdigo.
MOVLW 0Eh ;Saca 0 a la primera fila
MOVWF PORTB ;de la Puerta B
NOP ;Nada para estabilizacin de seal.
Cheq_Col BTFSS PORTB,4 ;Primera columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa tecla.
BTFSS PORTB,5 ;Segunda columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa tecla.
BTFSS PORTB,6 ;Tercera columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa tecla.
BTFSS PORTB,7 ;Cuarta columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa Tecla.

Ultima_Tecla ;comprueba si se a escaneado todo el teclado

MOVLW d'17' ;Carga W con el nmero de Teclas + 1.
SUBWF Tecla,w ;y lo compara con el valor actual de Tecla.
BTFSC STATUS,Z ;Si Tecla + 1 = valor actual.
GOTO NTeclas ;No ha sido pulsada ninguna tecla.
BSF STATUS,C ;Pone a 1 Bit C.
RLF PORTB,f ;as la Fila 1 pasa a 1 con la rotacin a izqda.
GOTO Cheq_Col

NTeclas CLRF Tecla ;Coloca variable Tecla a 0
RETURN ;y regresa.

antirebotes ;ahora se espera a que la tecla sea soltada para evitar rebotes
;y reactivaciones de tecla
;esta parte puede ser eliminada si para nuestro proyecto no es necesaria
;o es un inconveniente.

Espera1 BTFSS PORTB,4 ;Si no se suelta la tecla FILA 1
GOTO Espera1 ;vuelve a esperar.
Espera2 BTFSS PORTB,5 ;Si no se suelta la tecla FILA 2
GOTO Espera2 ;vuelve a esperar.
Espera3 BTFSS PORTB,6 ;Si no se suelta la tecla FILA 3
GOTO Espera3 ;vuelve a esperar.
Espera4 BTFSS PORTB,7 ;Si no se suelta la tecla FILA 4
GOTO Espera4 ;vuelve a esperar.


MOVF Tecla,w ;pone en w el numero contenido en la variable
CALL T_Conv ;llama a la tabla de conversion y retorna
MOVWF Tecla ;con el valor en hexadecimal y lo pone en la variable.
RETURN ;vuelve al programa principal que hizo la llamada.
;----------------------------------------------------------------------------------------------------------

T_Conv ADDWF PCL,1
RETLW '0' ;Tecla n0 = 0
RETLW '1' ;Tecla n1 = 1
RETLW '4' ;Tecla n2 = 4
RETLW '7' ;Tecla n3 = 7
RETLW 'A' ;Tecla n4 = A
RETLW '2' ;Tecla n5 = 2
RETLW '5' ;Tecla n6 = 5
RETLW '8' ;Tecla n7 = 8
RETLW '0' ;Tecla n8 = 0
RETLW '3' ;Tecla n9 = 3
RETLW '6' ;Tecla n10 = 6
RETLW '9' ;Tecla n11 = 9
RETLW 'B' ;Tecla n12 = B
RETLW 'F' ;Tecla n13 = F
RETLW 'E' ;Tecla n14 = E
RETLW 'D' ;Tecla n15 = D
RETLW 'C' ;Tecla n16 = C

Potrebbero piacerti anche