Hola tengo un problema,mas bien es algo estetico..porque no me gusta como parpadean variables int32 cada vez que se actualizan sus valores..hago este calculo:
++Conta_Segundos;
MomentoActual=Conta_Segundos;
Horas=MomentoActual/SEGUNDOS_EN_UNA_HORA;
MomentoActual%=SEGUNDOS_EN_UNA_HORA; //Guarda el resto de la división entera.
Minutos=MomentoActual/SEGUNDOS_EN_UN_MINUTO;
MomentoActual%=SEGUNDOS_EN_UN_MINUTO;
Segundos=MomentoActual;
MomentoActual=1;
donde Horas,Minutos y Segundos son int16 y Conta_Segundos int32 y si esta variable supera 65536 no obtengo lo que necesito al visualizar estas variables en mi dysplay¿porque..si el resultado es siempre menor a 2 elevado a la 16? y por otro lado si declaro a Horas,Minutos y Segundos como int32 los calculos salen perfectos pero cada vez que se actualizan los resultados en pantalla parpadea y parpadea,¿tiene solución esto?,en flex_lcd cambie esta parte del código
void lcd_send_byte(int8 address, int16 n) //Originalmente es un int8.
{
output_low(LCD_RS);
#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(1);
#endif
if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);
delay_cycles(1);
#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(60);
#endif
output_low(LCD_E);
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
A la funcion send_byte le paso un int16 en vez de un int8 y por lo menos no parpadeaba con int16 pero calcula mal,dejo el codigo completo.Gracias
#include <16f877a.h>
#use delay(clock=4000000)
#fuses XT,PUT,NOPROTECT,NOWDT,NOLVP
#byte portb=6
#byte portd=8
#include <flex_lcd.c>
#define SEGUNDOS_EN_UNA_HORA 3600
#define SEGUNDOS_EN_UN_MINUTO 60
int32 Conta_Segundos=0,MomentoActual=0;
int16 Horas=0,Minutos=0,Segundos=0;
int set,FLAG_TIMER1=0;
byte last_b;
void Mi_Hora(void);
void reset(void)
{
Conta_Segundos=0;
Momentoactual=0;
}
void cambiar_hora()
{
if(set==0)
{
if(portb==176)
{
++Minutos;
if(Minutos==60){Minutos=0;}
}
}
if(set==1)
{
if(portb==176)
{
++Horas;
if(Horas==24){Horas=0;}
}
}
if(set==0)
{
if(portb==112)
{
if(Minutos==0){Minutos=60;}
--Minutos;
}
}
if(set==1)
{
if(portb==112)
{
if(Horas==0){Horas=24;}
--Horas;
}
}
}
#INT_TIMER1
timer1_rsi()
{
FLAG_TIMER1++;
if(FLAG_TIMER1==1)
{
set_timer1(6072);
// interrupcion ocurre cada 65536 * 1/(FOSC/(4*PREESCALER)=1/(4000000/(4*8))=1/125000=65536 *8µS=524.288µS
//Antes de salir reseteo el timer para temporizar otro segundo.
}
if(FLAG_TIMER1==2)
{
FLAG_TIMER1=0;
Mi_Hora(); //Pasado el segundo calculo la hora.
set_timer1(0);
}
}
// Interrupcion RB4 - RB7 /////////////////////////////////////////////////////
#INT_RB
rb_isr()
{
byte changes;
changes=last_b^portb; //XOR.
last_b=portb;
Segundos=0;
set_timer1(0);
if (bit_test(changes,5) && !bit_test(last_b,5))
{
lcd_gotoxy(6,2);
lcd_putc("..\r\r\r\r"); //Indica que se va a incrementar las horas.
delay_ms(250);
lcd_gotoxy(6,2);
lcd_putc(" ");
delay_ms(250);
lcd_gotoxy(6,2);
lcd_putc("..");
delay_ms(250);
if(set==1)
{
lcd_gotoxy(1,2);
lcd_putc(" .."); // Indica que se van a incrementar los minutos
delay_ms(250);
lcd_gotoxy(1,2);
lcd_putc(" ");
delay_ms(250);
lcd_gotoxy(1,2);
lcd_putc(" ..");
delay_ms(200);
}
set+=1;
if (set==2)
set=0;
}
if (bit_test(changes,6) && !bit_test (last_b,6)) //INCREMENTAR.
{
cambiar_hora();
Conta_Segundos=(Minutos*60)+(Horas*3600)+Segundos;
}
if (bit_test(changes,7) && !bit_test (last_b,7)) //DECREMENTAR.
{
cambiar_hora();
Conta_Segundos=(Minutos*60)+(Horas*3600)+Segundos;
}
Segundos=0;
delay_ms(30);
set_timer1(0);
//portb=0xf0;
lcd_gotoxy(6,1);
}
// Programa Principal /////////////////////////////////////////////////////////
void Mi_Hora()
{
++Conta_Segundos;
MomentoActual=Conta_Segundos;
Horas=MomentoActual/SEGUNDOS_EN_UNA_HORA;
MomentoActual%=SEGUNDOS_EN_UNA_HORA; //Guarda el resto de la división entera.
Minutos=MomentoActual/SEGUNDOS_EN_UN_MINUTO;
MomentoActual%=SEGUNDOS_EN_UN_MINUTO;
Segundos=MomentoActual;
MomentoActual=1;
if(Horas==24 && Minutos==0 && Segundos==0)
{
Horas=0;
Minutos=0;
Segundos=0;
reset();
}
}
void main(void)
{
lcd_init();
set_tris_b(0xf0);
port_b_pullups(TRUE);
portb=0xf0;
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
enable_interrupts(INT_TIMER1);
set_tris_d(0x00);
lcd_gotoxy(1,1);
lcd_putc("Reloj Digital");
delay_ms(1500);
lcd_putc("\fHora 00:00:00 ");
lcd_gotoxy(1,2);
lcd_putc(" .. ");
delay_ms(250);
lcd_gotoxy(1,2);
lcd_putc(" ");
delay_ms(250);
lcd_gotoxy(1,2);
lcd_putc(" .. ");
delay_ms(250);
set_timer1(0);
while(1)
{
lcd_gotoxy(6,1);
printf(lcd_putc,"%02ld:%02ld:%02ld",Horas,Minutos,Segundos);
}
}