Buenas, tengo un problema con un reloj digital que estoy diseñando, lo estoy diseñando en C.
Es un reloj que da minutos y horas, junto con AM y PM.
Tiene que usar un único registro para Horas y otro para Minutos.
El problema me parece que lo tengo cuando hago la conversión de Dec(binario) to BCD, para mostrarlo por los puertos.
Anexo mi código base, para ver si alguien puede ayudarme.
Espero puedan ayudarme 
Es un reloj que da minutos y horas, junto con AM y PM.
Tiene que usar un único registro para Horas y otro para Minutos.
El problema me parece que lo tengo cuando hago la conversión de Dec(binario) to BCD, para mostrarlo por los puertos.
Anexo mi código base, para ver si alguien puede ayudarme.
Código:
#include <16F877a.h> /// libreria para el manejo del pic16f877a
#use delay(clock=4000000) /// declara la frecuencia del cristal
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
#byte porta = 5 // declaramos los puertos a usar
#byte portb = 6
#byte portc = 7
#byte portd = 8
#byte porte = 9
#byte tmr0 = 1
#byte status = 3
#byte option_reg = 81
#byte intcon = 0x000B
char Dec2Bcd (char decimalByte)
{
return (((decimalByte / 10) << 4) | (decimalByte % 10));
}
char minutos=0,horas=1,am=1,pm=0, minutosBCD, unidades, decenas=1, horasBCD, aux1=0;
//Función para transformar de binario(decimal) a 7 segmentos:
char Bin2_7seg(char digit){
switch (digit){
case 0: return 0x3F; //0x3F es el código 7-segmentos del 0.
case 1: return 0x06; //0x06 es el código 7-segmentos del 1.
case 2: return 0x5B;
case 3: return 0x4F;
case 4: return 0x66;
case 5: return 0x6D;
case 6: return 0x7D;
case 7: return 0x07;
case 8: return 0x7F;
case 9: return 0x67;
}
}
void SUMAR(){
if(minutos<59){
minutos++;}
if(minutos>59)
{minutos==0;
horas++;
}
if(horas>12)
{horas==0;
if(am=1){
am==0;
pm==1;
if(pm=1)
{am==1;
pm==0;}
}
}
}
void t5ms()
{
tmr0==(236);
while(tmr0<254)
{tmr0++;
}
}
void MinutosU()
{
//Transformar los minutos para su presentación: Unidad
minutosBCD=Dec2Bcd(minutos); //Transforma de binario a BCD.
unidades=0b1111&minutosBCD; //Sacar las unidades.
decenas=0b11110000&minutosBCD; //Sacar las decenas.
decenas=decenas>>4; //Desplazar 4 bits a la derecha.
PORTD=Bin2_7seg(unidades); //Unidades al puerto D.
}
void MinutosD()\
{
//Transformar los minutos para su presentación:
minutosBCD=Dec2Bcd(minutos); //Transforma de binario a BCD.
unidades=0b1111&minutosBCD; //Sacar las unidades.
decenas=0b11110000&minutosBCD; //Sacar las decenas.
decenas=decenas>>4; //Desplazar 4 bits a la derecha.
PORTD=Bin2_7seg(decenas); //Decenas al puerto D.
}
void HoraU()
{
//Transformar las horas para su presentación:
horasBCD=Dec2Bcd(horas); //Transforma de binario a BCD.
unidades=0b1111&horasBCD; //Sacar las unidades.
decenas=0b11110000&horasBCD; //Sacar las decenas.
decenas=decenas>>4; //Desplazar 4 bits a la derecha.
PORTD=Bin2_7seg(unidades); //Unidades al puerto D.
}
Void HoraD()
{
//Transformar las horas para su presentación:
horasBCD=Dec2Bcd(horas); //Transforma de binario a BCD.
unidades=0b1111&horasBCD; //Sacar las unidades.
decenas=0b11110000&horasBCD; //Sacar las decenas.
decenas=decenas>>4; //Desplazar 4 bits a la derecha.
if (decenas==1)
PORTD=Bin2_7seg(decenas); //Decenas al puerto D.
if (decenas==2)
PORTD=0x3B; //Formar el número "2".
if (decenas==0) PORTA=0; //Apagar las decenas cuando valgan cero.
}
void TIME1()
{
while(aux1<49)
{
aux1++;
}
aux1==0;
}
void PRE(){
}
void BARRIDO()
{
PIN_E0==(1); // Seleccionamos el display // Minutos > Unidad
PIN_E1==(0); // Minutos > Decena
PIN_E2==(0); // Hora > Unidad
PIN_A3==(0); // Hora > Decena
MinutosU();
t5ms();
PIN_E0==(0); // Seleccionamos el display // Minutos > Unidad
PIN_E1==(1); // Minutos > Decena
PIN_E2==(0); // Hora > Unidad
PIN_A3==(0); // Hora > Decena
MinutosD();
t5ms();
PIN_E0==(0); // Seleccionamos el display // Minutos > Unidad
PIN_E1==(0); // Minutos > Decena
PIN_E2==(1); // Hora > Unidad
PIN_A3==(0); // Hora > Decena
HoraU();
t5ms();
PIN_E0==(0); // Seleccionamos el display // Minutos > Unidad
PIN_E1==(0); // Minutos > Decena
PIN_E2==(1); // Hora > Unidad
PIN_A3==(0); // Hora > Decena
HoraD();
t5ms();
}
void main ()
{
// Los transistores estan en el puerto E y el que falta en RA3
setup_adc_ports(NO_ANALOGS);
set_tris_a(0b00100011); // RA0: Inicio o parado del reloj. RA1: Reseteo. Alarma. RA5: 2 Puntos a 1Hz
set_tris_b(0b00000001); // RB0 boton para configurar y activar alarma
set_tris_c(0b11111111); // teclado matricial
set_tris_d(0b00000000); // horas/minutos
set_tris_e(0b000);
OPTION_REG=0b01010111; //Pull ups habilitados.Timer0 como temporizador. //Prescaler asignado al Timer0. Prescaler 1:256.
INTCON=0b10010000;
while(true){
PIN_A5==(1);
TIME1();
PIN_A5==(0);
if(bit_test(porta,0))
{
SUMAR();
}
if(bit_test(porta,1))
{
minutos==0;
horas==1;
unidades==0;
decenas==1;
}
}
}
Última edición por un moderador: