Manejar teclado matricial y mostrar en lcd

Buenas Tardes a todos los que estan leyendo:

Tengo una duda que no me deja dormir, y menos cuando tengo que entregar mi proyecto el jueves, hahahaa, bueno la cosa es esta,:

Tengo un teclado matricial 4x3 y su respectivo decodificador, y total, me da el numero en binario, solo del 1 al 9,

Sin embargo, lo que quiero es que al apretar un numero en el teclado matricial, el valor binario (en los leds) se mantenga hasta que aprete otro numero,.

Intenté con un latch de 4 Bits, pero no lo sostiene. El decodificador tiene una salida, que yo nombre: detener, que se esta en ALTO (1) cuando se apreta una tecla, y BAJO, cuando se suelta, o cuando no hay nada apretado, esto para la entrada ENABLE del latch. No se si me puedan ayudar por favor, se los agradeceria bastante, ya no se si no se usar el latch de 4-bit, o hay alguna otra manera de mantener el valor fijo , hasta que otra tecla se aprete. De antemano muchas, muchas gracias.
 
Lo que describes parece correcto. Prueba por separado el chip latch (puede que este defectuoso). Saludos.
 
Podes utilizar resistencias de 270 ohms de las paitas de salida hacia las de entrada y resistencias de 100K de las patitas de entrada hacia atierra, osea de pull-down. ami me funciono perfectamente.
 
Buenas tardes, tengo un problema con un circuito que necesito para la practica de sistemas digitales es un temporizador conectado a un teclado matricial 4x4, realmente no se como hacer eso, el circuito no debe llevar ningun pic ni dada muy avanzado solo estamos limitados a contadores registros bidireccionales y compuertas logicas, de verdad si alguien me pudiese ayudar se lo agradeseria muchisimo; ya he revisado en el foro y no hay ni un diagrama que me ayude con esto, Gracias!!!!!!!!!
 
Hola Ambient

El temporizador para que sería ? como se utilizaría, el temporizador, conectado a un teclado matricial 4x4. ?
Para qué ? Qué función desempeña, el temporizador, con respecto al teclado matricial 4x4 ?.

saludos
a sus ordenes
 
hola que tal, es un poco enredado de explicar, la cuestion es la siguiente el temporizador tengo que trabajar a base de contadores 74LS194 son registros bidireccionales de 4 bit su salidas van conectadas a unos contadores, eso jun to con el teclado matricial me harian un supuesto temporizador, como??? alli el dilema, segun lo que entiendo unir las salidas del teclado y mandarlas a las entradas de los registros para que cuando yo introduzca un numero en el teclado este dato lo recibe el registro y de los regisros a los contadores de alli segun el dato introducido este debe contar hacia arriba o hacia abajo.

es enredado lo se por eso pedi ayuda!!!
 
hola ambient

Pues sí que esta muy confuso, sobre todo que por mas que leo tu mensaje no logro descubrir ni imaginarme donde ó cómo se hace un temporizador con ese circuito integrado mencionado en tu mensaje.

saludos
a sus ordenes
 
Última edición:
... el temporizador tengo que trabajar a base de contadores 74LS194 son registros bidireccionales de 4 bit su salidas van conectadas a unos contadores, eso jun to con el teclado matricial me harian un supuesto temporizador, como??? alli el dilema, segun lo que entiendo unir las salidas del teclado y mandarlas a las entradas de los registros para que cuando yo introduzca un numero en el teclado este dato lo recibe el registro y de los regisros a los contadores de alli segun el dato introducido este debe contar hacia arriba o hacia abajo ...

ambiet: Tu mismo estas dando la solucion. Efectivamente, el circuito que describes es un tipo de temporizador digital cuyo periodo de operacion depende del valor introducido por el teclado a cada contador (preset o precarga) via el teclado y de la frecuencia del Clock que conectes a la cadena de contadores que hagan un "conteo regresivo".

Saludos
 
Última edición:
Estuve revisando alguno de los proyectos que realicé mientras estaba en la U, la respuesta más sensilla a tu pregunta talves la encuentres en el archivo que adjunto, es una aplicación en donde muestro en una LCD la tecla que pulso del teclado.

Espero que te sirva, es muy básico pero te ayudará en proyectos más complicados.
 

Adjuntos

  • tEC.rar
    46.7 KB · Visitas: 1,222
