TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Peliparado en 16 de Marzo de 2005, 11:11:00
-
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.
-
No te comento nada sobre el programa porque no tengo idea de ASM, pero con respecto a lo de que no haga nada, ¿tienes puesta una resistencia a la patilla MCLR?, ¿el cristal oscila?.
Si tienes dudas respecto al funcionamiento del pic, te recomiendo hagas un programa muy simple, como el típico de parpadeo de un led, y ajustes tu hardware hasta que compruebes que funciona. Una vez hecho esto, ya podrás grabar un programa complejo en el micro con la seguridad de que el hardware te está respondiendo adecuadamente.
-
aver prueba con esto
prin
call teclado
xorlw h"00"
btfsc status,z
goto prin ; si no se pulsa ninguna tecla te vas a prin
call retardo
call imprimir
goto prin
; en teclado eliminas ese porta,0 y ponees retlw h00" ,ninguna tecla pres