TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Trev 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
-
Esta asignacion no es correcta:
string=key;
Deberia ser algo asi:
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.
-
Esta asignacion no es correcta:
string=key;
Deberia ser algo asi:
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.
-
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.
#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();
}
}