# Displays y pic



## gabyduelo (Oct 14, 2006)

Hola a Todos espero que me ayuden porfa.
Miren con el pic16f84A tengo que hacer un contador de 0 a 9999 bueno en realidad yo no lo tengo que hacer sino unos compañeros que estan llevando la materia, esa materia yo ya la llevé pero como me gusta esto de la electrónica ando ahi de metiche. Total les encargaron el contador y les dijo el profe que los primeros 4 bits del portB van a un 7448 (deco) y luego ya la salida a 4 displays multiplexados (creo ese es el término para los displays en serie). Luego los otros 4 bits van a las patas de tierra de los displays. Bueno por lo que he leído y cuando llevé electonica digital los que van a las patas de tierra de los displays es para darles el permiso de trabajar. Y lo demás pues es lo que me da el número. Cuando llevé elctrónica digital me pusieron a hacer un circuitod de un marcador de fútbol y utilizamos los displays multiplexados, pero el profe nos dió el circuito así que lo armamos y salimos del apuro, después me puse a entenderle y no entendí como funciona eso de multiplexar los displays. El otro día hicimos con el pic16f84a un contador de 0 a 99 sin displays multiplexados, y pues en una rutina contabamos del 0 al 9 pero cuando queriamos que apareciera el 10, saliá primaro el 0 y luego el 1 o si no se birncaba del 9 al 11 total fue todo un rollo y lo que hicimos fue sumarle 16 en binario para que saliera y pasarlo a otra rutina. Pero ahora con el contador de 0 a 9999 con eso de los multiplexados me hago bolas no entiendo como hacer eso de que aparezcan al mismo tiempo los números. Ayudenme porfavor!!! solo quiero aprender!!! leí algo de eso de los permisos aqui en este foro que le mandan un 1 para activar un display luego al otro display y así pero si activo uno y luego el otro como va a aparecer los demás??? Si voy en unidades y llegué hasta el 9 como le hago para poner el 0 y que en el display 2 me aparezca el 1. Gracias de antemano. Gaby.
Anexo el marcador de futbol que hice lo simulé en circuit maker pero fue un fracaso con eso de los displays multiplexados. El circuito esta bien ya lo armé y si sale todo muy bien pero yo quiero entenderlo... no nada más que salga y ya.


----------



## cieguitovolador (Oct 14, 2006)

Hola gabyduelo, mira, lo de multiplexar los display se trata de que se prendan de a uno por vez, para disminuir el consumo de corriente, ya que no es lo mismo tener prendido los 4 display que uno, estarias consumiendo solamente la cuarta parte. Otra ventaja es que con un solo bus mandas los datos a todos los display, ahorrando varias patas del pic. Para multiplexar lo que tenes que hacer es conectar el terminal de anodo comun o catodo comun de los displays a un transistor que lo que hara es mandar a masa o no al terminal comun haciendo que se enciendan nada mas los display que correspondan. Para eso cada base del transistor va conectada a un pin del pic, que comandara el encendido de los displays. Bueno espero haber sido claro sino pregunta cualquier otra duda.


----------



## Jorge Andres (Oct 18, 2007)

hola solo para complementar la respuesta anterior, las bases de los transistores las debes exitar a una frecuencia tal que engañe al ojo; es decir que tu ves como que todos los displays estuvieran encendidos cuando realmente esta ancendido uno a la vez solo que se intercambian tan rapido que no nos damos cuenta.no estoy seguro pero creo que a frecuencias mayores de 10 Hz no se pèrciben a la vista. te recomiendo que lo pruebes en proteus.saludos


----------



## eidtech (Oct 18, 2007)

Gaby prueba estos 2 links donde publique respuestas relacionadas al tema:

https://www.forosdeelectronica.com/f24/multiplexacion-pic16f84a-displays-3413/
https://www.forosdeelectronica.com/f25/controlar-2-displays-solo-decodificador-7447-a-5487/


----------



