Escrito en la placa STC89C52, implementado a través de DS1602, e incluye la función del teclado matricial
#include
#define uchar unsigned char
#define uint unsigned int
tabla de códigos uchar[]="reloj ME-400-A";
tabla de códigos uchar1[]=" - - :--:-- ";
tabla de códigos uchar2[]="ALL:00:00:-- ";
tabla de códigos uchar3[]=" ";< / p>
uchar clk_time[3]; //Valor inicial del registro de segundos, minutos y horas
sbit T_RST=P2^2;//ds1302-5
sbit T_IO = P2^3;//ds1302-6
sbit T_CLK=P2^4;//ds1302-7
sbit en=P2^5 //Consulte la instrucción LCD1602; archivo para usar la señal de energía
sbit rw=P2^6 //. . . . . . . . , leer y escribir terminal de señal (leer cuando se ingresa una frecuencia de alta potencia, escribir cuando se ingresa baja potencia)
sbit rs=P2^7; . . . . . . .
, terminal de selección de datos/comandos (H/L)
sbit led=P1^0;
sbit dula=P1^1;
sbit wela=P1 ^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit arriba=P3^3;
sbit down=P3^4;
sbit set=P3^2;
sbit did=P1^4;
uchar num,clock_ss,clock_sg ,clock_fs,clock_fg,clock_ms,clock_mg,b,clock_s,clock_g;
char hora,mie,sei,c,nhora,nmie,shour,smie;
/*** ***************DS1302: Operación de escritura (flanco ascendente)************************/ p>
void write_byte(uchar da)
{
uchar i;
ACC=da;
for(i =8 ;i>0;i--)
{
T_IO=ACC0;
T_CLK=0
T_CLK=; 1;
ACC=ACC>>1;
}
}
/********** ** ******DS1302: Operación de lectura (flanco descendente)****************/
uchar read_byte(void)
{
uchar i;
for(i=0;i<8;i++)
{
ACC=ACC >>1;
T_CLK = 1;
T_CLK = 0;
ACC7 = T_IO;
}
return(ACC);
}
/******************DS1302: escribir datos (enviar dirección primero, luego escribe datos)******************************/
void write_1302(uchar addr,uchar da)
{
T_RST=0; //Deja de funcionar
T_CLK=0; //Solo cuando CLK es bajo, RST se puede configurar en ping de alta potencia, entonces los datos se pueden transmitir
T_RST=1; //Reelaborar
write_byte(addr); //Escribir dirección
write_byte(da); p>
T_RST=0;
T_CLK=1;
}
/************ ** ****DS1302: Leer datos (enviar dirección primero, luego leer datos)******************************/ p >
uchar read_1302(uchar addr)
{
uchar temp;
T_RST=0;
/Dejar de funcionar
T_CLK=0
T_RST=1; //Reiniciar trabajo
write_byte(addr); //Escribir dirección
temp=read_byte();
T_RST=0;
T_CLK=1; //Dejar de funcionar
return(temp);
}
/************************Programa de retardo=a*1ms******* * ******************************/
retraso nulo (uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y > 0;y--);
}
void fn()
{
did=0;
retraso(120);
hizo=1;
retraso(120);
hizo=0;
retraso ( 120);
did=1;
retraso(120);
did=0;
retraso(120); /p>
hizo=1;
retraso(120);
hizo=0;
retraso(320);
did=1;
demora(400);
}
void write_com(uchar com)
{ p >
led=1;
wela=1;
P0=0xff;
retraso(1);
led =0;
wela=0;
P0=0x00;
dula=1;
retraso(1);
p>dula=0;
rs=0;
P0=com;
retraso(5);
es=1;
demora(5);
es=0;
}
void write_data(uchar date) p>
{
led=1;
wela=1;
P0=0xff;
retraso(1 ) ;
led=0;
wela=0;
P0=0x00;
dula=1;
retraso(1);
dula=0;
rs=1;
P0=fecha;
retraso( 5 );
es=1;
retraso(5);
es=0;
}
mañana vacía()
{ shour=clock_ss*10
+clock_sg;
smie=clock_fs*1clock_fg;
if(b==0)
{
if(nhora ==shora)
{
if(smie>=nmie)
{
fn();
}
}
}
}
void init()
{
b=0;
P0=0xff;
retraso(5);
led=1;
retraso( 5);
P0=0xff;
led=0;
dula=0;
wela=1;
delay(5);
wela=0;//Apague el tubo digital de la placa de desarrollo ME-400
nhour=0;
nmie= 0;
rw=0;
en=0;
write_com(0x38);//Configurar LCD
write_com (0x0c);//Establece el cursor, etc.
write_com(0x06);//Escribe un carácter y el puntero de dirección aumenta en 1 y el cursor aumenta en 1
write_com (0x01);//Borrar la pantalla p>
write_com(0x80);//Establecer el puntero de dirección s
}
void display(uchar add,date )
{
if(b==0)
{
clock_ms=clk_time[0]/ 16; [0]%16;
led=0;
clock_fs=clk_time[1]/ 16; clock_fg=clk_time[1]%16;
led =0;
clock_ss= clk_time[2]/ 16; clock_sg=clk_time[2]%16;
write_com(0x80x44);
write_data (0x3clock_ss);
write_com(0x80x45);
write_data(0x3clock_sg);
write_com(0x80x47); p>
write_data(0x3clock_fs);
write_com(0x80x48);
write_data(0x3clock_fg);
write_com(0x80) +0x4a);
write_data (0x3clock_ms);
write_com(0x80x4b);
write_data(0x3clock_mg);
}
<p> if(b!=0)
{
clock_s=fecha/ 10; clock_g=fecha%10;
write_com(0x80x4add );
write_data(0x3clock_s);
write_data(0x3clock_g
}
}
void key()
{
uchar clock_s1, clock_s2, clock_f1, clock_f2;
rw=0;
si (set==0)
{
retraso(10);
if(set==0)
{ p>
did=0;
retraso(10); did=1;
b++;
}
mientras (!set);
if(b==1)
{
hora=clock_ss*1clock_sg;
mie =clock_fs*1clock_fg;
write_com(0x80x45);
write_com(0x0f);
}
si( b==2)
{
write_com(0x80x48);
}
if(b==3)
{
write_com(0x80x40);
for(num=0;num<13;num++)
{ p>
write_data(table2[num]);
}
write_com(0x80x45); display(4,nhora);write_com(0x80x45); /p>
}
if(b==4)
{
write_com(0x80x48);
display(7,nmie); write_com(0x80x48);
}
if(b==5)
{
write_com(0x80x40);
for(num=0;num<4;num++)
{
write_data(table3[num]);
}
write_com(0x80x45);
write_com(0x0c);
b=0;
< pag> clock_s1=hora/10;//Convertir decimal a hexadecimal
clock_s2=hora%10;//Convertir decimal a hexadecimal
clock_s1=clock_s1&0xff;//Decimal Convertir a hexadecimal
clock_s2=clock_s2&0xff;//Convertir decimal a hexadecimal
clock_s1<<=4;//Convertir decimal a hexadecimal
clock_s1=clock_s1|clock_s2;// convertir decimal a hexadecimal
clock_f1=mie/10;//convertir decimal a hexadecimal
clock_f2=mie%10; //Convertir de decimal a hexadecimal
clock_f1=clock_f1&0xff; //Todo 1 de 1 Y operación
clock_f2=clock_f2&0xff;//Convertir de decimal a hexadecimal
clock_f1<<=4;//Convertir decimal a hexadecimal
clock_f1=clock_f1|clock_f2;//Convertir decimal a hexadecimal
write_1302(0x8e,0x00); //WP=0 operación de escritura
write_1302(0x80) ,0x00);//escribir segundos
write_1302(0x82,clock_f1);//escribir minutos
write_1302(0x84,clock_s1);//Escribir tiempo
write_1302(0x86,0x14);//Escribir día
write_1302(0x88,0x02);//Escribir mes
write_1302(0x8a,0x06);//Escribir el día de la semana
write_1302(0x8c,0x09);
write_1302(0x8e,0x80); //WP=1 Protección contra escritura
}
}
si(b!=0)
{
si(arriba ==0)
{
retraso(10);
if(up==0)
{
did=0;
retraso (10);
did=1;
mientras(!up);
if(b==1)
{
hora++;
if(hora>=24)
{
retraso(1);
hora=0;
}
display(4,hora
);
write_com(0x80x45);
}
if(b==2)
{
mie++;
if(mie>=60)
{
mie=0;
}
display(7,mie) ;
write_com(0x80x48);
}
if(b==3)
{
nhora++;
if(nhora>=24)
{
retraso(1);
nhora=0;
}
display(4,nhora);
write_com(0x80x45);
}
if(b==4)
{
nmie++;
if(nmie>=60)
{
nmie=0;
}
display(7,nmie);
write_com(0x80x48);
}
}
}
si(abajo==0)
{
retraso(10) ;
if(down==0)
{
did=0;
retraso(10);
did=1;
while(!down);
if(b==1)
{
hora --;
if(hora<0)
{
hora=23;
}
display(4,hora);
write_com(0x80x45);
}
if(b==2)
{
mie--;
if(mie<0)
{
mie=59;
}
display(7,mie);
write_com(0x80x48);
}
if(b==3)
{
nhora--;
if(nhora<0)
{
nhora=23;
}
display(4,nhora);
write_com(0x80x45);
}
if(b= =4)
{
nmie--;
if(nmie<0)
{
nmie=59;
}
display(7,nmie);
write_com(0x80x48);
} p>
}
}
}
}
void main()
{
uchar temp=0x80;
uchar i;
init();
for(num=0;num<14;num++ )
{
escribir_datos(tabla[núm]);
retraso(100);
}
write_com(0x80x40); // Establece el puntero de dirección de datos en 0X40
for(num=0;num<15;num++)
{
write_data(tabla1[núm]);
}
/*for(núm=0;núm<16;núm++)
{
write_com(0x18);
retraso(20);
}*/
write_1302(0x8e,0x00); > escribir_1302(0x90,0xa4);
escribir_1302(0x8e,0x80);
mientras(1)
{
si( b ==0)
{ temp=0x81;
for(i=0;i<3;i++)
{
clk_time[i]=read_1302(temp);
temp+=2;
}
display(0x4b,0x00);
}
mañana();
tecla();
}
}