Solicitar programa de microcontrolador 51.
(Reloj electrónico LCD)
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue ,nian,week.flag,key1n,temp;
#define yh 0x80
#define er 0x80x40//Definición de conexión de pin entre LCD y C51
sbit rs=P2^5;
sbit en=P2^7;
sbit rw=P2^6;
//Si rw Si es está conectado a tierra en el hardware, no es necesario escribir este pin y el siguiente rw=0
//Definir la conexión del pin entre el chip de reloj DS1302 y C51
sbit IO=P3 ^ 6;
Bit SCLK=P3^5;
Bit RST=P3^7;
Bit ACC0=ACC^0;
bit ACC7=ACC^7; //Definir la conexión del pin entre la clave de calibración y C51
Bit key1=P3^2 //clave de configuración
sbit key2=P3; ^3;//añadir clave
sbit key3=P3^4;/ /menos clave
código uchar tab1[]={"20 ///////// /"};//carácter fijo para mostrar el año
código uchar tab2[]={"LOVE :::::"};//carácter fijo para mostrar el tiempo
/ /Función de retardo, a menudo llamada más tarde
void delay(uint xms)//Función de retardo, función de parámetro
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
} p>
/***** *** La función de comando de escritura LCD y la función de escritura de datos se pueden llamar más tarde******************
write_1602com(uchar com) //**** Función de comando de escritura LCD****
{
rs=0 //datos/comando seleccione Establecer como comando; p >
rw= 0; //leer/escribir seleccionar configurar para escribir
P0=com; //alimentar datos
delay(1);
en=1; //habilitar alto en preparación para un flanco descendente válido
delay(1);
en=0;
// es va de mayor a menor para crear un flanco descendente. Comando de ejecución de LCD
}
write_1602dat(uchar dat) //*** Función de escritura de datos de LCD**** p >
{
rs=1; //seleccionar datos/instrucción establecer en datos
rw=0; //leer/escribir seleccionar establecer en escritura
P0=dat; / /datos de alimentación
retraso(1);
en=1; //en se establece en nivel alto para prepararse para el flanco descendente
delay(1);
en=0; alto El nivel cambia a nivel bajo, se produce un flanco descendente y la pantalla LCD ejecuta el comando
}
lcd_init() //*** Función de inicialización de la pantalla LCD****/ /
{
write_1602com(0x38); //Configura el modo de funcionamiento de la pantalla LCD, es decir: visualización de 16*2 líneas, visualización de 5*2 líneas: visualización de 16*2 líneas, 5*7 puntos, datos de 8 bits
write_1602com(0x0c); //Abre la pantalla, no se muestra ningún cursor
write_1602com(0x06); , el cursor se mueve automáticamente hacia la derecha
write_1602com(0x01); //Borrar la pantalla
write_1602com(yh+1); posición de visualización del calendario 1
for(a= 0;a& lt;14;a++)
{
write_1602dat(tab1[a]); la parte del símbolo fijo de la visualización del calendario en la pantalla LCD
}
write_1602com(er+1); // Posición de escritura del símbolo fijo para la visualización de la hora, comenzando desde la segunda posición p>
for(a=0;a<12 ;a++)
{
write_1602dat(tab2[a]);//símbolo fijo de visualización del tiempo de escritura, dos dos puntos
}
}
/******************Subfunción relacionada con DS1302** * *****************/
void write_byte(uchar dat)//escribir un byte
{
ACC=dat;
RST=1;
p>
for(a=8;a>0;a--)
{
IO=ACC0;//equivalente a RRC en ensamblaje
SCLK=0;
SCLK=1;
ACC=ACC >>1;
}
}
}
uchar read_byte() //lee un byte
{
RST=1;
for(a =8;a>0;a--)
{
ACC7 =IO;
SCLK=1;
SCLK= 0;
ACC=ACC>>1;
}
retorno (ACC);
}
>//------------------------ ----------------//
void write_1302(uchar add,uchar dat) //Función para escribir el chip 1302, especifique la dirección de escritura
{
RST=0;
SCLK=0;
RST=1;
escribir_byte(agregar);
write_byte(dat);
SCLK=1;
RST=0;
Escribe en el chip 1302 y especifica la dirección de escritura. .
>}
uchar read_1302(uchar add) // Función de lectura de datos desde 1302, especifique la dirección de origen de los datos leídos
{
uchar temp;
p>RST=0;
SCLK=0;
RST=1;
escribir_byte(agregar);
temp=read_byte();
SCLK=1;
RST=0;
retorno(temp);
}< / p>
uchar BCD_Decimal(uchar bcd)// código BCD a función decimal, entrada BCD, retorno valor decimal
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*1(bcd&=0x0F));
}
//--- - ---------------------------------//
void ds1302_init()// Chip 1302 subfunción de inicialización (2010-01-07, 12:00:00, semana4)
{
RST=0;
SCLK=0; /p>
write_1302(0x8e,0x00);//permitir escritura, deshabilitar protección contra escritura
write_1302(0x8e,0x80);//Activar protección contra escritura
}
//Subfunción de visualización de horas, minutos y segundos
void write_sfm(uchar add,uchar dat)//Escribe horas, minutos y segundos en la pantalla LCD, con la posición de visualización add, ahora mostrar datos, dos parámetros
{
uchar gw,sw;
gw=dat%10;//obtener el dígito único
sw=dat/10; //obtiene diez dígitos
write_1602com(er+add);//er es el valor 0x80x40 especificado en el archivo de encabezado
write_1602dat (0x30 +sw);//dígito+30 para obtener el código de visualización LCD1602 del número
write_1602dat(0x3gw);//dígito+30 para obtener el código de visualización LCD1602 del número
}
//Subfunción de visualización de año, mes y día
void write_nyr(uchar add, uchar dat)//escribe el año, mes y día en la pantalla LCD , hay agregar ubicación de visualización, datos de visualización, dos parámetros
{
uchar gw,sw;
gw=dat%10;//obtener un solo dígito número p>
sw=dat/10;//obtener un número de diez dígitos
write_1602com(yh+add);//Establece la posición de visualización en la primera posición + agregar
write_1602dat (0x3 sw);//dígito + 30 para obtener el código de visualización LCD1602 del número
write_1602dat(0x3gw
); //dígito + 30 para obtener el código de visualización LCD1602 del número
}
void write_week (uchar semana)//función de escritura de semana
{
write_1602com(yh+0x0c);//Muestra la posición del carácter de semana
switch(week)
{
case 1: write_1602dat ('M');//el número de semana es uno, mostrar
write_1602dat('o');
write_1602dat('n');break;
caso 2: write_1602dat('T');//muestra cuando los datos de la semana son dos
write_1602dat(' u');
write_1602dat('e'); break;
caso 3: write_1602dat('W');//los datos semanales se muestran tres veces
write_1602dat('e');
write_1602dat ('d ');break;
caso 4: write_1602dat('T');//se muestran los datos de la semana de cuatro
write_1602dat('h');
write_1602dat('u'); break;
caso 5: write_1602dat('F');//los datos de la semana se muestran a las cinco
write_1602dat('r' );
write_1602dat('i');break;
caso 6: write_1602dat('S');//los datos de la semana se muestran a las seis
write_1602dat(' h');
write_1602dat('u');romper
write_1602dat('u');romper;
caso 6: write_1602dat ('S ');//los datos de la semana se muestran a las seis
write_1602dat('t');
write_1602dat('a');break;
caso 7: write_1602dat(' S');//datos semanales para visualización diurna
write_1602dat('u');
write_1602dat('n');break;
}
}
/****************** Funciones relacionadas con el escaneo del teclado********* ********* ********
anular teclascan()
{
if(clave1==0) //key1 es la tecla de función (tecla de configuración)
{
delay(9);
if(key1==0)// Confirma la tecla nuevamente después del retraso
{
retraso(20);
mientras( ! clave1);
clave1n++;
if(clave1n==9)
clave
1n=1;//Tecla de configuración*** con segundo, minuto, hora, semana, día, mes, año, retorno, 8 ciclos de función
switch(key1n)
{
caso 1: TR0=0;//Apaga el temporizador
write_1602com(er+0x0E);//Establece la segunda posición de presionar la tecla una vez y mostrar el cursor
write_1602com(0x0f);//Establecer cursor parpadeante
temp=(miao)/10*16+(miao)% 10;//Escribir segundos datos de DS1302
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);break;
caso 2: write_1602com(er+11); // presiona la posición fen 2 veces para mostrar el cursor
descanso;
caso 3: write_1602com(er+8);// presione 3 veces, shi
descanso;
caso 4: write_1602com(yh+0x0e);// presione 4 veces, semana
descanso;
caso 5:write_1602com(yh+0);//presione 5 veces, ri
romper;
caso 6:write_1602COM(yh+0x07);//presione 6 veces, yue
break;
Ejemplo 7: Write_1602COM(yh+0x04); //Presiona 7 veces, nian
break;
Ejemplo 8: write_1602com(0x0c);//Presiona la octava vez para configurar el cursor para que no parpadee
TR0=1;//Enciende el temporizador
TR0 = 1;
temp=(miao)/10*16+(miao)%10;
escribir_1302(0x8e,0x00);
escribir_1302(0x80, 0x00|temp);//write_1302(0x80,0x00|temp);//miao data temp);//miao data escritos en DS1302
write_1302(0x8e,0x80);break;
}
}
}
//-------------------- - --------- Agregar clave clave2---- ------------------------//
si (clave1n! =0) //Cuando el botón 1 presiona el siguiente botón.
Las siguientes teclas solo son efectivas cuando se presionan nuevamente (el número de pulsaciones de teclas no es igual a cero)
{
if(key2==0)//Tecla arriba
{
retraso(10);
if(key2==0)
{
retraso(20) ;
while( !key2);
switch(key1n)
{
caso 1: miao++;//Establecer para ajustar los segundos presionando la tecla una vez
if(miao==60)
miao=0;
write_sfm(0x0D,miao);
temp=(miao )/10*16+(miao)%10;
escribir_1302(0x8e,0x00);
escribir_1302(0x80,temp);
write_1302(0x8e ,0x80);
write_1602com(er+0x0E);
romper;
caso 2: fen++;
if(fen= =60)
fen=0;
write_sfm(0x0A,fen);
temp=(fen) /10* 16+(fen)%10 ;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11) ;
romper;
caso 3: shi++;
if(shi==24)
shi =0;
write_sfm(7,shi);
temp=(shi)/10*16+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+ 8);
descanso;
caso 4: semana++;
if(semana==8)
semana=1;
write_1602com (yh+0x0C);
write_week(semana);
temp=(semana)/10*16+(semana) %10; p>
write_1302( 0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh +0x0e);
break;
caso 5: ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;
write_1302(0x8e, 0x00) ;
write_1302(0x86,temp);
write_1302(0x8e,0x80);
write_1602com(yh+10);
break;
caso 6: yue++;
if(yue==13)
yue=1;
write_nyr(6, yue);
tem
p=(yue)/10*16+(yue)%10;
write_1302(0x8e,0x00);
write_1302(0x88,temp);
write_1302(0x8e,0x80);
write_1602com(yh+7);
romper;
caso 7: nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);
temp=(nian)/10*16+( nian)%10;
write_1302(0x8e,0x00);
write_1302(0x8c,temp);
write_1302(0x8e,0x80);
write_1602com(yh+4);
descanso;
}
}
}
/-- ---------------- Tecla de resta key3, para conocer la función de cada oración, consulte el comentario "Agregar clave" -------------- -
if(key3==0)
{
delay(10);
//Ajusta el retardo y elimina la fluctuación
if (key3==0)
{
retraso(20);
while(!key3);
interruptor(key1n)
{
caso 1: miao--;
if(miao==-1)
miao=59;
p>
write_sfm(0x0D,miao);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_ 1602com(er +0x0E);
romper ;
caso 2: fen--;
if(fen==-1)
fen =59;
write_sfm( 10,fen);
temp=(fen)/10*16+ (fen)%10;
write_1302(0x8e ,0x00);
write_1302 (0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
romper;
caso 3: shi--;
if(shi==-1)
shi=23;
write_sfm(7,shi);
temp=(shi)/10*16+(shi)%10;
write_1602com(0x8e,0x00);
write_1302(0x84,temp);
p>write_1302(0x8e,0x80);
write_1602com(er+8);
romper;
caso 4.semana--;
if(semana==0)
semana=7;
write_1602com(yh+0x0C );
write_week(semana);
temp=(semana)/10*16+(semana)
%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
romper;
caso 5: ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;//DS1302 necesita convertirse decimal Convertir a código DCB