## mabauti (Oct 18, 2007)

tal vez este te pueda servir:

https://www.forosdeelectronica.com/f24/contador-16f84-4550/#post20931


----------



## Ratzinger (Nov 20, 2008)

Hola yo hice este programa y es un contador hexadecimal y esta multiplexado entonces en el mismo bus tiro dos digitos y enciendo y apago otro  y parece k estuviera conectado a dos puertos diferentes espero que les ayude use proton es basic 
cuidenc saludos desde campeche y espero les sirva.



```
DEVICE 16F84A

XTAL 4

DelayMS 500						' Wait for PICmicro to stabilise
Clear							' Clear buffers
Low PORTb                       ' ALL PORTB off
low porta						' ALL PORTA off
TRISB = %00000000				' Set PORTB outputs
TRISA = %01100                  ' Set PORTA outputs


DIM datos[16] AS BYTE
DIM X AS BYTE
DIM DELAY AS BYTE
dim contador as byte
dim contador2 as byte
dim estadopush as byte
 
Symbol push = PORTa.2 

 
DELAY = 20
contador = 0
contador2 = 0




datos[0]=%00111111
datos[1]=%00000110
datos[2]=%01011011
datos[3]=%01001111
datos[4]=%01100110
datos[5]=%01101101
datos[6]=%01111101
datos[7]=%00000111
datos[8]=%01111111
datos[9]=%01101111
datos[10]=0x077
datos[11]=0x07C
datos[12]=0x039
datos[13]=0x05E
datos[14]=0x079
datos[15]=0x071


loop:
   If PORTa.0 = 0 Then     ' If 4th button pressed...
      call Ascendente      	' 4th LED on
        Endif

   If PORTa.0 = 1 Then     ' If 4th button pressed...
      call Descendente      	' 4th LED on
        Endif        
        return
goto loop


' SI EL VALOR DE estadopush = 0 EL CONTADOR ES ACENDENTE


Ascendente:
FOR X = 0 TO DELAY
   
    if x = delay then 
         INC contador
     end if
         if contador = 16 then 
             INC contador2
             contador = 0 
         end if 
             if contador2 = 16 then 
                 contador2=0
             end if 

LOW PORTA.3
DELAYMS 10
HIGH PORTA.4
PORTB = datos[contador2]
LOW PORTA.4
DELAYMS 10
HIGH PORTA.3
PORTB = datos[contador]
NEXT   

goto loop
Goto Ascendente

' SI EL VALOR DE estadopush = 1 EL CONTADOR ES DESENDENTE
 

Descendente:
FOR X = 0 TO DELAY

  
    if x = delay then 
        dec contador
    end if
        if contador = 0 then 
            dec contador2
            contador = 16 
        end if 
            if contador2 = 0 then 
                contador2 = 16
            end if 

LOW PORTA.3
DELAYMS 10
HIGH PORTA.4
PORTB = datos[contador2]
LOW PORTA.4
DELAYMS 10
HIGH PORTA.3
PORTB = datos[contador]
NEXT 
goto loop
GOTO Descendente
```


----------



## gemetzelgott (Nov 24, 2008)

Hola, hice este pequeño codigo en C, cuenta de 0 a 9999 con 4 display multiplexados por el puerto a del pic 16f84 y los datos los saca por puerto b que esta conectado a un 7448


```
#include <16f84a.h>
#use delay (clock=4000000)
#byte porta=0x05
#byte portb=0x06
#bit ra0=0x05.0
#bit ra1=0x05.1
#bit ra2=0x05.2
#bit ra3=0x05.3

void main()
{
 int i=0,j=0,m=0,k=0;
 set_tris_a(0);
 set_tris_b(0);
 portb=0;
 while(1)
 {
  porta=0;
  for(i=0;i<10;i++)
  {
   ra0=1;
   portb=i;
   delay_ms(50);
   ra0=0;
   for(j=0;j<10;j++)
   {
    ra1=1;
    portb=j;
    delay_ms(50);
    ra1=0;
    for(k=0;k<10;k++)
    {
     ra2=1;
     portb=k;
     delay_ms(50);
     ra2=0;
     for(m=0;m<10;m++)
     {
      ra3=1;
      portb=m;
      delay_ms(50);
      ra3=0;
     }
    }
   }
  }
  portb=0;
  porta=255;
  delay_ms(1000);
 } 
}
```

