Sunteți pe pagina 1din 9

VALDIVIA MANCHEGO SERGIO

CONTROL DE TECLADO
El teclado es un dispositivo de entrada de datos que consta de 16 teclas o pulsadores,
dispuestos e interconectados en filas y columnas. Dispone de un conector SIL (Single In Line)
macho de 8 pines que se corresponden con las 4 filas y las cuatro columnas de las que
dispone.

FUNCIONAMIENTO:
En la siguiente figura vemos el esquema de conexiones interno del teclado matricial y sus
correspondientes pines de salida numerados de izquierda a derecha mirando el teclado tal
y como se ve en la foto anterior. Cuando se presiona una tecla se conecta una fila con una
columna, teniendo en cuenta este hecho es muy fácil averiguar que tecla fue pulsada.
También podemos ver las conexiones típicas con el puerto B del PIC.
Como observamos en la imagen anterior nace la necesidad de conectar las resistencias
externas, pero algunos microcontroladores como por ejemplo el 16F877A trae internamente
estas resistencias conectadas en el puerto B.

PROGRAMA:

processor 16f877

include<P16f877.inc>

;Declaración de VARIABLES

;Guarda el número de tecla pulsada

numTecla equ h'30'

;Para el DELAY (Estabilización de la Señal ENABLE-LCD)

cont1 equ 0x31

cont2 equ 0x32

;Contador de caractéres

caracter equ h'33'

org 0h ;Vector de RESET

goto INICIO ;Etiqueta de inico

org 05h ;Inicio del programa

INICIO:

clrf PORTB ; Limpia PORTB

clrf PORTC ; Limpia PORTC

clrf PORTD ; Limpia PORTD

bsf STATUS,RP0 ; Selecciona banco 1

movlw 0xF0 ; PortB0-3 Salidas

movwf TRISB ; PortB4-7 Entradas

clrf TRISC ; PortC0-1 Salidas

clrf TRISD ; PortD0-7 Salidas

bcf OPTION_REG,7 ; Habilita Resistencias de


; polarización en entradas

bcf STATUS,RP0 ; Selecciona banco 0

;Inicio

START:

clrf caracter

call INICIA_LCD ;Configura el LCD

goto NEW_SCAN ;Comienza el SCAN del TECLADO

;Rutina para inicializar el lcd

INICIA_LCD:

bcf PORTC,0 ; RS=0 MODO INSTRUCCION

movlw 0x01 ; 0x01 limpia la pantalla en el LCD

movwf PORTD

call COMANDO ; Se da de alta el comando

movlw 0x0C ; Selecciona la primera línea

movwf PORTD

call COMANDO ; Se da de alta el comando

movlw 0x3C ; Se configura el cursor

movwf PORTD

call COMANDO ; Se da de alta el comando

bsf PORTC, 0 ; Rs=1 MODO DATO

return

;Rutina para enviar un dato

ENVIA:

bsf PORTC, 0 ; RS=1 MODO DATO

call COMANDO ; Se da de alta el comando

return

;Subrutina para enviar INST. ó DATOS

COMANDO:

bsf PORTC, 1 ; Pone la señal ENABLE en 1

call DELAY ; Espera estabilizar la señal


call DELAY ; Espera estabilizar la señal

bcf PORTC, 1 ; ENABLE=0

call DELAY ; Espera estabilizar la señal

return

;Configuración Lineal 2 LCD

LINEA2:

bcf PORTC,0 ; RS=0 MODO INSTRUCCION

movlw 0xC0 ; Selecciona línea 2 pantalla en el LCD

movwf PORTD

call COMANDO ; Se da de alta el comando

goto NEW_SCAN

; Rutina de retardo

; Para estabilizar la señal de ENABLE

DELAY:

movlw 0xFF

movwf cont2

loop1:

movlw 0xFF

movwf cont1

loop2:

decfsz cont1,1

goto loop2

decfsz cont2,1

goto loop1

return

;Escaneo del teclado

NEW_SCAN:

clrf numTecla ; Borra el contenido de numTecla

incf numTecla,1 ; Inicializa numTecla

movlw b'00001110' ; Pone a 0 la primera Fila ( PB0 )

movwf PORTB
Nop ; Espera estabilizar la señal

;Rutina que verifíca el estado de las columnas

CHK_COL:

;Verifica si se ha presionado alguna tecla

btfss PORTB,4 ; Columna 1=0?

goto TECLA_ON ; Sale si se ha pulsado una tecla

incf numTecla,1 ; Incrementa número de tecla

btfss PORTB,5 ; Columna 2=0?

goto TECLA_ON ; Sale si se ha pulsado una tecla

incf numTecla,1 ; Incrementa número de tecla

btfss PORTB,6 ; Columna 3=0?

goto TECLA_ON ; Sale si se ha pulsado una tecla

incf numTecla,1 ; Incrementa número de tecla

