Curso diseño de reloj electrónico para microcontrolador 89c51
#include lt;reg52.hgt;
#includelt;stddef.hgt;
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_FLAG
#define LCD1602_PORT P0
sbit lcd1602_rs=P2^0;
sbit lcd1602_e=P2^ 2;
sbit lcd1602_rw=P2^1;
sbit lcd1602_busy=P0^7;
sbit key_ch=P3^5;
sbit key_add=P3^6;
sbit key_minus=P3^7;
uchar i, sec, min, h, fecha, mes, bandera;
uint año;
uchar *chgstr[7]={" ?", "seg", "min", "hora", "fecha", "min", "año"} p>
uchar j, k, m, n, o, p;
tabla de códigos uchar[]={
0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71};
uchar timestr[10], datetr[10];
void init();
void delay(uint);
void time_display(); p>
p>
void date_display();
void control();
void time();
/* p>
*************************************
* Función nombre: lcd1602_CheckBusy()
* Función: consulta de estado
************************** **** ******
*/
void lcd1602_CheckBusy()
{
hacer
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1; p>
lcd1602_e=1;
}
mientras(lcd1602_busy);
}
/*
* *******************************************
* Nombre de la función: lcd1602_WriteCmd ()
* Función: escribir comando
* Parámetro de entrada: palabra de comando
* Parámetro de salida: Ninguno
*** *************************************
*
/
void lcd1602_WriteCmd(const uchar cmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}
/*
*************************************** ***** ******
* Nombre de la función: lcd1602_WriteData()
* Función: escribir datos
* Parámetro de entrada: c- -datos a escribir
* Parámetros de exportación: Ninguno
*************************** ********** ****************
*/
void lcd1602_WriteData(const uchar c)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1 ;
LCD1602_PORT=c;
lcd1602_e=0;
}
/*
*** *************** ************************************* *
* Nombre de la función: lcd1602_Init()
* Función: Inicializar LCD
* Parámetro de entrada: Ninguno
* Parámetro de salida: Ninguno
********** ******************************** *****
*/
void lcd1602_Init()
{
lcd1602_WriteCmd(0x38); es de 8 bits, 2 líneas, 5*7 puntos
lcd1602_WriteCmd( 0x0c); //activación de visualización, activación de bandera, activación de flash,
lcd1602_WriteCmd(0x06); a la derecha, la pantalla no se mueve
lcd1602_WriteCmd(0x01); //borrar pantalla
}
/*
** ********************** *******************************
* Nombre de la función: lcd1602_Display()
* Función de función: Visualización de caracteres
* Parámetro de entrada: ptr--puntero de cadena o carácter
* Parámetro de salida: Ninguno
* Descripción: Los usuarios pueden utilizar los siguientes métodos para llamar:
* ? 1) lcd1602_Display("¡Hola, mundo!"); >
* 2) Tipo de almacenamiento INT8U txt[]="Cadena a mostrar";
* ?O tipo de almacenamiento INT8U txt[]={'t', 'x', 't ', ..
,'\0'};
* ?INT8U *ptr;
* ?ptr=amp;txt;
* ?lcd1602_Display(ptr);
* ?O lcd1602_Display(txt);
* ?O lcd1602_Display(amp; txt); ********************************
*/
void lcd1602_Display(const uchar *ptr, uchar line, uchar xaddr)
{
uchar data i=0;
uchar *data q;
q=ptr;
cambiar(línea)
{
caso 0:
lcd1602_WriteCmd(0x80 xaddr);
mientras(q!=NULL & (*q!='\0') &ilt;16)
{
lcd1602_WriteData(*q);
q
i
}
caso 1; :
lcd1602_WriteCmd(0xc0 xaddr);
mientras(q!=NULL amp; amp; (*q!='\0') amp; amp; ilt; 16 )
{
lcd1602_WriteData(*q);
q
i
} p>;
romper;
}
}
void main()
{
lcd1602_Init () ;
init();
mientras(1)
{
time_display();
date_display ();
control();
}
}
void init()
{
i=0;
seg=0;
min=30; fecha=17;
mes=10;
año=2017;
bandera=0; p>
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000) )256;
TR0=1;
}
retraso nulo(uint z)
{
uint x, y;
for(x=z;xgt;0;x--)
for(y=110;ygt;0;y--); p>
}
void time_display()
{
timestr[7]=0x30 seg10
;
timestr[6]=0x30 seg/10;
timestr[5]=':';
timestr[4]=0x30 min10;
timestr[3]=0x30 min/10;
timestr[2]=':';
timestr[1]=0x30 h10;
timestr[0]=0x30 h/10;
timestr[8]=0;
lcd1602_Display(timestr, 1, 3
}
void date_display()
{
datestr[9]=0x30 fecha10;
datestr[8]=0x30 fecha /10;
datestr[7]=':';
datesr[6]=0x30 mes10;
datestr[5]=0x30 mes/10 ;
datestr[4]=':';
datesr[3]=0x30 año10;
datestr[2]=0x30 año/1010;
datestr[1]=0x30 año/10010;
datestr[0]=0x30 año/1000;
lcd1602_Display(datestr, 0, 2);
}
control de vacío()
{
if(!key_ch)
{
retraso(5);
if(!key_ch)
{
bandera;
TR0=0; p>
p>
if(bandera==7)
{flag=0; lcd1602_Init();}
lcd1602_Display(chgstr[bandera] ], 1, 12 );
}
}
mientras(!key_ch);
if(flag==1amp; amp;key_add== 0)
{
mientras(!key_add);
seg;
if(sec==60 )
seg=0;
}
if(flag==1amp;amp;key_minus==0)
{
while(!key_minus);
seg--;
if(sec==-1)
sec=59;
}
if(flag==2amp;amp;key_add==0)
{
mientras(!key_add);
min;
si(min==60)
min=0;
}
si( flag==2amp;key_minus==0)
{
mientras(!key_minus);
min--;
if(min= =-1)
min=59;
}
if(bandera==3amp;amp;k
ey_add==0)
{
mientras(!key_add);
h;
if(h==24)
h=0;
}
if(flag==3amp;amp;key_minus==0)
{
mientras(!key_minus);
h--;
if(h==-1)
h=23;
}
if(flag==4amp;amp;key_add==0)
{
mientras(!key_add);
fecha;
if(fecha==29)
if((año4!=0)amp;amp;(mes==2))
fecha=1;
if(fecha==30)
if((año4==0)amp;amp;(mes==2))
fecha=1;
if(fecha==31)
if((mes==4)||(mes==6)||(mes= =9)||(mes==11))
fecha=1;
if(fecha==32)
if((mes== 1)||(mes==3)||(mes==5)||(mes==7)||(mes==8)||(mes==10)||(mes==12) )
fecha=1;
}
if(flag==4amp; amp;key_minus==0)
{
while(!key_minus);
if(dategt;1)fecha--;
}
if(flag==5amp ;amp;key_add==0)
{
mientras(!key_add);
mes ;
if(mes== 13)
mes=1;
}
if(flag==5amp;amp;key_minus==0)
{
mientras(!key_minus);
mes--;
if(mes==0)
mes=12;
}
if(flag==6amp;amp;key_add==0)
{
mientras(!key_add);
año;
if(año==99)
año=1;
}
si( flag==6amp;amp;key_minus==0)
{
mientras(!key_minus);
año--;
if(año==0)
año=99;
}
}
void T0_rpt() interrupción 1 p>
{
TH0=(65536-50000)/256;
TL0=(65536-50000)256;
i; p>
i p>
tiempo();
>
}
tiempo vacío()
{
if(i==20)
{
i=0;
seg;
si(seg==60)
{
seg=0;
min ;
si(min==60)
{
min=0
h ;
if(h==24)
{
h=0
min=0; >seg=0;
fecha;
if(fecha==29)
if((año4!=0)amp;amp;(mes= =2))
{
fecha=1;
mes;
if(mes==13)
{
mes=1;
año ;
}
}
si(fecha) ==30)
if((año4==0)amp;amp;(mes==2))
{
fecha=1;
mes;
if(mes==13)
{
mes=1;
año;
}
}
if(fecha==31)
if((mes==4)||(mes= =6)||(mes==9)||(mes==11))
{
fecha=1;
mes; p>
p>
if(mes==13)
{
mes=1
año
<; p>} p>}
if(fecha==32)
if((mes==1)||(mes==3)|| (mes==5 )||(mes==7)||(mes==8)||(mes==10)||(mes==12))
{
fecha =1;
mes;
if(mes==13)
{
mes=1;
año ;
}
}
}
}
}
}
}