Programa y esquema de reloj electrónico inteligente utilizando ds1302 y funciones clave de tubo digital o pantalla LCD
#include "intrins.h"
#define set_sec(x) (ds1302_write(0x80,x))//Definición de macro, escribir segundos de reloj
#define get_sec() (ds1302_read(0x81)) //Macro, leer segundos del reloj
#define set_min(x) (ds1302_write(0x82, x)) //Macro, el valor mínimo del reloj de escritura
#define get_min() (ds1302_read(0x83)) //Macro, el valor mínimo del reloj de lectura
#define get_min() (ds1302_read (0x83) )) //Macro, leer minutos del reloj
#define get_min() (ds1302_read(0x83))
#define set_hour(x) (ds1302_write(0x84, x) ) //Macro, escribe la hora del reloj
#define get_hour() (ds1302_read(0x85)amp; 0x7F) //Macro, lee la hora del reloj
#define get_hour() (ds1302_read ( 0x85)amp; 0x7F) //Macro, leer la hora del reloj
#define get_min() (ds1302_read(0x85))amp;0x7F)
{key_v=key_s; p> p>
if((key_vamp;0x04)==0x00)
{key_sel=0x00;
ds1302_write(0x8e, 0x00);
ds1302_write (0x80, 0x80);
ds1302_hour=ds1302_read(0x85);
ds1302_min=ds1302_read(0x83);
hour_da=(ds1302_hourgt; gt; 4) *10 (ds1302_ houramp; 0x0f);
min_da=(ds1302_mingt; gt; 4)*10 (ds1302_minamp; 0x0f); ** ********************** Bit de visualización normal cero
flash_min=1 //**************; ****** ** bit de posición del flash dividido
do
{key_s=key_scan();
if(key_s^key_v)
{delayNS (10);
key _s=key_scan();
if(key_s^key_v)
{key_v=key_s;
if((key_vamp;0x04)==0x00)
key_sel=0x01;
si no((key_vamp;0x02)==0x01)
si no ((key_va
mp amplificador 0x02)==0x00)
{min_da;
if(min_da==0x3c)
min_da=0x00;
ds1302_min=((min_da/10)lt;lt;4)|(min_da10);
ds1302_write(0x82, ds1302_min);
}
más if((key_vamp;0x01)==0x00)
{min_da--;
if(min_da==0xff)
min _da=0x00;
ds1302_min=((min_da/10)lt; lt; 4)|(min_da10);
ds1302_write(0x82, ds1302_min); >
}
}
}mientras(key_sel==0x00);
flash_min=0
flash_hour=1;
hacer
{key_s=key_scan();
if(key_s^key_v)
{ retrasoNS(10);
key_s=key_scan();
if(key_s^key_v)
{key_v=key_s;
if((key_vamp;0x04 )==0x00)
key_sel=0x00;
else if((key_vamp;0x02)==0x00)
{hora_da;
if(hora_da==0x18)
hora_da=0x00;
ds1302_hora=((hora_da/ 10)lt;lt;4)|(hora_da10);
ds1302_write(0x84, ds1302_hour);
}
else if((key_vamp;0x01)==0x00)
{hour_da--;
if(hora_da==0xff)
hora_da=0x00;
ds1302_hora=((hora_da/10)lt;lt;4)|(hora_da10);
ds1302_write(0x84, ds1302_ hora
}
}
}
}
}
}mientras(key_sel==0x01);
//********************* ************************************** ******** **
flash_bit=1
ds1302_write(0x80, 0x00);
ds1302_write(0x8e, 0x80
}< /p); >
}
}
}
//****************** ** *******************
***********************************
// Interrupción programada
p>void timer0_read_1302() usa 1
{unsigned char i, disp_code_data, read_min, read_hour
TR0=0
TH0=0xec; ;
TL0=0x78;
disp_ off_bit();
disp_bit
if(flash_bit)//visualización normal p>
{
if(disp_bit==0x01)
{disp_code_data=show_char[disp_data[ 0]]
send_595(disp_code_data);
ml=0;
}
si(disp_bit==0x02)
{if(read_secamp;0x01) p>
disp_code _data=show_char[disp_data[1]]&0x7f;
else
disp_code_data=show_char[disp_data[1]];
send_595 (disp_code_data);
mh=0
}
si(disp_bit==0x03)
{disp_code_data= show_char[ disp_data[2];
send_595(disp_code_data);
hl=0
}
si(disp_bit= =0x04; )
{disp_bit=0x00;
disp_code_data=show_char[disp_data[3]];
send_595( disp_code_data);
hh =0;
}
if(read_1302_500ms ==100)
{read_1302_500ms=0x00;
read_sec=ds1302_read( 0x81 ) ;
read_min=ds1302_read(0x83);
read_hour=ds1302_read(0x85);
disp_data[0]=read_hourgt;gt;4;
disp_data[1]= read_houramp;0x0f;
disp_data[2]=read_mingt;gt;4;
disp_data[3]=read_minamp;0x0f;
}
}
más ////**** ******************* ** *************************** Visualización de flash en pantalla
{if(flash_min)//***** **********************
********************* Puntuación de flash de pantalla
{if (flash_min_cpl)//************ ** ************************* Cambio de flash de pantalla
{if(disp_bit==0x01)
{disp_code_data =show_char[disp_data[0]];
send_595(disp_code_data);
ml=0;
}
else if( disp_bit==0x02)
{disp_code_data=show_char[disp_data[1]];
send_595(disp_code_data);
mh=0;
}
else if(disp_bit==0x03)
{disp_code_data=show_char[disp_data[2]];
send_595( disp_code_data);
hl=0
if(read_secamp; 0x01)
{mh=0;
dp=0;
}
más
{mh=1
dp=1
}
else if(disp_bit==0x04)
{disp_bit=0x00;
disp_code_data=show_char[disp_data[3]];
send_595( disp_code_data);
hh=0
}
if(read_1302_500ms ==100)
{read_1302_500ms=0x00; p>
read_sec=ds1302_read(0x81);
read_min=ds1302_read(0x83);
read_hour=ds1302_read(0x85);
disp_data[0 ]=read_hourgt; gt;4;
disp_data[1]=read_houramp;0x0f;
disp_data[2]=read_mingt;gt;4;
disp_data [3] =read_minamp;0x0f;
flash_min_cpl=0;
}
}
más
{if( disp_bit==0x01)
{disp_code_data=show_char[disp_data[0]];
send_595(disp_code_data);
ml =0;
}
más si(disp_bit==0x02)
{disp_code_data=(show_char[disp_data[1]])amp;0x7f;
send_595(disp_ code_data);
mh=0;
//dp=0
}
si(disp_bit==0x03)
{disp_code_data= 0xff;
send_595(disp_code_data);
hl=0;
if(read_secamp;0x01)
{mh=0 ;
dp=0;
}
más
{mh=1
dp=1 ;
}
}
si no (disp_bit==0x04)
{disp_bit=0x00;
disp_code_data=0xff;
send_595(disp_code_data);
hh=0
}
if(read_1302_500ms ==100)
{read_1302_500ms=0x00;
read_sec=ds1302_read(0x81);
read_min=ds1302_read(0x83);
read_hour=ds1302_read ( 0x85);
disp_data[0]=read_hourgt;gt;4;
disp_data[1]=read_houramp;0x0f;
disp_data [2]= read_mingt ;gt;4;
disp_data[3]=read_minamp;0x0f;
flash_min_cpl=1;
}
}< / p>
}
else if(flash_ hour)//************************ en pantalla flash p>
{if(flash_hour_cpl)//****************** en pantalla flash flip
{if(disp_bit==0x01)
{disp_code_ data=show_char[disp_data[0]];
send_595(disp_code_data);
ml=0
}<; /p>
else if(disp_bit==0x02)
{disp_code_ data=show_char[disp_data[1]];
send_595(disp_code_data);
mh=0;
}
else if(disp_bit==0x03)
{disp_code_ data=show_char[disp_data[2]]; p> p>
send_595(disp_code_data);
hl=0;
if(read_secamp;0x01)
{mh=0; p>
dp=0;
}
más
{mh=1;
p=1;
}
}
si(disp_bit==0x04)
{disp_bit=0x00;
disp_code_data= show_char[disp_data[3]];
send_595(disp_code_data
hh=0
}
if(read_1302_500ms ==100)
{read_1302_ 500ms=0x00;
read_sec=ds1302_read(0x81);
read_min=ds1302_read(0x83);
read_hour=ds1302_read(0x85);
disp_data[0]=read_hourgt;gt;4;
disp_data[1]=read_houramp;0x0f; p>
p>
disp_data[2]=read_mingt;gt;4;
disp_data[3]=read_minamp;0x0f;
flash_hour_cpl=0; p>
}
}
else//flash_disp_hour_cpl
{if(disp_bit==0x01)
{disp_code_data= 0xff;
send_595(disp_code_data);
ml=0;
}
else if(disp_bit==0x02) p>
{disp_code_data=0xff;
send_595( disp_code_data
mh=0
}
si no; (disp_bit==0x03 )
{disp_code_data=show_char[disp_data[2]];
send_595( disp_code_data
hl=0; >
if (read_secamp; 0x01)
{mh=0;
dp=0
}
else<; /p>
{mh=1;
dp=1;
p> }
}
si( disp_bit==0x04)
{disp_bit=0x00;
disp_code_data=show_char[disp_data[3]]
for(i=0; ilt; 8 .i ) p>
{Si_595=(bit)(disp_code_dataamp;0x80);
CLK_595=0;
_nop_();
CLK_595=1;
disp_code_datalt;lt;=1;
}
LD_595=0
_nop_(); /p>
LD_595=1;
CLK_595=1
h;
h=0;
}
if(read_1302_500ms ==100)
{read_1302_500ms=0x00
read_sec=ds1302_read(0x81
read_min=ds1302_read(0x83);
read_hour=ds1302_read(0x85);
disp_data[0]=read_hourgt;gt; p> p>
disp_data[1]=read_houramp;0x0f;
disp_data[2]=read_mingt;gt;4;
disp_data [3]=read_minamp;0x0f;
p>
flash_hour_cpl=1;
}
}
}
} p>
TR0= 1;
}
//*********************** ** ******* *******************************************
/* Escribe datos en la dirección especificada por ds1302*/
/*====================== ======== ============*/
//********************* *********** **************************************** **********
void ds1302_write(dirección de caracteres sin firmar, datos de caracteres sin firmar DS1302)
{
recuento de caracteres sin firmar;
ds1302_sclk=0;
_nop_();
ds1302_rst=1;
_nop_();
for(count=8; countgt; 0; count --)
{
ds1302_sclk=0
_nop_()
;ds1302_io=address amp; 0x01; //envía el bit bajo primero (envía la dirección al ds1302)
dirección gt;=1; //prepárate para enviar el siguiente bit
ds1302_sclk=1;
}
for(count=8; countgt; 0; count--)
{
ds1302_ sclk=0;
_nop_();
ds1302_io=DS1302_datum amp; //Enviar datos a ds1302
DS1302_datum amp;gt; gt;=1; //Prepárate para enviar el siguiente bit
ds1302_ sclk=1
}
ds1302_rst=0; > _nop_();
}
////
/////////////////////////////////////////////
/ * Leer los datos en la dirección especificada en ds1302 datos en la dirección*/
/*========================= ====== ===============*/
carácter sin firmar ds1302_read(dirección de carácter sin firmar)
{
recuento de caracteres sin firmar ;
ds1302_sclk=0
_nop_()
ds1302_rst=1
_nop_(); ;
for(count=8; countgt; 0; count--)
{
ds1302_sclk=0
_nop_( );
ds1302_io=address amp; 0x01; //Envía el bit alto primero (envía la dirección a ds1302)
dirección amp;gt;=1; el siguiente bit<
ds1302_sclk=1;
}
DS1302_datum=0
for(count=8; countgt; 0 ; contar--)
{
ds1302_sclk=0;
_nop_( );
DS1302_datum gt;
if( ds1302_io==1)
DS1302_datum |=0x80; //leer datos de ds1302
ds1302_sclk=1;
}
ds1302_rst= 0;
_nop_();
return DS1302_datum; //devuelve datos leídos
}
/////// //////////////////////////////////////////
/* Programa de inicialización */
/*============================= ============== ===*/
void ds1302_initialization()
{
ds1302_rst=0;
set_enable();
set_charge(0xA9); //Escribir registro de carga
set_sec(get_sec()amp; 0x7F); p>
}
//****************************** *******
//key_scan
unsigned char key_scan()
{unsigned char key_number
key_number=0x00; p> número_clave|=Conjunto_claves
número_clavelt;lt;=1;
número_clave|=Clave
_reduce;
key_numberlt;lt;=1;
key_number|=Key_increase;
return(key_number);
} p>
//************************************
//************************************
/ Retraso
void delayNS(unsigned char ms)
{unsigned char i;
while(ms--)
for(i=0; ilt ;120 ;i);
}