Curso diseño de reloj electrónico para microcontrolador 89c51
#include
#include
#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]={" ?","sec","min","hora","fecha","min","año"};
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],datestr[10];
void init();
void delay(uint);
void time_display();
void date_display();
void control();
void time();
/*
* ***********************************
* Nombre de la función: lcd1602_CheckBusy( )
* Función: consulta de estado
****************************** ****** *****
*/
void lcd1602_CheckBusy()
{
hacer
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
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; p> p>
}
/*
************************** ** ***************
* Nombre de la función: lcd1602_WriteData()
* Función de la función: Escribir datos
* Parámetro de entrada: c--datos a escribir
* Parámetro de salida: Ninguno
********************* ***** *************************
*/
void lcd1602_WriteData(const uchar c)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
p>LCD1602_PORT=c;
lcd1602_e=0;
}
/*
****** ******************************************* **
* Nombre de la función: lcd1602_Init()
* Función: Inicializar LCD
* Parámetros de entrada: Ninguno
* Parámetros de salida : Ninguno
* **************************************** ********
*/
void lcd1602_Init()
{
lcd1602_WriteCmd(0x38); El modo de visualización es de 8 bits, 2 líneas, matriz de puntos de 5*7
lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable,
lcd1602_WriteCmd(0x06); //bandera se mueve hacia la derecha, la pantalla no se mueve
lcd1602_WriteCmd(0x01); //borrar pantalla
}
/*
*************************************************** *****
* Nombre de la función: lcd1602_Display()
* Función: Visualización de caracteres
* Parámetro de entrada: ptr - carácter o puntero de cadena p>
* Parámetro de salida: Ninguno
* Nota: Los usuarios pueden llamarlo de las siguientes maneras:
* 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=&txt;
* ?lcd1602_Display (ptr);
* ?o lcd1602_Display(txt );
* ?o lcd1602_Display(&txt
);
****************************************** ***** *******
*/
void lcd1602_Display(const uchar *ptr,uchar line,uchar xaddr)
{
uchar datos i=0;
uchar *datos q;
q=ptr;
cambiar(línea)
{
caso 0:
lcd1602_WriteCmd(0x8xaddr);
while(q!=NULL && (*q!='\ 0') && i <16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
descanso;
caso 1:
lcd1602_WriteCmd(0xcxaddr);
mientras(q!= NULL && (*q !='\0') && i<16)
{
lcd1602_WriteData(*q);
q++;
i++ ;
}
romper;
}
}
void main()
{
lcd1602_Init();
init();
mientras(1)
{
time_display();
fecha_display();
control();
}
} p>
void init()
{
i=0;
seg=0;
min=30;
h=7;
fecha=17;
mes=10;
año=2017;
bandera=0;
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536- 50000)/256;
TL0=(65536-50000)%256;
TR0=1;
}
retraso nulo (uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y =110;y>0;y--);
}
void time_display()
{
timestr[7] =0x3seg%10;
timestr[6]=0x3seg/10;
timestr[5]=':';
timestr[ 4]=0x3min%10;
timestr[3]=0x3min/10;
timestr[2]=':'; p>
timestr[1]=0x3h%10;
timestr[0]=0x3h/10;
timestr[8]=0; p>
lcd1602_Display(timestr,1,3);
}
void date_display(
)
{
datestr[9]=0x3fecha%10;
datestr[8]=0x3fecha/10;
datestr[7]=':';
datesr[6]=0x3mes%10;
datestr[5]=0x3mes/10;
datesr[4]=':';
datesr[3]=0x3año%10;
datesr[2]=0x3año/10%10 ;
datesr[1]=0x3año/100%10;
datesr[0]=0x3año/1000;
lcd1602_Display(datesr, 0,2);
}
control de vacío()
{
if(!key_ch)
{
retraso(5);
if(!key_ch)
{
bandera++;
TR0=0;
if(flag==7)
{flag=0;TR0=1;lcd1602_Init();}
lcd1602_Display(chgstr[ bandera],1,12);
}
}
mientras(!key_ch);
if(flag==1&&key_add ==0)
{
mientras(!key_add);
seg++;
if(sec==60) p>
sec=0;
}
if(flag==1&&key_minus==0)
{
mientras (!key_minus);
seg--;
if(sec==-1)
sec=59;
}
if(flag==2&&key_add==0)
{
mientras(!key_add);
min++;
si(min==60)
min=0;
}
si(bandera==2&&key_minus==0)
{
mientras(!key_minus);
min--;
if(min==-1)
min=59;
}
if(flag==3&&key_add==0)
{
mientras(!key_add) ;
h++;
si(h==24)
h=0;
}
if(flag==3&&key_minus==0)
{
mientras(!key_minus);
h--;
si (h==-1)
h=23;
}
if(flag==4&&key_add==0)
{
mientras(!key_add);
fecha++;
if(fecha==29)
if((año%4 !=0)&&(mes==2))
fecha=
1;
if(fecha==30)
if((año%4==0)&&(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==4&&key_minus==0)
{
mientras(!key_minus );
if(fecha>1)fecha--;
}
if(flag==5&&key_add==0)
{
mientras(!key_add);
mes++;
if(mes==13)
mes=1;
}
if(flag==5&&key_minus==0)
{
mientras(!key_minus);
mes--;
if(mes==0)
mes=12;
}
if(bandera= =6&&key_add==0)
{
mientras(!key_add);
año++;
if(año==99)
año=1;
}
if(flag==6&&key_minus==0)
{
mientras(!key_minus);
año--;
if(año==0)
año=99;
}
}
void T0_rpt() interrupción 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
tiempo();
}
nulo tiempo()
{
si(i==20)
{
i=0;
seg++;
if(seg==60)
{
seg=0;
min++;
si(min==60)
{
min=0;
h++;
si(h==24 )
{
h=0;
min=0;
seg=0;
fecha++ ;
if(fecha==29)
if((año%4!=0)&&(mes==2))
{ p>
fecha=1;
mes++;
si(mes==13)
{
mes=1 ;
año++;
}
}
if(fecha
==30)
if((año%4==0)&&(mes==2))
{
fecha=1; p>
mes++;
if(mes==13)
{
mes=1;
año++;
}
}
if(fecha==31)
if((mes==4)||(mes== 6)||(mes==9)||(mes==11))
{
fecha=1;
mes++;
if(mes==13)
{
mes=1;
año++;
}
}
if(fecha==32)
if((mes==1)||(mes==3)||(mes==5) ||(mes==7)||(mes==8)||(mes==10)||(mes==12))
{
fecha= 1;
mes++;
si(mes==13)
{
mes=1;
año++;
}
}
}
}
}
}
}