Red de conocimientos turísticos - Conocimientos sobre calendario chino - Curso diseño de reloj electrónico para microcontrolador 89c51

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"}

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>

void date_display();

void control();

void time();

/*

*************************************

* 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

};

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>

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

{

TH0=(65536-50000)/256;

TL0=(65536-50000)256;

i;

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>

if(mes==13)

{

mes=1

año

<; 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 ;

}

}

}

}

}

}

}