Disculpa por que no checas desde lo simple iniciando prender un led
yo tengo problemas con ese pic dado que no me responde en la simulacion de proteus y con otros pic (como el 16f84) si me responde copiaando el mismo codgo solo que cambiando el #include <18f452.> a <16f84.h>
 
Hola a todos. Tengo el siguiente problema que me esta rompiendo la cabeza. Tengo una libreria para controlar un teclado matricial 4x3 pero algo extraño esta pasando con el. El problema es el siguiente, Mi programa deberia recoger el valor de la tecla preisonada y mostrarla en el puerto A del pic 16f84A. Cada vez que presiono un tecla sin importar cual sea el unico valor que leo en el puerto A es 9??? La verdad no tengo idea que pasa.
Espero que me puedan ayudar aca dejo el programa principal y la libreria que controla el teclado. Muchas gracias por su ayuda:apreton:(y)

PHP:
;**************************** Librería "TECLADO.INC" ***********************************

	CBLOCK
	Tecl_TeclaOrden					; Orden de la tecla a chequear.
	ENDC

Tecl_UltimaTecla	EQU	d'11'		; Valor de orden de la última tecla utilizada.

; Subrutina "Teclado_LeeHex" ************************************************************
;
; Cada tecla tiene asignado un número de orden que es contabilizado en la variable
; Tecl_TeclaOrden. Para convertir a su valor según el tipo de teclado en concreto se
; utiliza una tabla de conversión. 
; A continuación se expone la relación entre el número de orden de la tecla y los
; valores correspondientes para el teclado hexadecimal más utilizado.
;
;	    ORDEN DE TECLA:		TECLADO HEX. UTILIZADO:
;		 0   1   2			1  2  3 
;		 3   4   5 			4  5  6 
;		 6   7  8   			7  8  9 
;		 9  10  11 			A  0  B 
;
; Así, en este ejemplo, la tecla "7" ocupa el orden 8, la tecla "F" ocupa el orden 3 y la
; tecla "9" el orden 10.

; Si cambia el teclado también hay cambiar de tabla de conversión.
;
; Entrada:	En (W) el orden de la tecla pulsada.
; Salida:	En (W) el valor hexadecimal para este teclado concreto.
;
Teclado_LeeHex
	call	Teclado_LeeOrdenTecla	; Lee el Orden de la tecla pulsada.
	btfss	STATUS,C				; ¿Pulsa alguna tecla?, ¿C=1?
	goto	Tecl_FinLeeHex			; No, por tanto sale.
	call	Tecl_ConvierteOrdenEnHex	; Lo convierte en su valor real mediante tabla.
	bsf		STATUS,C				; Vuelve a posicionar el Carry, porque la
Tecl_FinLeeHex						; instrucción "addwf PCL,F" lo pone a "0".
	return
;
Tecl_ConvierteOrdenEnHex			; Según el teclado utilizado resulta:
	addwf	PCL,F
	DT	1h,2h,3h				; Primera fila del teclado.
	DT	4h,5h,6h				; Segunda fila del teclado
	DT	7h,8h,9h				; Tercera fila del teclado.
	DT	0Ah,0h,0Bh				; Cuarta fila del teclado.
Teclado_FinTablaHex
;
; Esta tabla se sitúa al principio de la librería con el propósito de que no supere la
; posición 0FFh de memoria ROM de programa. De todas formas, en caso que así fuera 
; visualizaría el siguiente mensaje de error en el proceso de ensamblado:
;
	IF (Teclado_FinTablaHex > 0xFF)
		ERROR	"Atención: La tabla ha superado el tamaño de la página de los"
		MESSG	"primeros 256 bytes de memoria ROM. NO funcionará correctamente."
	ENDIF
	
; Subrutina "Teclado_Inicializa" --------------------------------------------------------
;
; Esta subrutina configura las líneas del Puerto B según la conexión del teclado realizada
; y comprueba que no hay pulsada tecla alguna al principio.

Teclado_Inicializa
	bsf		STATUS,RP0				; Configura las líneas del puerto:
	movlw	b'01110000'				; <RB7:RB4> entradas, <RB3:RB0> salidas
	movwf	PORTB
	bcf		OPTION_REG,NOT_RBPU		; Habilita resistencia de Pull-Up del Puerto B.
	bcf		STATUS,RP0				; Acceso al banco 0.
