Contador binario con display doble en c usando css pic c

Tengo un problema con este programa necesito hacer que cuente desde el cero hasta 99 y del 99 hasta el cero que con a0 incremente++ y con a1 decremente-- me pueden ayudar esto es lo que tengo hasta ahora.
Código:
#include <16F84A.h>
#fuses NOWDT,XT,NOPUT,NOPROTECT
#use FAST_IO(A)
#use FAST_IO(B)
#use delay(clock=4000000)

   void unidec(con)
   {
      int8 uni=0,dec=0;
    uni=con;
   while (con>9){con=-10;dec++;}
  
   output_b(uni);output_high(pin_b6);delay_us(5);
   output_b(dec);output_high(pin_b7);delay_us(5);
   }

void main()
{
   Set_tris_a(0b00011111);
   Set_tris_b(0b00000000);
   int8 con=0;
   output_b(0b11000000);

{
if(input(pin_a0))
while(input(pin_a0)); 
con++;
unidec(con);
if(con>98) 
con=0; 

if(input(pin_a1))
while(input(pin_a1)); 
con--;
unidec(con);
if(con<0) 
con=99; 
}
}
}
 
Última edición por un moderador:
Creo que queda así
Código:
#include <16F84A.h>
#fuses NOWDT,XT,NOPUT,NOPROTECT
#use FAST_IO(A)
#use FAST_IO(B)
#use delay(clock=4000000)


   void unidec(int8 con)
   {
    int8 dec, uni;
    //no estoy seguro de si el PIC soporta estas operaciones, espero que el compilador las resuelva
    dec = con / 10;    //divides el contador en 10 y obtienes las decenas
    uni = con % 10;    //Obtienes el modulo 10 y te quedan las unidades 
   output_b(uni);output_high(pin_b6);delay_us(5);
   output_b(dec);output_high(pin_b7);delay_us(5);
   }

void main()
{
   Set_tris_a(0b00011111);
   Set_tris_b(0b00000000);
   int8 con=0;
   output_b(0b11000000);

   while(1){ //supongo que falto esto
      if(input(pin_a0)){   //¿estas usando resistencia Pull-Down?
         con++;
         if(con >  99){ 
             con=0; 
         }
         unidec(con);
      }
      if(input(pin_a1)){
         con--;
         if(con < 0){
            con=99; 
         }
         unidec(con);
      }
   }
}
Había corchetes que faltaban y un bucle infinito para el código principal, ademas ejecuta la decodificación después del if o intentará decodificar 100 0 -1 sin darse cuenta de que excedió el rango.

Se me olvidaba, en esta configuración por el if para comprobar los pines estas usando Activo=Alto, seria con resistencias pull-down y pulsadores a VDD, o de lo contrario invierte el valor para usar las pull-down, si no al estar los dos arriba va a estar sumando y restando en cada momento.
 
Última edición:
Lo que quiero es crear un anti-rebote para que marque solo una señol por pulsacion del push
dejo mi hardware para que me entiendan mejor.
 

Adjuntos

  • PIC16F84A TEK TORRES.rar
    17.1 KB · Visitas: 64
Disculpa pero no uso proteus, ademas voy de viaje con una netbook por lo que tampoco tengo algo para experimentar, este código que puse soluciona lo que dijiste, pero tiene el detalle de que al presionar la secuencia es tan rápida que le da varios avances al numero antes de que sueltes el botón, mi recomendación seria esperar como usando un while(input(pin_a1)){delay(algunos ms);} antes de con++ y con--, con eso el programa esperaría hasta que se suelte el pulsador para continuar la ejecución, es una idea que se me acaba de ocurrir, prueba si te sirve.
 
Quisiera que me pudieren ayudar en la programación de un contador estoy usando un PIC16F84, dos displays, dos decodificadores 7447 y un sensor óptico, el MOC70T3.
Lo que quiero que haga es que cuando pases algo por el sensor óptico cuente y si vuelvo a pasar cuente de nuevo y así sucesivamente hasta el 99.

Aquí tengo algo del programa:
A ver si me podrían guiar.
Código:
void main() {
int u,d;
unsigned  short datou=0b00000000;
unsigned  short datod=0b00000000;

TRISB = 0b00000000;
TRISA =0b00000;
PORTA =0;
PORTB =0;
 for (d=0;d<=10;d++)
{      
    datou=0;
    for(u=0;u<=10;u++)
    {
        PortB=datou+datod;
      delay_ms(600);
       datou=datou+0b00000001;

      }
     datod=datod+0b00010000;

 }
}
 
Última edición por un moderador:
Quisiera que me pudieren ayudar en la programación de un contador estoy usando un PIC16F84, dos displays, dos decodificadores 7447 y un sensor óptico, el MOC70T3.
Lo que quiero que haga es que cuando pases algo por el sensor óptico cuente y si vuelvo a pasar cuente de nuevo y así sucesivamente hasta el 99.
Si vas a usar un microcontrolador, puedes controlar los 2 displays o más directamente sin usar los 7447,
pero debes usar un método para multiplexar los displays y realizar la visualización del conteo.

