Autor Tema: Problema al visualizar una variable int32 en el LCD  (Leído 2043 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Problema al visualizar una variable int32 en el LCD
« en: 17 de Septiembre de 2009, 01:41:03 »
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:
Código: [Seleccionar]
++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
Código: [Seleccionar]
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
Código: [Seleccionar]
#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);     
         }
       }
       
       
       
       
       
       
       
       
       
       
       
       

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Problema al visualizar una variable int32 en el LCD
« Respuesta #1 en: 18 de Octubre de 2015, 10:28:10 »
Hola Trev %ld deberia funcionar con int 16 No se que implica %02ld esto solo lo e hecho con float Te paso esta tabla espero que te sirva