Autor Tema: Ayuda con reloj y LCD  (Leído 1603 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Ayuda con reloj y LCD
« en: 05 de Septiembre de 2009, 19:02:12 »
Hola..tengo un código que es una tentativa de reloj pero me falta ponerlo en hora y para eso quiero usar un teclado,la cuestion es que he intentado setearle los minutos usando atoi() pero solo consigo resetearlo y no logro que imprima las teclas pulsadas como si no modificara la variable q le paso por referencia a la función Programa_hora(),aca dejo mi código



#include <16f877a.h>
#use delay(clock=4000000,XT)
#fuses PUT,NOPROTECT,NOWDT,NOLVP
#byte portb=6
#byte portd=8
#include <flex_lcd.c>
#include <stdlib.h>
#include <keypad.c>

#define SEGUNDOS_EN_UNA_HORA 3600
#define SEGUNDOS_EN_UN_MINUTO 60

unsigned char key;   
unsigned char string[6];
int32 select,Conta_Segundos,MomentoActual;
int i,b,Horas,Minutos,Segundos;

void Programa_hora(int *a)
{
   string=key;
   *a=atoi(string);
           lcd_gotoxy(1,1);
           printf(lcd_putc,"%d",*a);
           // Imprimimos la Tecla pulsada
}

// Interrupcion RB4 - RB7 /////////////////////////////////////////////////////
#INT_RB
void interrupt_keypad()               
{
   while(select<2)
   {
   key= read_keypad();
   Programa_hora(&Minutos);
   i++;
   b=i;                     
   select++;
   }
   Minutos=atoi(string);
   Conta_Segundos=Minutos*60;
   MomentoActual=Conta_Segundos;
   select=0;
   //clear_interrupt(INT_RB);   //Limpia bandera RBIF
   portb=0x00;
}
// 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;
      }
       
void  main(void)
      {
      init_keypad();
      lcd_init();
      set_tris_d(0x00);
      lcd_gotoxy(1,1);
      lcd_putc("Reloj Digital");
      delay_ms(1500);
      lcd_putc("\fHora ");
         while(1)
         {
         lcd_gotoxy(6,1);
         printf(lcd_putc,"%02d:%02d:%02d",Horas,Minutos,Segundos);
         delay_ms(1000);
         Mi_Hora();     
         }
       }
       
       
       
       
       
       

Gracias

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Ayuda con reloj y LCD
« Respuesta #1 en: 06 de Septiembre de 2009, 09:48:57 »
Esta asignacion no es correcta:

string=key;

Deberia ser algo asi:
Código: C
  1. string[indice]=key;

Antes de entrar a este bucle

while(select<2)
   {

Deberias asegurarte que select, i y b valen cero. Parece que el valor de i esta indeterminado.

@fabianjsm is on twitter

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Ayuda con reloj y LCD
« Respuesta #2 en: 06 de Septiembre de 2009, 09:50:18 »
Esta asignacion no es correcta:

string=key;

Deberia ser algo asi:

Código: C
  1. string[indice]=key;

Antes de entrar a este bucle

while(select<2)
   {

Deberias asegurarte que select, i y b valen cero. Parece que el valor de i esta indeterminado.
@fabianjsm is on twitter

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Ayuda con reloj y LCD
« Respuesta #3 en: 07 de Septiembre de 2009, 21:55:55 »
Hola  :) aca dejo lo que consegui hasta ahora reemplace el teclado por pulsadores,sigo usando int rb,le quise agregar un pulsador de decremento pero me tira valores erraticos..,uso dos pulsadores ahora:uno para setear horas y minutos y otro para incrementar esas variables,pero la verdad cuando le quise agregar un pulsador mas para decrementarlas falla bastante si me pueden ayudar,Gracias.

Código: [Seleccionar]
#include <16f877a.h>
#use delay(clock=4000000,XT)
#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;
int32 Horas=0,Minutos=0,Segundos=0;
int set;
byte last_b;

void Mi_Hora(void);

void reset(void)
{
Conta_Segundos=-1;
Momentoactual=0;
}

// Interrupcion RB4 - RB7 /////////////////////////////////////////////////////
#INT_RB
rb_isr()
{
    byte changes;
    changes=last_b^portb;       //XOR.
    last_b=portb;
    if (bit_test(changes,5) && !bit_test(last_b,5))
    {
                                                       //SET.
         //reset();
         lcd_gotoxy(6,2);
         lcd_putc("..   ");    //Indica que se va a incrementar las horas.
         if(set==1)
         {
         lcd_gotoxy(1,2);
         lcd_putc("        ..");   // Indica que se van a incrementar los minutos
         }
         set+=1;
         if (set==2)
         set=0;
         //printf(lcd_putc,"\fHora\nSE PULSO B4");   
    }
    if (bit_test(changes,6) && !bit_test (last_b,6))   //INCREMENTAR.
    {
   
         if(set==0)
         {
         reset();
         Minutos+=1;
         if(Minutos==60)
         Minutos=0;
         Conta_Segundos=(Minutos*60)+(Horas*3600)+Segundos;
         }
         if(set==1)
         {
         Horas+=1;
         if(Horas==24)
         Horas=0;
         Conta_Segundos=(Minutos*60)+(Horas*3600)+Segundos;
         } 
    }
//    if (bit_test(changes,7) && !bit_test (last_b,7))   //DECREMENTAR.
//    {
//         if(set==0)
//         {
//         reset();
//         if(Minutos==0)
//         Minutos=60;
//         Minutos-=1;
//         Conta_Segundos=(Minutos*60)+(Horas*3600)+Segundos;
//         }
//         if(set==1)
//         {
//        if(Horas==0)
//         Horas=24;
//         Horas-=1;
//         Conta_Segundos=(Minutos*60)+(Horas*3600)+Segundos;
//         }         
    lcd_gotoxy(6,1);
    portb=0xf0;
}


// 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;
      }
       
void  main(void)
      {
      lcd_init();
      set_tris_b(0xf0);
      port_b_pullups(TRUE);
      portb=0xf0;
      enable_interrupts(GLOBAL);
      enable_interrupts(INT_RB);
      set_tris_d(0x00);
      lcd_gotoxy(1,1);
      lcd_putc("Reloj Digital");
      delay_ms(1500);
      lcd_putc("\fHora ");
      lcd_gotoxy(1,2);
      lcd_putc("        ..");
         while(1)
         {
         lcd_gotoxy(6,1);
         printf(lcd_putc,"%02ld:%02ld:%02ld",Horas,Minutos,Segundos);
         delay_ms(1000);
         Mi_Hora();     
         }
       }
       
       
       
       
       
       


 

anything