Multiplexar 6 display 7 seg con teclado 3*4

saludos colegas, les pido una pequeña ayuda estoy en un proyecto y quiero multiplexar 6 display, la entrada de los datos vienen de un teclado, entonces lo que no se como empesar la rutina,pero la idea mas o menos la tengo...... que seria crear 6 variables donde se alogen los numeros que van a visualizarse, entonces no llego a la rutina para cada ves que presione un digito se valla guardando en registros variables diferentes para despues ser llamadas para multiplexar............

nose si me explique bien........................
 
La entrada de datos del teclado, usas alguna interrupcion por cambio de estado en los pines configurados como entrada, asi lees solo cuando una tecla se haya pulsado, mientras tanto tu sigues visualizando los displays, de a un digito por vez, simplemente hazlo a una frecuencia que engañe al ojo humano y parezcan que todos los digitos se visualizan juntos y no uno por uno como es realmente.

Saludos
 
gracias por tu respuesta MaMu, pero esos datos ya los sabia lo que quiero es queme encaminen hacia la rutina, sobre el multiplexar los display, por que ya tengo la rutina hecha para el teclado y se me visualisa 1 digito no encuentro la forma de hacer k se me vusualisen los demas
 
gracias pic-man ahroa mismo hay es que ya estoy por que ya les cree las variables para que cada ves que se presione una tecla se guarde en la variable y cuando llegue a la etapa del multiplexar los datos los tome de las variables ........................... ahhhhhhhhh se me olvidaba, ehhh, un ejemplo si quiero poner dos salidas para display (portc y pord) y miltiplexarla osea que tendria 12 display, pero que antes que mandar cualquier digito quisiera poner para donde va los digitos que se van a introducir ya sea para que el resultado salga por el puerto C o D
creo que deberia poner una condicion en otro puerto ....

ej.. del pic 16f877
en port. E
configurarlo como entrada entonces usar dos de su patas que y que se este escaneando y cuando se ponga a uno RE0 valla para el puerto C y cuando de ponga en uno el puerto RE se valla al puerto D
mas o menso creo que deberia ser asi pero trate de hacerlo con::>

Código:
control             btfss 	PORTE,0
			goto	DISPL1
			btfss 	PORTE,1
			goto	DISPL2
                        goto    control

pero no me funciono alguna
 
solo me falta multiplexar los display wao que bobo con esto
si alguien quiere que le preste las rutinas que tengo hechas para que las chequee y me pueda decir donde esta mi error o algo parecido, estoy ya desesperadooooo..... jajajjajajajaj
 
SI probas con el integrado SAA1064, es un controlador para 4 (cuatro) displays, compatible con bus I2C. Solo serviria para 4, no 6, pero quiza viendo su datasheet te des una idea de como expandirlo (Si es que se puede).
 
Nunk mencione un contador :/

EL dato que ingreses por el teclado, el micro lo transformara y por i2c lo enviara al SAA que t permitiria manejar los 4 displays.
 
gracias por su apoyo ya casi estoy en temino de mi proyecto solo tengo que hacer una pequeña rutina de control.......

PRINCIPAL
BTFSC PORTA, 5
CALL CLRNAC
BTFSC PORTE, 2
CALL CLRQP
BTFSC PORTE, 1
CALL QUINIELA
BTFSC PORTE, 0
CALL NACIONAL
GOTO PRINCIPAL

esta es la rutina que tengo hecha para que me mande a diferentes partes del programa segun la tecla pulsada pero cuando lo hago con btfss le pasa por ensima a ese control y cuando lo hago con btfsc se me queda muerto el programa no hace nada entonces probe estas rutinas aparte con diodos led para verificar el corecto funcionamiendo y me funcionaron nitidooooo...... entonces nose por que en mi programa no quieren funcionar...


gracias por tu tiempo
 
Los displays los debes controlar directamente con el PIC, o puedes usar conversores de binario a BCD? te serviran para:
* ahorrar pines del pic... de 7 a 4 (o sea, sumando los 6 pines que eligen que display encender, reduces de 13 pines usados a 10...)

* ya no necesitas los transistores, puedes usar el mismo integrado para dejar en blanco los displays que no les des Enabled... dandole de a uno por vez, puedes hacer un barrido de los 6 displays

*Es mas facil para que hagas el programa, enviar un dato binario por un puerto y no ponerte a ver que segmentos tienen que encender segun que numero sea...
 
Ahora no tengo mucho tiempo para hacerlo, pero no es muy complicado.

Pero yo lo que haria seria pensar un poco mas logicamente... digo, si tienes pulsada una tecla, por lógica no tienes pulsada otra... no es cierto?
Entonces en lugar de poner "CALL CLRNAC" o "CALL CLRQP", ponle GOTO...

Entonces al final de la rutina CLRNAC o CLRQP, ponle "GOTO Principal"... asi va a volver a preguntar por todos los botones de nuevo.

No tiene sentido que si ya encontro por ejemplo que CLRNAC estaba presionado, ahora preguntes si CLRQP esta tambien presionado (Es el unico sentido que tendria ponerle un CALL en lugar del GOTO)... y es mejor volver a pregunta a TODOS los botones desde el principio...

Con eso evitarias que por alguna causa se llene la pila de direcciones para hacer saltos con subrutinas... si ese stack se llena, pues el programa se resetea o salta a cualquier direccion inesperada al no saber a donde tenia que volver... cosa que con el GOTO no sucede.

Ahora... porque te funciono con los LEDS? precisamente porque seguramente pusiste por ejemplo "BSF PORTB, 1" en lugar del "CALL"... entonces nunca salto a otra subrutina y no tuvo problemas para seguir con el resto de los BTFSC...

Prueba... ya me paso mil veces, y no me sorprenderia que te hayas olvidado de algun RETURN por ahi.


