Descargar

Reloj con ds1307 tiempo real con pic

Enviado por JUAN CARLOS LIZCANO


    edu.red

    ///////////////////// PROGRAMA QUE UTILZA EL I.C. DS1307 PARA GENERAR LA //////////////////////////

    //////////HORA EN TIEMPO REAL A TRAVES DE UNA LCD DE 2 POR 16 CARACTERES POR MEDIO DE UN PIC/////

    #include /// libreria para el manejo del pic16f873a

    #use delay(clock=8000000) /// declara la frecuencia del cristal a 8 MHZ

    #fuses HS,NOWDT,noPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT

    #include

    #include //libreria para la lcd de 2×16,(la de 4×16 es la libreria llamada lcd.c)

    #use fast_io(A)

    #use fast_io(B)

    #byte portc = 7 /// se definen direcciones de memoria

    #byte porta = 5

    #byte portb = 6

    // variables utilizadas en el programa…

    int sec;

    int min;

    int hrs;

    int day;

    int month;

    int yr;

    int dow;

    int datosec=1;

    int datomin;

    int datohrs;

    int datoday=1;

    int datomonth=1;

    int datoyr=14;

    int datodow=0;

    int horap;

    int horap1;

    void funcion_controldow(void){ //FUNCION CONTROL DIA DE LA SEMANA

    if(dow>7){

    dow=1;}

    }

    void funcion_fecha4(void){ //FUNCION DIA DE LA SEMANA

    volver7:

    if((bit_test(porta,5)==0)&&(bit_test(porta,0)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el dia de la semana d/s.reloj detenido

    dow++;

    funcion_controldow();

    delay_ms(100);

    switch (dow){

    case 1:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"LUN.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    case 2:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"MAR.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    case 3:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"MIE.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    case 4:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"JUE.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    case 5:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"VIE.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    case 6:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"SAB.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    case 7:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"DOM.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    default:break;

    }

    goto volver7;

    }

    }

    void funcion_alarma(void){ //FUNCION ALARMA DE LA HORA EN PUNTO

    if((min==0)&&(sec==0)){

    lcd_putc( "f" );

    lcd_gotoxy(1,1);

    printf(lcd_putc," Hora * Exacta " ); ///se despliegan los datos en pantalla y suena la alarma de aprox.1seg.

    lcd_gotoxy(1,2);

    printf(lcd_putc," Systeltronik@. ");

    output_high(pin_b3);

    }

    else

    output_low(pin_b3);}

    void funcion_control1(void){//control para la fecha

    if(day>31){

    day=1;}

    if(month>12){

    month=1;}

    if(yr>49){

    yr=12;}

    }

    void funcion_fecha1(void){ //FUNCION FECHA

    volver3:

    if((bit_test(porta,0)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar la fecha.dia.reloj detenido

    day++;

    funcion_control1();

    lcd_gotoxy(6,1);

    printf(lcd_putc,"%02d/%02d/20%02d ",day,month,yr);

    lcd_gotoxy(1,2);

    printf(lcd_putc,"Dia+ ");

    delay_ms(450);

    goto volver3;

    }

    }

    void funcion_fecha2(void){

    volver4:

    if((bit_test(porta,1)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,0)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.Mes.reloj detenido

    month++;

    funcion_control1();

    lcd_gotoxy(6,1);

    printf(lcd_putc,"%02d/%02d/20%02d ",day,month,yr);

    lcd_gotoxy(1,2);

    printf(lcd_putc,"Mes+ ");

    delay_ms(450);

    goto volver4;

    }

    }

    void funcion_fecha3(void){

    volver5:

    if((bit_test(porta,2)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,0)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.Year.reloj detenido

    yr++;

    funcion_control1();

    lcd_gotoxy(6,1);

    printf(lcd_putc,"%02d/%02d/20%02d ",day,month,yr);

    lcd_gotoxy(1,2);

    printf(lcd_putc,"yrs+ ");

    delay_ms(250);

    goto volver5;

    }

    }

    void funcion_control(void){

    if(hrs>23){

    hrs=0;}

    if(min>59){

    min=0;}

    if(sec>59){

    sec=0;}

    }

    void funcion_reloj1(void) { //FUNCION HORA

    volver:

    if((bit_test(porta,0)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.hora.reloj detenido

    hrs++;

    funcion_control();

    lcd_gotoxy(1,2);

    printf(lcd_putc,"Hrs+ %02d:%02d:%02d ",hrs,min,sec);

    delay_ms(450);

    goto volver;

    }

    }

    void funcion_reloj2(void) {

    volver1:

    if((bit_test(porta,1)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,0)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.Minutos.reloj detenido

    min++;

    funcion_control();

    lcd_gotoxy(1,2);

    printf(lcd_putc,"Min+ %02d:%02d:%02d ",hrs,min,sec);

    delay_ms(450);

    goto volver1;

    }

    }

    void funcion_reloj3(void) {

    volver2:

    if((bit_test(porta,2)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,0)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.segundos.reloj detenido

    sec++;

    funcion_control();

    lcd_gotoxy(1,2);

    printf(lcd_putc,"Seg+ %02d:%02d:%02d ",hrs,min,sec);

    delay_ms(350);

    goto volver2;

    }

    }

    void formato_12h24h(void){ //FUNCION MOSTRAR DATOS EN FORMATO 12H O 24H

    if((bit_test(porta,3)==1)&&(bit_test(porta,5)==0)&&(bit_test(porta,4)==1)){//si se cumplen estas condiciones en los swiches se puede alternar exibir la hora en formato 12h o 24h.No se detiene el reloj

    if(hrs==0){

    datohrs=hrs+12;

    lcd_gotoxy(1,2);

    printf(lcd_putc,"12h. %02d:%02d:%02d AM ",datohrs,min,sec);

    }

    else{

    if(datohrs>12){

    datohrs=datohrs-12;

    lcd_gotoxy(1,2);

    printf(lcd_putc,"12h. %02d:%02d:%02d PM ",datohrs,min,sec);}

    else{

    if(hrs<12){

    lcd_gotoxy(1,2);

    printf(lcd_putc,"12h. %02d:%02d:%02d AM ",hrs,min,sec); }

    else{

    if(hrs==12){

    datohrs=hrs;

    lcd_gotoxy(1,2);

    printf(lcd_putc,"12h. %02d:%02d:%02d PM ",datohrs,min,sec);}

    }

    }

    }

    }

    else{

    lcd_gotoxy(1,2);

    printf(lcd_putc,"24h. %02d:%02d:%02d ",hrs,min,sec); }

    }

    ///////////////////////////////////////////////////////////////////////////////////

    ////////////////////// PROGRAMA PPAL//////////////////////////////////////////

    ///////////////////////////////////////////////////////////////////////////////////

    void main()

    {

    ds1307_init(); ///INICIO ds1307

    ds1307_get_date(day,month,yr,dow); /// se obtiene la fecha DEL DS1307

    ds1307_get_time(hrs,min,sec); /// se obtiene la hora DEL DS 1307

    datohrs=hrs;

    datomin=min;

    datosec=sec;

    datoday=day;

    datomonth=month;

    datoyr=yr;

    datodow=dow;

    set_tris_a(0b11111111);

    set_tris_b(0x00);

    port_b_pullups(true);

    lcd_init(); //INICIO DE LA LCD 2X16

    programado:

    ds1307_set_date_time(day,month,yr,dow,hrs,min,sec); /// se escribe en el DS1307 el tiempo configurado

    while(1)

    {

    delay_ms(100);

    ds1307_get_date(day,month,yr,dow); /// se obtiene la fecha para mostrar

    ds1307_get_time(hrs,min,sec); /// se obtiene la hora para mostrar

    datohrs=hrs;

    datomin=min;

    datosec=sec;

    formato_12h24h();

    switch (dow){ //RUTINA QUE MUESTRA EL DIA DE LA SEMANA de acuerdo al dato dow

    case 1:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"LUN. ");

    break;

    case 2:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"MAR. ");

    break;

    case 3:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"MIE. ");

    break;

    case 4:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"JUE. ");

    break;

    case 5:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"VIE. ");

    break;

    case 6:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"SAB. ");

    break;

    case 7:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"DOM. ");

    break;

    default:break;

    }

    lcd_gotoxy(6,1);

    printf(lcd_putc,"%02d/%02d/20%02d ",day,month,yr);// se muestra en pantalla la fecha actualizada

    datoday=day;

    datomonth=month;

    datoyr=yr;

    datodow=dow;

    funcion_alarma();

    if((bit_test(porta,3)==0)&&(bit_test(porta,4)==1)&&(bit_test(porta,5)==1)){ //si se cumplen estas condiciones en los swiches se puede alterar los datos del reloj.se detiene el reloj

    horap++;

    output_low(pin_c1);

    output_high(pin_c0);

    delay_ms(100);

    switch (horap){

    case 1:

    funcion_reloj1();

    goto programado;

    break;

    case 2:

    funcion_reloj2();

    goto programado;

    break;

    case 3:

    funcion_reloj3();

    goto programado;

    break;

    case 4:

    horap=0;

    break;

    default:break;

    }

    }

    else{

    if((bit_test(porta,4)==0)&&(bit_test(porta,3)==1)){ //si se cumplen estas condiciones en los swiches se puede alterar los datos de la fecha.se detiene el reloj

    horap1++;

    output_low(pin_c0);

    output_high(pin_c1);

    delay_ms(100);

    switch (horap1){

    case 1:

    funcion_fecha1();

    goto programado;

    break;

    case 2:

    funcion_fecha2();

    goto programado;

    break;

    case 3:

    funcion_fecha3();

    goto programado;

    break;

    case 4:

    funcion_fecha4();

    goto programado;

    break;

    case 5:

    horap1=0;

    break;

    default:break;

    }

    }

    }

    output_low(pin_c0);// se apaga el led indicador de entrada de datos para el reloj y el reloj corre normal…

    output_low(pin_c1);// se apaga el led indicador de entrada de datos para la fecha y el reloj corre normal…

    }

    }

    ESTE ES UNA VISTA DEL PROGRAMA PROBADO EN ISIS PROTEUS:

    edu.red

     

     

     

    Autor:

    Juan Carlos Lizcano