Red de conocimiento informático - Conocimiento de la instalación - Solicitar programa de microcontrolador 51.

(Reloj electrónico LCD)

Solicitar programa de microcontrolador 51.

(Reloj electrónico LCD)

#include

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

}

/***** *** 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

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

{

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

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

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;

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