Como estan, soy nuevo en el foro, es para pedirles ayuda:
Se trata de un teclado matricial 4x4, no he encontrado ABSOLUTAMENTE NADA en el foro acerca de esto ni mucho menos en las paginas en español de microcontroladores. Estoy construyendo un sistema muy basico, muy:
Teniendo el teclado matricial, detectar cual tecla se pulsa y mostrarla en el display de 7 segmentos.
Les comento cual es mi metodo:
1. Saqué la tabla de teclas usando el voltimetro en continuidad, el teclado tiene 8 pines en la parte de abajo, los primeros cuatro (contando de izquierda a derecha) son columnas, y el resto filas. Entonces junte la primera columna - con la primera fila, la primera columna - con la segunda fila, la primera columna - con la tercera fila y asi sucesivamente y saque la siguiente tabla :
+--- +--- tecla 1
+--- -+-- tecla 4
+--- --+- tecla 7
+--- ---+ tecla *
-+-- +--- tecla 2
-+-- -+-- tecla 5
-+-- --+- tecla 8
-+-- ---+ tecla 0
--+- +--- tecla 3
--+- -+-- tecla 6
--+- --+- tecla 9
--+- ---+ tecla #
---+ +--- tecla a
---+ -+-- tecla b
---+ --+- tecla c
---+ ---+ tecla d
El + representa el lugar (en los 8 pines) donde coloco los extremos del voltimetro, cuando undo la tecla "pita" y por eso se a que corresponde.
Con base en esa tabla realice el siguiente metodo:
En el PIC, destino al puerto B para manejar el teclado, de RB0 a RB3 colocare las filas, y de RB4 a RB7 las columnas.
Aqui viene la duda # 1, en el software programe a TRISB asi: 11110000, porque como explicare mas adelante, las columnas se toman como entradas y las filas como salidas, ya que el sistema para manejar el teclado es ir rotando un 0 por las filas e ir buscando otro 0 en las columnas, cuando lo hace, se determina la posicion y por ende la tecla pulsada.
El circuito es:
| |rb0 rb7 -| 1 2 3 A | Con resistencia a VCC 260 Oh
| |rb1 rb6 -| 4 5 6 B | Con resistencia a VCC 260 Oh
| |rb2 rb5 -| 7 8 9 C | Con resistencia a VCC 260 Oh
| |rb3 rb4 -| * 0 # D | Con resistencia a VCC 260 Oh
| |rb4 rb3 -|
| |rb5 rb2 -|
| |rb6 rb1 -|
| |rb7 rb0 -|
Como pueden ver, a la derecha esta el teclado con los 8 pines, los primeros columnas y los restantes filas, a la izquierda esta el PIC, y por ejemplo, el PIN RB0 del PIC va conectado con un cablecito al PIN RB0 de teclado (ver la figura)
ESO ES TODO, mi software SENCILLO es:
LIST P=16F873A
INCLUDE <P16F873A.INC>
DATO1 EQU 20
DATO2 EQU 21
DATO3 EQU 22
INICIO BSF STATUS,5
CLRF TRISC
MOVLW 0xF0
MOVWF TRISB ; TRISB 11110000 , 0-> salidas, 1-> Entradas
BCF STATUS,5
GOTO PRIN
; Programa principal
PRIN CALL TECLADO
CALL RETARDO20 ; para el rebote
CALL IMPRIMIR
GOTO PRIN
; Rutina para hallar la tecla pulsada
TECLADO CLRF PORTB ; asi es el metodo de escaneo de un teclado
BSF PORTB,1 ; matricial, en los primeros bits, (RB0 a RB3), osea
BSF PORTB,2 ; en las filas, voy rotando un 0(los demas estan en1)
BSF PORTB,3 ; y voy verificando las columnas (en busca de un 0)
BTFSS PORTB,4 ; y si encuentro la coincidencia, hallo la tecla.
RETLW .13
BTFSS PORTB,5
RETLW .15
BTFSS PORTB,6
RETLW .0
BTFSS PORTB,7
RETLW .14
BSF PORTB,0
BCF PORTB,1
BTFSS PORTB,4
RETLW .12
BTFSS PORTB,5
RETLW .9
BTFSS PORTB,6
RETLW .8
BTFSS PORTB,7
RETLW .7
BSF PORTB,1
BCF PORTB,2
BTFSS PORTB,4
RETLW .11
BTFSS PORTB,5
RETLW .6
BTFSS PORTB,6
RETLW .5
BTFSS PORTB,7
RETLW .4
BSF PORTB,2
BCF PORTB,3
BTFSS PORTB,4
RETLW .10
BTFSS PORTB,5
RETLW .3
BTFSS PORTB,6
RETLW .2
BTFSS PORTB,7
RETLW .1
BSF PORTA,0
; Rutina para el retardo de 1 segundo
RETARDO MOVLW .25
MOVWF DATO1
ONE MOVLW .90
MOVWF DATO2
TWO MOVLW .150
MOVWF DATO3
THREE DECFSZ DATO3,1
GOTO THREE
DECFSZ DATO2,1
GOTO TWO
DECFSZ DATO1,1
GOTO ONE
RETURN
RETARDO20 MOVLW .1
MOVWF DATO1
UNO MOVLW .90
MOVWF DATO2
DOS MOVLW .150
MOVWF DATO3
TRES DECFSZ DATO3,1
GOTO TRES
DECFSZ DATO2,1
GOTO DOS
DECFSZ DATO1,1
GOTO UNO
RETURN
; Rutina para imprimir en orden descendente
IMPRIMIR CALL TABLA
MOVWF PORTC
CALL RETARDO
RETURN
TABLA ADDWF PCL,1 ; mi display se prende con 0s
RETLW b"00000010" ; 0
RETLW b"10011110" ; 1
RETLW b"00100100" ; 2
RETLW b"00001100" ; 3
RETLW b"10011000" ; 4
RETLW b"01001000" ; 5
RETLW b"01000000" ; 6
RETLW b"00011110" ; 7
RETLW b"00000000" ; 8
RETLW b"00011000" ; 9
RETLW b"00010000" ; 10 A
RETLW b"11000000" ; 11 B
RETLW b"01100010" ; 12 C
RETLW b"10000100" ; 13 D
RETLW b"01100000" ; 14 E
RETLW b"01110000" ; 15 F
FIN NOP
END
Eso es todo, es lo unico que se y que tengo para mostrarles mi problema: NO FUNCIONA NADA, QUEMO EL PIC Y NADA DE NADA, yo se que es un error de programacion o cableado, porque el PIC esta bueno 16F873A y mi quemador tambien, el circuito para el display ya esta probado, osea que ese no es el problema. Por favor, si alguien me puede ayudar, se los agradeceria, y repito, no hace nada de nada, lo enchufo a los 5V y presiono teclas y nada.