;	call	Teclado_EsperaDejePulsar
;	return
;
; Subrutina "Teclado_EsperaDejePulsar" --------------------------------------------------
;
;Permanece en esta subrutina mientras siga pulsada la tecla.
;
Teclado_Comprobacion	EQU	b'01110000'

Teclado_EsperaDejePulsar:
	movlw	Teclado_Comprobacion	; Pone a cero las cuatro líneas de salida del 
	movwf	PORTB					; Puerto B.
Teclado_SigueEsperando
	call	Retardo_20ms			; Espera a que se estabilicen los niveles de tensión.
	movf	PORTB,W					; Lee el Puerto B.
	sublw	Teclado_Comprobacion	; Si es lo mismo que escribió es que ya no pulsa 
	btfss	STATUS,Z				; tecla alguna.
	goto	Teclado_SigueEsperando
	return
;
; Subrutina "Teclado_LeeOrdenTecla" -----------------------------------------------------
;
; Lee el teclado, obteniendo el orden de la tecla pulsada. 
;
; Salida:	En (W) el número de orden de la tecla pulsada. Además Carry se pone a "1" si
;			se pulsa una tecla ó a "0" si no se pulsa tecla alguna.
;
Teclado_LeeOrdenTecla:
	clrf	Tecl_TeclaOrden			; Todavía no ha empezado a chequear el teclado.
	movlw	b'01111110'				; Va a chequear primera fila.
Tecl_ChequeaFila					; (Ver esquema de conexión).
	movwf	PORTB					; Activa la fila correspondiente.
;	call	Retardo_1ms

Tecl_Columna1
	btfss	PORTB,4					; Chequea la 1ª columna buscando un cero. 
	goto	Tecl_GuardaValor		; Sí, es cero y por tanto guarda su valor y sale.
	incf	Tecl_TeclaOrden,F		; Va a chequear la siguiente tecla.
Tecl_Columna2						; Repite proceso para las siguientes 
	btfss	PORTB,5					; columnas.
	goto	Tecl_GuardaValor
	incf	Tecl_TeclaOrden,F
Tecl_Columna3		
	btfss	PORTB,6
	goto	Tecl_GuardaValor
	incf	Tecl_TeclaOrden,F

;
; Comprueba si ha chequeado la última tecla, en cuyo caso sale. Para ello testea si
; el contenido del registro Tecl_TeclaOrden es igual al número de teclas del teclado.
;
Tecl_TerminaColumnas
	movlw	Tecl_UltimaTecla
	subwf	Tecl_TeclaOrden,W		; (W) = (Tecl_TeclaOrden)-Tecl_UltimaTecla.
	btfsc	STATUS,C				; ¿C=0?, ¿(W) negativo?, ¿(Tecl_TeclaOrden)<11?
	goto	Tecl_NoPulsada			; No, se ha llegado al final del chequeo.
	bsf		STATUS,C				; Sí. Va a chequear la siguiente fila.
	rlf		PORTB,W					; Apunta a la siguiente fila.
	goto	Tecl_ChequeaFila	
Tecl_NoPulsada
	bcf		STATUS,C				; Posiciona C=0, indicando que no ha pulsado
	goto	Tecl_FinTecladoLee		; tecla alguna y sale.
Tecl_GuardaValor
	movf	Tecl_TeclaOrden,W		; El orden de la tecla pulsada en (W) y sale.
	bsf		STATUS,C				; Como hay tecla tecla pulsada, pone C=1. 
Tecl_FinTecladoLee
	return

y el progrma es este

PHP:
	INCLUDE	"p16f84a.inc"
	
	
	CBLOCK	0x0C
	ENDC
		
	ORG	00
	goto	configuracion
	ORG	05
	
	
configuracion


	call	Teclado_Inicializa
	BSF	STATUS,RP0
	clrf	PORTA
	BCF	STATUS,RP0
	
	CLRF	PORTA
	CLRW
	
inicio
	clrf	PORTA
	clrw
	call	Teclado_LeeHex
	btfss	STATUS,C
	goto	inicio
	call	Teclado_EsperaDejePulsar
	call	Retardo_100ms
	movwf	PORTA
	call	Retardo_2s
	call	Retardo_2s
	goto	inicio


	INCLUDE	"TECLADO3x4.inc"
	INCLUDE	"RETARDOS.inc"
	END

