#include <16F877A.h>
#FUSES XT, NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8 )
#include <lcd.c>
#include <ds1307.c> //Libreria para reloj en tiempo real ds1307
#include <stdlib.h> //Libreria stdlib
#include <math.h> //Libreria math
#use fast_io(A)
#use fast_io(B)
#use fast_io(C) /// con esta instruccion evitamos que
#use fast_io(D) /// se este configurando cada vez que usamos
#use fast_io(E) /// alguna instruccion de entrada o salida
#byte portc = 7 /// se definen direcciones de memoria
#byte portd = 8
#BYTE TRISB = 0X86
#BYTE PORTB=0X06
#BYTE TRISA = 0X85
#BYTE PORTA=0X05
#int_RDA
char valor;
RDA_isr()
{
valor=getc;
}
int sec; //Da de alta lo senteros sec,min,hrs,day,month,yr,dow etc
int min;
int hrs;
int8 seg, seg1, seg2; //Segundos
int8 min3, min1, min2; //Minutos
int8 hrs3, hrs1, hrs2; //Horas
int8 sem, sem1, sem2; //Semanas
int8 dia, dia1, dia2; //Dias
int8 mes, mes1, mes2; //Meses
int8 a, a1, a2; //Años
int8 i,j;
void main(){ //Programa principal
TRISB=0x00;
TRISA=0xFF;
//Declara el caracter k
int8 unidad; //idk cosa del display
char data[6]; //Declara el caracter data con 6 digitos
char data2[8]; //Declara el caracter data2 con 8 dígitos
byte const DISPLAY[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
ds1307_init (); //se inicializa el ds1307
set_tris_a (0xff) ; //Declara porta como salida,d como entrada, b como entrada, c y e mixto
set_tris_d (0x00) ;
set_tris_b (0x00) ;
set_tris_c (0x04) ;
set_tris_e (0x01) ;
port_b_pullups (true) ; //Activa resistencia pull up
lcd_init (); //inicializamos lcd
enable_interrupts(int_RDA);
enable_interrupts(GLOBAL);
inicio:
data[0]=0; //Declara los valores iniciales de todas las variables en 0
data[1]=0;
data[2]=0;
data[3]=0;
data[4]=0;
data[5]=0;
data2[0]=0;
data2[1]=0;
data2[2]=0;
data2[3]=0;
data2[4]=0;
data2[5]=0;
data2[6]=0;
data2[7]=0;
seg=0, seg1=0, seg2=0;
min3=0,min1=0, min2=0;
hrs3=0,hrs1=0,hrs2=0;
sem=0, sem1=0, sem2=0;
dia=0, dia1=0, dia2=0;
mes=0, mes1=0, mes2=0;
a=0, a1=0, a2=0;
i=0, j=0;
printf(lcd_putc, "\f"); // Limpiar LCD
while (TRUE){ //Ciclo infinito
lcd_gotoxy(1,1); //Indica posicion en que se mostrara el mensaje
printf(lcd_putc, "\fInserte hr:mi:seg"); //Pide escribir la hora en la lcd
lcd_gotoxy(1,2); //Indica posicion en que se mostrara el mensaje
printf(lcd_putc, "no sale %c",valor); //Pide escribir la hora en la lcd
delay_ms(700); //Retardo 700ms
while(i<=5){ //Mientras i es menor o igual a 5
valor=getc(); // Lee el teclado
data[i]=valor; // Valor data[i]= caracter introducido por teclado
i++; // Incrementar i
lcd_gotoxy(1,1); //Indica posicion donde se mostrara el mensaje
printf(lcd_putc, "Inserte hra:mi:seg"); //Pide escribir la hora
lcd_gotoxy(1,2); //Indica la posicion donde se mostrara el mensaje
printf(lcd_putc,"%c%c:%c%c:%c%c",data[0],data[1],data[2],data[3],data[4],data[5]); //Muesta la hora segun lo seleccionado en el teclado
delay_ms(500); //Retardo 500 ms
}
////////////////////////////////////Lo mismo para la fecha, solo ultiliza los valores en data2 y con j
delay_ms(700);
hrs1= data[0] - 48; // Convertir data[0] de ASCII a valor numérico
hrs2= data[1] - 48; // Convertir data[1] de ASCII a valor numérico
min1= data[2] - 48; // Convertir data[2] de ASCII a valor numérico
min2= data[3] - 48; // Convertir data[0] de ASCII a valor numérico
seg1= data[4] - 48;
seg2= data[5] - 48;
hrs3= ((hrs1*10)+ hrs2); //Convierte los numeros individuales en su valor combinado, es decir al teclear 12 son valores separados 1,2 no 12 aqui hacemos q 1,2 sea 12
min3= ((min1*10)+ min2);
seg= ((seg1*10)+ seg2);
printf(lcd_putc, "\f"); //Borra lo mostrado en la lcd
////////////////////////////////////////////////////////////////////////////////
ds1307_set_date_time (dia, mes , a, sem, hrs3, min3 , seg); // Guarda en el reloj la hora que se establece con el teclado
WHILE (1){ //Ciclo infinito
delay_ms (100) ; //Retardo 100ms
ds1307_get_time (hrs, min, sec); //se obtiene la hora
lcd_gotoxy (1, 2) ; //Indica la posicion donde se mostrara el mensaje
printf (lcd_putc, " %02d:%02d:%02d ", hrs,min,sec); ///se despliegan los datos
PORTB=DISPLAY[unidad];
delay_ms(50);
PORTA=0b011111;
unidad=hrs1; //hora 1 en display izquierda
delay_ms(50);
PORTA=0b101111;
unidad=hrs2;//hora 2 en display derecha
delay_ms(50);
PORTA=0b110111;https://www.forosdeelectronica.com/threads/reloj-con-ds1307-no-arranca-en-la-pr%C3%A1ctica.79541/page-6
unidad=min1;//min1 en display izquierda
delay_ms(50);
PORTA=0b111011;
unidad=min2;//min2 en display derecha
delay_ms(50);
PORTA=0b111101;
unidad=seg1;//seg 1 en display izquierda
delay_ms(50);
PORTA=0b111110;
unidad=seg2;//seg 2 en display derecha
delay_ms(50);
}
}
}