Reloj Binario con Microcontrolador PIC 16f877a

#1
Hola, estoy haciendo un reloj binario con un microcontrolador PIC. El reloj expresará la hora en código binario a continuacion inserto el diagrama en ISIS


y el código que se me viene a la mente es este:

Código:
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#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 NOWRT                    //Program memory not write protected

#use delay(clock=20000000)

void main()
{

int horas, minutos, segundero;


set_tris_b(0);  // Solo para limpiar las salidas
set_tris_c(0);
output_b(0x00);
output_c(0x00);

while(true){

   for(horas=1;horas<=12;horas++) {  // empieza el ciclo para contar las horas transcurridas
   
     for(minutos=0;minutos<60;minutos++){ // empieza el ciclo para los minutos
     output_c(minutos);  
     delay_ms(1000);  //un retardo de un segundo
     }
      
      switch(horas) {   // se evalua la variable horas y dependiendo de su valor sera la salida
         case 1: output_high(pin_b0);
               break;                 
         case 2:output_high(pin_b1);  
               break;
         case 3:output_high(pin_b0);  // esta parte es la del problema
                  output_high(pin_b1);
               break;
         case 4:output_high(pin_b2);
               break;
         case 5:output_high(pin_b0);
                output_high(pin_b2);
               break;
         case 6:output_high(pin_b1);
                output_high(pin_b2);
               break;
         case 7:output_high(pin_b0);
                output_high(pin_b1);
                output_high(pin_b2);
               break;
         case 8:output_high(pin_b4);              
               break;
         case 9:output_high(pin_b0);
                output_high(pin_b4);
               break;
         case 10:output_high(pin_b1);
                 output_high(pin_b4);
               break;
         case 11:output_high(pin_b0);
                  output_high(pin_b1);
                  output_high(pin_b4);
               break;
         case 12:output_high(pin_b3);
                  output_high(pin_b4);
               break;
            
     }
     }
   

}

}
Bien pues, aparentemente todo está bien, sin embargo cuando llega a la hora 3 es decir 0011 en binario solo se pone la salida del puerto b como 0010. ¿Cómo puedo lograr que se mantenga en alto una salida? Es decir que si yo activé el pin B0 un ciclo atrás, que en el siguiente ciclo permanesca encendido y se encienda el pin B1 solamente sin afectar el B0.

Tambien se me habia ocurrido imprimir el valor de la variable horas justo como lo hice con "minutos" pero el problema es que debía mantenerlo encendido y en el compilador CSS que es el que uso, no encontré alguna funcion que me permita imprimir algo(por asi decirlo) y mantenerlo hasta que decida imprimir otra cosa.

De antemano muchas gracias
 
#2
Que tal:
No seria más fácil poner la variable horas directamente en el PORTB?, no entiendo porque usas el switch y activas individualmente cada pin del PORTB...
El conteo es totalmente en binario y lo único que hace es copiar el valor de las variables (minuto y hora) y pegarlo en los PORTx (son también registros, que son también variables que mantienen el dato)...

saludos
 
#4
El tipo de las variables cambia a char o int8 ya que int es mayor de 8 bits. Use este code y me fucniona.

Código:
#use fast_io(b)
#use fast_io(c)

char hora, minuto;

//---
void main()
{
   set_tris_b(0);
   set_tris_c(0);
   output_b(0);
   output_c(0);
      
   while(TRUE){   
      for(hora=0 ; hora<=12 ; hora++){
         output_b(hora);
         for(minuto=0 ; minuto<60 ; minuto++){
            output_c(minuto);
            delay_ms(1000);
         }
      }
   }
}
 

Temas similares

Arriba