Perdon amigos el abuso pero la verdad que ya me duele la cabeza y no consigo arreglarlo. denuevo muchas gracias

Bueno despues de perder mi ultima neurona que me quedaba encontre cual era el problema:oops:
Al parecer la libreria esta correcta... mi problema era que despues de llamar a la rutina Teclado_LeeHex la cual devuelve en W el valor de la tecla pulsada hacia otra llamada a Retardo_100ms la cual tambien ocupa W para realizar una cuenta...:oops::oops:
Solucion: Guardar el valor obtenido de la rutina de teclado en una variable y luego utilizarla asi me olvidode lo que pasa con W :rolleyes:

mmmmm avergonzado me despido jajjajaj:LOL:

NOTA: Por buscar un arbol en medio del bosque no vi ninguno...
 
Última edición:
Hola a todos soy estudiante de 4to semestre de electrónica y como deber de sistemas digitales necesito elaborar un circuito digital que mediante el uso de un teclado matricial 4x4 y un display de 16 segmentos, visualice en el display de 16 segmentos la tecla que tenga presionada en el teclado matricial 4x4, por favor me podrían guiar como puedo hacerlo, ya que no tengo idea que integrados se necesitan ni para poder armar el circuito en algún simulador.
Desde ya gracias por su ayuda.
 
Hola a todos, estoy tratando de utilizar la herramienta KeyPad matrix del Pic Simulator IDE pero no lo logro, en mi codigo escaneo las filas una a una pero aunque presione cualquier tecla el pic de Microcontroller view no se inmuta aunque manda un 1 a un pin si tal tecla se presiona, no veo que la herramienta se configure mas que elegir que pin asignar a las filas y las columnas, que pudiera estar mal?, Gracias de antemano.
 
Hola miguelb

En el Software CircuitMaker, que es un simulador, viene un circuito de ejemplo parecido al que estás requiriendo.
Solo hay que cambiar el tipo de Display y decodificador que trae por los que tu requieres. El archivo se llama “4x4.ckt”
Para obtener el software entra a Google.com y busca el: circuit maker 2000, aparecerán barios enlaces, de algunos podrás bajar e instalar ese software en tu PC.

saludos
a sus ordenes
 
Hey muchachos.

Quiero hacer una alarma casera, pero no me funciona la libreria del teclado en proteus pero si lo he visto que funciona, quiero saber si sí les ha funcionado en el circuito, creo que hay que descomentarial una linea en la lebreria del teclado para que funcione por puerto B, pero nada.

Espero que me ayuden, Gracias.
 
Gracias ya lo encontre en CircuitMaker, pero no se cual es el decodificador a usar para el display de 16 segmentos, me podria ayudar??? y que decodificador esta usando para ese display de 7 segmentos ya que ese no es el 74ls47???
 
Hola miguelb

El circuito integrado conectado al Display de 7 segmentos en el circuito que te mencioné (4x4.ckt) no es un decodificador sino un Flip-Flop tipo D cuádruple; el Display es HEXagecimal de 7 segmentos. Nota que solo tiene 4 entradas mientras que el Display BCD tiene 7 entradas.

Creo que no hay un decodificador para Display de 16 Segmentos; aquí mismo, en el foro, alguien recomendó uno en algún tema que trata también de Display de 16 segmentos, lo puedes localizar por medio del buscador del foro.

Pero como tienes un teclado de 4x4 solo puedes obtener resultados del 0 al 15 así que puedes utilizar los de siempre, 7447 ó 7448.

Ve si te sirve el circuito contenido en la imagen adjunta.

saludos
a sus ordenes
 

Adjuntos

  • 16 Seg As 7 Seg.jpg
    16 Seg As 7 Seg.jpg
    161.3 KB · Visitas: 409
Hola!! :) estoy haciendo un teclado matricial (sin usar pic), y bueno simulando en proteus debo conectar un reloj en una de las entradas de una compuerta AND de dos entradas. En el propetus pues el reloj es un dibujito de pulsos, pero no te dice componentes que utilizaras ni nada.. ahora que lo estoy armando en mi protoboard quisiera saber si puedo usar el N555 (que tengo uno guardado de un montaje anterior) pero no se si servira... y en el caso que si sirva, como lo conecto?? osea me refiero a los pines que trae el 555 con la entrada de la AND. Les agradezco de antemano si me pueden ayudar por favor!! :)

Andrea Liz
 
Atrás
Arriba