problemas al simular en proteus para un contador de 0 a 999 programacion

hola ps es que tengo una problema el pic que manejo es 16f876

aqui esta la programacion

#include <16f876.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);
}
}




aqui les dejo la imagen :confused::confused:
 
Última edición:
Hay dos tipos de display (ánodo común y cátodo común), usa el adecuado. Luego si solo estás probando vas bien pero si vas a mostrar números en los display tienes que convertir el conteo a un valor que se pueda representar en los display. Finalmente, el proteus no es bueno para simular animaciones o efectos como el multiplexado (hace muchos cálculos internos para el tiempo y usa bastante el CPU), para analizar eso mejor usa un ploter o simula paso a paso tu programa.

PD: Como una sugerencia usa la etiqueta
Código:
 para postear tu código ya que así ocupa mucho espacio.

Un saludo.
 
La manera en que el 876 está manejando el display es cualquier cosa menos lo que necesita ese display.

Estás poniendo en portb un dato BCD en lugar de codificado a 7seg.
Porta tiene que barrer continuamente los 4 dig, no lo que estás haciendo.
 
Última edición:
Leyenda:

porque no haces lo que te suguiere el compañero Eduardo de poner un codificador BCD de 7 segmentos tiene que ser asi como lo tienes,,, ????
 
Mmmmmm.. Maaaaaas trabajo... deja practico mi C Jejeje....
No te garantizo nada :D

Ya logre poner los numeros.... :LOL:

Mira para poner los numeros utiliza este codigo intenta hacerlo tu... yo continuo...
Código:
#include <16F876.h>
#use  delay (clock=4000000)
#byte porta=0x05
#byte portb=0x06

Void Numero(int num)
{
 switch(num)
 {
  case 0:portb=192;
         break;
  case 1:portb=249;
         break;
  case 2:portb=164;
         break;
  case 3:portb=176;
         break;
  case 4:portb=153;
         break;
  case 5:portb=146;
         break;
  case 6:portb=130;
         break;
  case 7:portb=248;
         break;
  case 8:portb=128;
         break;
  case 9:portb=152;
         break;         
 }
}

void main()
{
 set_tris_a(0);
 set_tris_b(0);
 portb=0;
 porta=2; <-este es el digito a desplegar...

 while(1)
 {
  Numero(8); <---aqui pones el numero a desplegar
 } 
}

mira este codigo...
Código:
#include <16F876.h>
#use  delay (clock=4000000)
#byte porta=0x05
#byte portb=0x06

Void Numero(int num)
{
 switch(num)
 {
  case 0:portb=192;
         break;
  case 1:portb=249;
         break;
  case 2:portb=164;
         break;
  case 3:portb=176;
         break;
  case 4:portb=153;
         break;
  case 5:portb=146;
         break;
  case 6:portb=130;
         break;
  case 7:portb=248;
         break;
  case 8:portb=128;
         break;
  case 9:portb=152;
         break;         
 }
}

void main()
{
 int j;
 int k;
 set_tris_a(0);
 set_tris_b(0);
 portb=0;
 porta=2; 

 while(1)
 {
  for(J=0;j<=9999;j++)
  {
  
   for (k=0;k<=3;k++)
   {
    switch (k)
    {
     case 0:porta=0;
            numero(j/1000); <---no me acuerdo como se pone el entero osea j/1000 para sacar el digito...
            break;
     case 1:porta=2;
            numero(j/100);<-igual aqui pero entre 100
            break;
     case 2:porta=4;
            numero(j/10); <-igual aqui pero enttre 10
            break;
     case 3:porta=8; <-igual aqui pero el primero
            numero(j/1);
            break;
    }
    delay_ms(1000);

   }
  }
 } 
}

pero por ahi va la idea...
 
Última edición:
Atrás
Arriba