Puedes usar la interrupción por desborde del TMR0 para cargar los displays y generar la conmutación.
El conteo lo puedes realizar en el programa principal para que no afecte la visualización.

La rutina de conteo debe ser de tal forma que sólo cuente una vez el paso de un objeto.

Algo así:
#int_timer0
void tmr0_isr (void)
{
muestro_unidades;
retardo;
apago_display_unidades;
activo_display_decenas;
muestro_decenas;
retardo;
apago_display_decenas;
activo_display_unidades;
}

Y para el conteo por activación H To L:

while(!input(pin_xx))
{
conteo++;
obtener_unidades;
obtener_decenas;
while(!input(pin_xx));
}

Para hacerlo de la forma que te menciono necesitas crear una tabla de conversión a 7 segmentos.

Saludos.
 
hola
amigos, yo estoy trabajando en lo mismo, pero en mi caso tengo que hacerlo 2 veces, me explico:

tengo que hacer dos contadores del 0 al 99, con 4 display de 7 segmentos

pulsador 1 , cuenta del 0 al 99 con display 1-2
pulsador 2 , cuenta del 0 al 99 con display 3-4

tengo este avance, pero se queda pegado y solo pude configurar un pulsador,,, alguien me podria decir como puedo incluir otro pulsador
PHP:
    #include <16f628A.H>
    #fuses NOMCLR
    #fuses INTRC_IO
    #FUSES NOWDT                    //No Watch Dog Timer
    //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
    #FUSES NOPUT                    //No Power Up Timer
    #FUSES NOPROTECT                //Code not protected from reading
    #FUSES NOBROWNOUT               //No brownout reset
    #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD                    //No EE protection
    #FUSES RESERVED                 //Used to set the reserved FUSE bits
    #use delay (clock=8000000)
    #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
    #define display_1     PIN_B6
    #define display_2     PIN_B5 // ok
    #define display_3     PIN_B4
    #define display_4     PIN_B7
    

    int8 unidades,decenas,uni,dec;                     //Variables de conteo
    void alarma(void);   
    // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
    int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
    int tiempo = 20;
    
  
   void visualiza()
 {
   
   output_a(Numeros[decenas]);
   output_b(0x53);
   delay_ms(1);
   output_a(Numeros[unidades]);
   output_b(0xA3);
   delay_ms(1);   

}

void teclas(){ 

  if(!input(pin_b0)){                     //Esta cerrado el pulsador?
    delay_ms(5);                          //Si, elimina rebotes
    unidades++;                           //incrementa unidades
    if (unidades>9){                      //hasta que sea 9
      unidades=0;                         //borra unidades e
      decenas++;                          //incrementa las decenas
        if(decenas>9){                    //hasta 9
          decenas=0;                      //borra las decenas
        }
    }
  }
  while (input(pin_b0)==0){           //Espera visualizando datos
  visualiza();                            //mientras la tecla esta presionada
  }
     
     }



void main(void){                          //Programa principal

output_low(display_1);//RA0 y RA1 entradas
output_low(display_2);
output_low(display_3);
output_low(display_4);
disable_interrupts(GLOBAL);               //activadas interrupciones 
enable_interrupts(INT_RDA);   //Activa interrupción en la recepción
do{                                       //bucle...
     visualiza();                         //visualiza datos
     teclas(); 
     //verifica estado de teclas
}while(TRUE);                             //...infinito 
}
 
Algo asi para que tengan una idea es mas facil:

Código:
//devuelve 1 si se pulso la tecla 1 y 2 si se pulso la 2
int EsperarPulso(){
  while(1){
     if( input(pin_b0) ){  //la tecla esta presionada
       delay_ms(5); //esperar algun tiempo a ver si sigue presionada
       if( input(pin_b0) ){//siguio presionada
          while( input(pin_b0) ); //espera hasta que la suelte
          return(1); //todo bien ahora salirse 
       } 
     }

     if( input(pin_b1) ){  //la tecla esta presionada
       delay_ms(5); //esperar algun tiempo a ver si sigue presionada
       if( input(pin_b1) ){//siguio presionada
          while( input(pin_b1) ); //espera hasta que la suelte
          return(2); //todo bien ahora salirse 
       } 
     }

  }
}

void main(){
   while(1){
       Tecla = EsperarPulso();
       if(Tecla == 1){ Contador1++; }
       if(Tecla == 2){ Contador2++; }
       //aqui actualizar el displays
       Decenas = Contador1 / 10; 
       Unidades = Contador1-(Decenas*10);
       //---------echense aqui el codigo para desplegar el valor 1
       Decenas = Contador2 / 10; 
       Unidades = Contador2-(Decenas*10);
       //---------echense aqui el codigo para desplegar el valor 2

   }
}
 
Atrás
Arriba