btfss PORTB,7 ; Columna 4=0?

goto TECLA_ON ; Sale si se ha pulsado una tecla

incf numTecla,1 ; Incrementa número de tecla

;Verifica si se ha recorrido todo el teclado

movlw d'17' ; Número total de teclas + 1

xorwf numTecla,w ; Realiza d'17' XOR numTecla

btfsc STATUS,Z ; Verifica el estado de Z

goto NEW_SCAN ; Z=1?, Son iguales (full Scan)

; Z=0?, Son diferentes,

NEXT_COL:

bsf STATUS,C ; Enciende el carry para poner en "1" la FILA

; recorrida

rlf PORTB,1 ; Realiza corrimiento a la izquierda, pone a

; cero la siguiente FILA

goto CHK_COL ; Escanea la sig. COLUMNA

;Rutina que procesa la tecla capturada


TECLA_ON:

;Rutinas que esperan a que se deje de presionar la tecla

;Esto para evitar ECO

Espera1

btfss PORTB,4 ;Si no se suelta la tecla de la COL 1

goto Espera1 ;vuelve a esperar.

Espera2

btfss PORTB,5 ;Si no se suelta la tecla de la COL 2

goto Espera2 ;vuelve a esperar.

Espera3

btfss PORTB,6 ;Si no se suelta la tecla de la COL 3

goto Espera3 ;vuelve a esperar.

Espera4

btfss PORTB,7 ;Si no se suelta la tecla de la COL 4

goto Espera4 ;vuelve a esperar.

;Una vez que dejó de presionar la tecla

movf numTecla,w ; Pone en W el valor de numTecla

call CONV_TECLA ; Llama a la rutina de conversión

movwf PORTD ; Manda la conversión al puerto D

call ENVIA ; Manda Datos al LCD

incf caracter,1 ; Incrementa contador de caracteres

;Verifica si se ha llenado la línea 1 de caracteres

movlw d'16' ; Nómero de caracteres

xorwf caracter,w ; Realiza d'16' XOR caracter

btfsc STATUS,Z ; Verifica el estado de Z

goto LINEA2 ; z=1, Línea 1 llena

;Verifica si se ha llenado la línea 2 de caracteres

movlw d'32' ; N˙mero de teclas

xorwf caracter,w ; Realiza d'32' XOR caracter

btfsc STATUS,Z ; Verifica el estado de Z

goto START ; z=1, Línea 2 llena, reinicia

goto NEW_SCAN ; Realiza nuevo scan


;Rutina de conversión que retorna el valor en ASCII de

;numTecla en W

CONV_TECLA

addwf PCL,1

nop ;Linea 0 (no se utiliza)

retlw '1' ;Tecla #1=1

retlw '2' ;Tecla #2=2

retlw '3' ;Tecla #3=3

retlw 'A' ;Tecla #4=A

retlw '4' ;Tecla #5=4

retlw '5' ;Tecla #6=5

retlw '6' ;Tecla #7=6

retlw 'B' ;Tecla #8=B

retlw '7' ;Tecla #9=7

retlw '8' ;Tecla #10=8

retlw '9' ;Tecla #11=9

retlw 'C' ;Tecla #12=C

retlw 'F' ;Tecla #13=F

retlw '0' ;Tecla #14=0

retlw 'E' ;Tecla #15=E

retlw 'D' ;Tecla #16=D

end

FUNCIONAMIENTO DEL PROGRAMA:


Para controlar el teclado, los puertos del PIC conectados a las filas se programan como salidas y los
conectados a las columnas del teclado se programan como entradas, también se activan las
resistencias de polarización internas en los puertos de salida. Esto se hace poniendo en "0" el bit 7
del registro OPTION_REG, que inicializa los puertos para ser usados con el teclado matricial.

Ahora para saber que tecla esta siendo pulsada necesitamos escanear el teclado, y esto se consigue
mediante las rutinas NEW_SCAN y CHK_COL que consisten en ir poniendo una a una las líneas RB0 a
RB3 (conectadas a las filas del teclado) a nivel bajo ya que estas salidas tienen conectada la resistencia
de polarización a Vcc y por lo tanto están siempre a nivel lógico alto. Cada vez que una fila se pone a
nivel bajo se hacen 4 comprobaciones para ver si una de las cuatro columnas se a puesto a nivel bajo
y así saber la tecla pulsada mediante el contador numTecla.
DIAGRAMAS CONTROL DE TECLADO MATRICIAL:
BIBLIOGRAFÍA: (PAGINAS CONSULTADAS)
 http://www.openboxer.260mb.com/asignaturas/microcomp/teclado4x4.html

 http://www.puntoflotante.net/PROY_TECL.htm

 http://www.x-robotics.com/rutinas.htm

 http://monasezaelectronics.blogspot.com/2008/11/lcd-teclado-pic16f877.html?m=1

S-ar putea să vă placă și