Otra cosa... para que quieres todo esto? luego con esos digitos vas a hacer algo? o es solo con fines didacticos?
Para saber que display tienes que rellenar, haz una variable que arranque en cero(que se llame Index por ejemplo), y le sume uno por cada tecla presionada...
Luego pregunta el valor de esa variable y rellena el display correspondiente...
Esto es sumamamente facil en PicBASIC, ya que puedes hacer array de variables y luego llenar una variable llamada Display, por ejemplo, y para saber cual, simplemente puedes escribir Display(index) = Tecla... asi de simple, el compilador de basic se encargara de traducir eso a Assembler...

Y si tienes que usar Assembler puro por alguna cuestion, aun asi no es dificil... puedes hacer una serie de BTFSC y BTFSS para saber cual display rellenar, dependiendo del valor de Index...


Ahhh y lo que es mas facil cuando quieras tomar dos caminos con un pic, es poner el btfsc seguido al btfss, entonces si no es una, es la otra (como si fuera un if y un else)...

Ejemplo:

BTFSS PORTA, 5 ;Si esta encendido, salta a la rutina uno, sin preguntar abajo
BTFSC PORTA, 5 ;Sino esta encendido, por logica esta apagado y salta a la rutina dos
GOTO RUTINA_UNO
GOTO RUTINA_DOS ;Si o si tiene que irse a una u otra, no le queda mas camino...
 
Respeto a la prueba que hice con btfss

Código:
INICIO
		bsf 	STATUS,RP0 				
		movlw	b'00000000'
		movwf	TRISB 	
		movlw	b'11111111'
		movwf	TRISA 
		bcf 	STATUS,RP0				
		CLRF	TRISB		

ESPERA	BTFSS	PORTA, 0	
		call	LED1
		BTFSS	PORTA, 1
		call	LED2
		BTFSS	PORTA, 2
		call 	LED3
		GOTO	ESPERA
    

LED1
		MOVLW	B'00000001'
		MOVWF	TRISB
		RETURN
LED2				
		MOVLW	B'00000100'
		MOVWF	TRISB
		RETURN
LED3	
		MOVLW	B'00010000'
		MOVWF	TRISB
		return


END

haci fue que lo hice en la prueba con los led pero ya en el programa no me quiere funcionar
 
La forma de preguntar con los BTFSS es correcto... pero no me gusta lo que haces con los leds.
TRISB, define si las patitas del PIC van a actuar como entradas o como salidas... mientras que PORTB es tomado por el compilador como el puerto B del PIC.
por lo cual en lugar de MOVWF TRISB
puedes poner MOVWF PORTB

pero para encender un solo LED, podrias poner la instruccion Bit Set File... o BSF.

En lugar de poner
MOVLW B'00000001'
MOVWF TRISB

Puedes poner sencillamente
BSF PORTB, 0 (Donde el cero, indica el primer Bit del puerto, la pata 6 en los pic16f628)

Y para apagarlo utilizas BCF, que es Bit Clear File...
BCF PORTB, 2 (apaga la patita 8 del PIC)


...........
Volviendo a tu primera duda... lo de BTFSS... como es el circuito? El pulsador como funciona?

Con "BTFSS PORTA, 0" esta puesto para que salte una instruccion si encuenta que la pata 17 del PIC esta con 5 voltios, entiendes?

La unica manera de que se ejecute "call LED1" es que detecte cero voltios en ese pin del PIC... me sigues?

Para que cuando el boton este suelto, sin presionar, el sistema detecte que tiene 5voltios, un 1 logico, entonces algo tiene que estarlo manteniendo arriba... Eso se logra con una resistencia de pull-up... sabes que es eso? la tiene?

Porque si no le pones esa resistencia, y al estar la patita del PIC "al aire", sin conexion, el PIC no tiene ninguna referencia, no sabe si esta en 1 o en 0, entonces empieza a funcionar erraticamente, subiendo y bajando de uno a cero constantemente...

Que te hace ese error? que los BTFSC o BTFSS no anden bien... normalmente no van andar bien, ya que constamente esta cambiando de uno a cero...
Cuando presionar el boton si, queda en un estado (supone que queda en UNO) y se queda en uno, no cambia... pero cuando lo sueltas empieza a oscilar...

Y que hace esto? Que dependiendo de como este diseñado tu circuito, puede que te funcione sin problemas el BTFSS y el BTFSC no funcione... porque no sabe que hacer... y este es tu caso... me parece que puede ser por eso que el BTFSS funcione y el otro no...


Y si, lo siento... se que te confundo y te creo mas dudas que respuestas... pero me gustaria si puede ser el codigo completo y porque no, un dibujito de tu circuito electronico... a partir de ahi, te digo porque te falla...


Y yo ya lo habia hecho a esto... solo que no lo representaba en displays, sino que lo comparaba con un codigo guardado y si era correcto encendia una luz...

Esta muy poco explicado, y en ese tiempo programaba de una forma peculiar... JAJAJA ni yo me entiendo ahora, pero fue uno de mis primeros proyectos y te puede servir la logica que use...
 

Adjuntos

  • pass_121.asm
    6 KB · Visitas: 38
gracias REL2008 yo comprendo lo que me dices por hace tiempo hice un culso de micro pero por motivo de trabajo no pude seguir practicando, entonces lo retome ahora ehhhh mandame un mensaje privado con tu mail para agregarte a mi msn para asi te puedo pasar todos los archivos que requieras e ir explicandote mas rapidamente.................
 
todavia estoy cojiendo lucha con la rutica btfss nose si el simulador sea el del problema................. quisiera alguien que estedispuesto aprobar mi codigo para que me diga como anda por que por que todavia estoy buscando un buen programador para hacerlo.............
 
Atrás
Arriba