Te anexo la simulacion en proteus y e archivo en C y el .hex para que programes tu pic.


----------



## gemetzelgott (Nov 24, 2008)

Oops!, hubo un pequeño error con el codigo, aqui te mando el mejorado:


```
#include <16f84a.h>
#use delay (clock=4000000)
#byte porta=0x05
#byte portb=0x06
#bit ra0=0x05.0
#bit ra1=0x05.1
#bit ra2=0x05.2
#bit ra3=0x05.3

void main()
{
 int i=0,j=0,m=0,k=0;
 set_tris_a(0);
 set_tris_b(0);
 portb=0;
 while(1)
 {
  porta=0;
  for(i=0;i<10;i++)
  {
   for(j=0;j<10;j++)
   {
    for(k=0;k<10;k++)
    {
     for(m=0;m<10;m++)
     {
      ra0=1;
      portb=i;
      delay_ms(50);
      ra0=0;
      ra1=1;
      portb=j;
      delay_ms(50);
      ra1=0;
      ra2=1;
      portb=k;
      delay_ms(50);
      ra2=0;
      ra3=1;
      portb=m;
      delay_ms(50);
      ra3=0;
     }
    }
   }
  }
  portb=0;
  porta=255;
  delay_ms(1000);
 } 
}
```


----------



## gemetzelgott (Nov 24, 2008)

Para responder tu pregunta sobre que parezcan que los displays estuvieran encendidos lo que tienes que hacer es tomar el periodo 16,6ms(60Hz) y dividirlo entre el numero de display que vayas a utilizar, en este caso son 4, entonces te dara un tiempo aproximado de 4ms, este tiempo sera el  de retardo entre el encendido y el apagago de cada display. Proteus no sera capaz de simularte con este tiempo ya que es muy pequeño, pero una vez que lo programes en tu pic veras que funciona.


----------



## norman sanchez (Mar 1, 2011)

buenas a todos, necesito hacer un contador de 0-99  y ya lo he intentado pero no logro mutiplexar los dos displays ensamblo en .asm  agradeceria mucho haber si me ayudan donde esta la clave para multiplexar bien gracias.


----------



## norman sanchez (Ago 10, 2011)

displays 12 v
hola a todos estoy realizando un contador de 0-9 para comenzar ya tengo tambien el de 0-99 pero ahora necesito ponerle displays de 7 segmentos pero de 12 voltios la verdad no tengo idea de como hacer ya que el pic se alimenta con 5v quisiera pedirles la ayuda si me pudieran decir como hacerlo en este caso muchas gracia


----------



## tlaloc (May 7, 2012)

mo msmo pero con pbp


----------



## chambador666 (Jun 2, 2012)

hola soy nuevo en el área de programación y e estado luchado en hacer un contador de 0 -99 ascendente y descendente en pbp con el pic16f874A necesito ayuda por favor


----------



## D@rkbytes (Jun 3, 2012)

chambador666 dijo:


> hola soy nuevo en el área de programación y e estado luchado en hacer un contador de 0 -99 ascendente y descendente en pbp con el pic16f874A necesito ayuda por favor


Saludos chambador666
Yo realice un contador 0-99 con 2 displays de 7 segmentos CC no multiplexados.
Usando dos puertos de un 16F873A (B y C) y del puerto A, RA0 y RA1 para los pushbuttons.
El proyecto lo escribí en MicroCode Studio 5 con PBP 3.X
Pero el código puede ser usado para otro PIC y modificando los fuses por los de PBP 2.X
se puede compilar y usar el código sin problemas.

