| (http://img73.echo.cx/img73/3227/teclado4x48mr.gif) |
(http://img134.echo.cx/img134/5485/esquemateclado4x41kc.gif) |
Las resistencias de 2k2 son necesarias para poder compartir el puerto del pic independientemente del teclado y por ejemplo poder conectar un LCD o una barra de leds al mismo tiempo. Durante la fase de lectura del teclado la mitad de la puerta B es configurada como entrada y la otra mitad como lectura y durante la escritura en el lcd o otro sistema, la puerta B es configurada como salidas. Entonces se podrían cortocircuitar accidentalmente las salidas de los puertos provocando su destrucción, si pulsásemos alguna tecla es ese momento con lo que al poner estas resistencias evitamos este hecho y así si se produjera el cortocircuito tan solo circularía una pequeña corriente y el puerto del µC no correría ningún riesgo. |
|
|
Descripción: Para controlar el teclado, los puertos del µC 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 mediante la llamada a la etiqueta "KB_Port" que inicializa los puertos para ser usados con el teclado matricial. |
KB_Port ;Inicializa la puerta B para las entradas del
;teclado. Programa RB0-3 como salidas y RB4-7
;entradas con las resistencias de polarización
;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 polarización 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 código.
MOVLW 0Eh ;Saca 0 a la primera fila
MOVWF PORTB ;de la Puerta B
NOP ;Nada para estabilización de señal.
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 n£mero 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 rotaci¢n 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 nº0 = 0
RETLW '1' ;Tecla nº1 = 1
RETLW '4' ;Tecla nº2 = 4
RETLW '7' ;Tecla nº3 = 7
RETLW 'A' ;Tecla nº4 = A
RETLW '2' ;Tecla nº5 = 2
RETLW '5' ;Tecla nº6 = 5
RETLW '8' ;Tecla nº7 = 8
RETLW '0' ;Tecla nº8 = 0
RETLW '3' ;Tecla nº9 = 3
RETLW '6' ;Tecla nº10 = 6
RETLW '9' ;Tecla nº11 = 9
RETLW 'B' ;Tecla nº12 = B
RETLW 'F' ;Tecla nº13 = F
RETLW 'E' ;Tecla nº14 = E
RETLW 'D' ;Tecla nº15 = D
RETLW 'C' ;Tecla nº16 = C
Cita de: botboat en 2 Mayo 2005, 21:36 PM
felicidades ROOTX, un auténtico currazo ;D