El calendario perpetuo basado en el microcontrolador AT89C51 sólo necesita mostrar la hora sin añadir nada más.
#include lt;reg51.hgt;
#include lt;intrins.hgt;
#define uint unsigned int
# definir uchar unsigned char
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
bit SPK=P3^0;
sbit clave1=P1^0;
sbit clave2=P1^1;
sbit clave3=P1^ 2;
sbit key4=P1^3;
uchar Display_Buffer[16]=" ";
uchar Count, hora=12, min=12, sec=12;
indicador de bits, H_or_M;
uchar display[]="Esto es colck";
void _delay_ms(uint x)
{
uchar i;
mientras(x--)
{
for(i=0; ilt ; 120; yo );
}
}
/********************* ************************************************* *****
*Nombre de la función: LCD_Write_Command
*Entrada: uchar cmd
*Salida: Ninguna
*Función: Escriba instrucciones en LCD1602
*************************************** ********* ****************************/
void LCD_Write_Command(uchar cmd )
{ p>
LCD_RS=0; //De acuerdo con las regulaciones, cuando RS y R/W son bajos al mismo tiempo, se pueden escribir instrucciones
LCD_RW=0;
LCD_EN=0 ; //EN está configurado en nivel bajo
P0=cmd; //Envía datos al puerto P2, es decir, escribe instrucciones o direcciones
LCD_EN=1; //EN está configurado en nivel alto
_delay_ms(1); //Ligero retraso para dar tiempo de respuesta al hardware
LCD_EN=0 ; //Cuando EN salta del nivel alto al nivel bajo, el módulo LCD comienza a ejecutar el comando
}
/************** ********************** ******************************* ***********
*Nombre de función: LCD_Write_Data
*Entrada: uchar dat
*Salida: Ninguna
*Función: escribir datos en LCD1602
*** ******************************* ********************** *******************/
anular LCD_
Write_Data(uchar dat)
{
LCD_RS=1; //Cuando RS es de nivel alto y RW es de nivel bajo, se pueden escribir datos
LCD_RW = 0;
LCD_EN=0; //EN está configurado en nivel bajo
P0=dat; //Envía los datos al puerto P0, es decir, escribe los datos en el Módulo LCD
LCD_EN=1; //EN está configurado en nivel alto
_delay_ms(1); //Ligero retraso para darle tiempo de reacción al hardware
LCD_EN=0; // Cuando EN salta del nivel alto al nivel bajo, el módulo LCD comienza a ejecutar el comando
}
/********** ******** ******************************************* ********* ****
*Nombre de función: Init_LCD
*Entrada: Ninguna
*Salida: Ninguna
*Función: Inicializar LCD1602
************************************ ************ ****************************/
void Init_LCD( void)
{ p>
LCD_Write_Command(0x38); //Configuración del modo de visualización: pantalla de 16 × 2, matriz de puntos de 5 × 7, interfaz de datos de 8 bits
_delay_ms(1);
LCD_Write_Command(0x06); //Configuración del modo de visualización: el cursor se mueve hacia la derecha, el carácter no se mueve
_delay_ms(1); p>
LCD_Write_Command(0x0c); //Configuración del modo de visualización: visualización encendida, sin cursor, el cursor no parpadea
_delay_ms(1);
LCD_Write_Command(0x01) ; //Comando borrar pantalla, borra el contenido de la pantalla anterior
_delay_ms(1);
}
/********** ************************* **************************** ***************
*Nombre de función: LCD_POS
*Entrada: uchar pos
*Salida: Ninguna
*Función: Posición de visualización de caracteres
**** **************************** ************************* ****************/
nulo LCD_POS(uchar pos)
{
LCD_Write_Command(0x80|pos ); //El método para determinar la posición de visualización es "código de dirección 80H x"
}
/****************************************** ******************************** ***
*Nombre de función: Show_String
*Entrada: uchar *str
*Salida: Ninguna
*Función: LCD1602 Mostrar funciones de procesamiento de cadenas
******* ************************************************** *******************/
p>
void Show_String(uchar *str)
{
while(*str!='\0')// Siempre que no esté escrita la marca de final, continúa escribiendo
LCD_Write_Data(*str); //Escribe constantes de caracteres en la pantalla LCD y señala el siguiente carácter
}
canción vacía (void)
}
p >
{
uchar i, j, k
for(i=0; ilt; 200; i )
{
SPK=~SPK;
for(k=0;klt;50;k);
for(j=0;jlt;50;j);
p>}
}
/////lcd1602 LCD //////
void Display_Time(uchar Hora, uchar Min , uchar Sec)
{
Display_Buffer[0]=Hour/10 '0' //El décimo dígito de la hora
Display_Buffer[ 1]=Hour10 ' 0'; //El dígito de la hora
Display_Buffer[2]=':'; //Display: número
Display_Buffer[3]=Min/10 ' 0'; // Muestra las decenas del minuto
Display_Buffer[4]=Min10 '0'; //Muestra las unidades del minuto
Display_Buffer[5]= ':'; //Mostrar: número p>
Display_Buffer[6]=Sec/10 '0' //Mostrar las decenas del segundo
Display_Buffer[7]=Sec10 '0'; //Muestra el dígito de las unidades del segundo
LCD_POS(0x40); //Se muestra en la fila 1 de la pantalla LCD, columna 0
Show_String(Display_Buffer);
}
//// /Procesamiento de claves//////
void Set_time(void)
{
flag=0;
if(key1 ==0||key2==0||key3==0)//Si se presiona alguna tecla entre la tecla1, la tecla2 y la tecla3, es verdadera
{
TR0= 0; //El temporizador 0 se detiene
flag=1; //El indicador del botón es verdadero
} p>
while(flag)//Determinar cuál tecla está presionada
{
if(key1==0)//Determinar si la tecla1 está presionada
{
while(! key1); //Esperando liberación
H_or_M=!H_or_M //Selecciona si deseas modificar la hora o el minuto
}
else if(key2==0) //Determina si se presiona la tecla2
{
while(!key2); //Espera a que se suelte
if(H_or_M)//Si H_OR_M es verdadero, entonces modifica la hora
{
if( hora==24)//Si hora=24, luego hora=0
hora=0; // Agrega 1 a la hora
}
else//En caso contrario modifica el minuto
{
if( min==60)//Si el minuto es igual a 60, entonces el minuto es igual a 0
min=0;
Agregar 1
}
}
else if(key3==0)//Determinar si se presiona la tecla 3
{< / p>
while(!key3); //Esperando lanzamiento
if(H_or_M)//Si H_OR_M es verdadero, modifica la hora
{
if(--hour==0xff) //La hora se reduce en 1. Si la hora es igual a -1, entonces la hora es igual a 23
hora=23;
}
else//En caso contrario modificar el minuto
{
if(--min==0xff)//Minuto menos 1, si el minuto es igual a -1, entonces el minuto es igual a 59
min=59;
}
}
else if(key4==0)//Determinar si se presiona la tecla4
{
while(!key4); //esperar a que se suelte
flag=0; ; //marca clave borrada
TR0= 1; //Se inicia el temporizador 0
}
Display_Time(hora, min, seg); , M, S valores a la pantalla LCD
}
}
void timer0_init(void)//Inicialización del temporizador 0
{
TMOD=0x01; //Dispositivo de temporización 0, modo 1
ET0=1; //
EA=1; /p>
TR0=1; //Inicia el temporizador 0
TH0=(65535-50000)/256; //Instala el valor inicial alto de 8 bits
TL0 =(65535-50000)256; //Instala el valor inicial bajo de 8 bits
}
void main(void)//función principal
{
//P0=0xff;
P1=0xff; //Inicialización del puerto
P3=0xff;
Init_LCD(); //Inicialización de la pantalla LCD
timer0_init(); // Inicialización del dispositivo de sincronización 0
LCD_POS(0); //Se muestra en la primera fila y en la columna 0 de la pantalla LCD
Show_String(display);
while(1)/ /Bucle infinito
{
Display_Time(hora, min, seg); mostrar tiempo
//_delay_ms(500); //Retraso
Set_time(); //Ajuste de tiempo
}
}
void timer0() interrupción 1//Interrupción del temporizador 0
{
TH0=(65535-50000)/256 //Reinstalar los 8 bits altos; del temporizador 0
TL0=(65535-50000)256 ;//Recargar los 8 bits inferiores del temporizador 0
Contar ;//Aumentar el conteo en 1
if (Count==20)//Si COUNT es igual a 20
{
Count=0; //Conteo borrado a cero
seg. ; //Segundo más 1
if(sec==60)//Juicio ¿El segundo es igual a 60?
{
sec=0; /borrar el segundo a cero
min; //aumentar el minuto en 1
if (min==60)//Determinar si el minuto es igual a 60
{
min=0; //Si es igual a 60, lo ponemos a cero
Minutos
hora; //Suma 1 a la hora
if(hora==24)//Juzga si la hora es igual a 24
{
hora=0; //Si la hora es igual a 24, borre horas, minutos, segundos
min=0;
sec=0;
}
canción();
}
}
}
} p>