Si lo quieres hacer multiplexado, _puedes mirar por aquí._

Y para sacar la tabla de los dígitos para ánodo y cátodo común, puedes mirar por aquí.

Adjunto el código en PICBasic Pro más su simulación en ISIS.

Espero esta información te sea de utilidad.

Suerte.


----------



## chambador666 (Jun 3, 2012)

ok gracias por el aporte


----------



## erickp (Oct 23, 2013)

Hola d@rkbytes  estuve viendo tu diseño y me funciona perfectamentesolo que quisiera que cuando apague el pic y lo vuelva a encender muestre el ultimo numero que se selecciono, estaba pensando en si se puede realizar con la instruccion de read y write tu que opinas. Ojala y me puedas ayudar. Saludos 






D@rkbytes dijo:


> Saludos chambador666
> Yo realice un contador 0-99 con 2 displays de 7 segmentos CC no multiplexados.
> Usando dos puertos de un 16F873A (B y C) y del puerto A, RA0 y RA1 para los pushbuttons.
> El proyecto lo escribí en MicroCode Studio 5 con PBP 3.X
> ...


----------



## D@rkbytes (Oct 23, 2013)

erickp dijo:


> Hola d@rkbytes  estuve viendo tu diseño y me funciona perfectamente, solo que quisiera que cuando apague el pic y lo vuelva a encender muestre el último número que se selecciono, estaba pensando en si se puede realizar con la instrucción de read y write tu que opinas. Ojala y me puedas ayudar. Saludos


Claro que se puede, y para no estar escribiendo la memoria en cada conteo, puedes poner un pulsador para guardar el conteo.
Si quieres que el conteo se guarde automáticamente al apagar en circuito, _mira este ejemplo_.

Saludos.


----------



## erickp (Oct 23, 2013)

Hola, ¿por que cuando quiero modificar el programa para usar write y read, y al momento de compilar en microcode,me sale un error que dice SOURCE FILENEAME TOO LONG....
Adjunto la imagen
Por otro lado ¿solo poniendo el capacitor y un diodo me guarda el dato aunque apague la fuente, como el ejemplo que me pusiste?



D@rkbytes dijo:


> Claro que se puede, y para no estar escribiendo la memoria en cada conteo, puedes poner un pulsador para guardar el conteo.
> Si quieres que el conteo se guarde automáticamente al apagar en circuito, _mira este ejemplo_.
> 
> Saludos.


----------



## D@rkbytes (Oct 23, 2013)

erickp dijo:


> ¿por que cuando quiero modificar el programa para usar write y read, y al momento de compilar en microcode,me sale un error que dice SOURCE FILENEAME TOO LONG....


Porque estás usando MPASM para compilar y la carpeta de tu proyecto tiene una ruta muy larga.
El mensaje dice que tiene 77 caracteres de largo y que MPASM solo soporta un máximo de 62.
Coloca la carpeta de tu proyecto en otro lugar, por ejemplo en C:\ o no selecciones compilar con MPASM.


erickp dijo:


> Por otro lado ¿solo poniendo el capacitor y un diodo me guarda el dato  aunque apague la fuente, como el ejemplo que me pusiste?


Nop. Eso es parte del circuito, ve el código del ejemplo para que veas como funciona.


----------



## erickp (Oct 23, 2013)

Gracias D@rkbytes eres un genio, no se que hubiera hecho si no cambio de carpeta el archivo. Saludos




D@rkbytes dijo:


> Porque estás usando MPASM para compilar y la carpeta de tu proyecto tiene una ruta muy larga.
> El mensaje dice que tiene 77 caracteres de largo y que MPASM solo soporta un máximo de 62.
> Coloca la carpeta de tu proyecto en otro lugar, por ejemplo en C:\ o no selecciones compilar con MPASM.
> 
> Nop. Eso es parte del circuito, ve el código del ejemplo para que veas como funciona.


----------

