Programa de temporizador de microcontrolador que busca puntuación alta

Escrito en la placa STC89C52, implementado a través de DS1602, e incluye la función del teclado matricial

#include

#define uchar unsigned char

#define uint unsigned int

tabla de códigos uchar[]="reloj ME-400-A";

tabla de códigos uchar1[]=" - - :--:-- ";

tabla de códigos uchar2[]="ALL:00:00:-- ";

tabla de códigos uchar3[]=" ";< / p>

uchar clk_time[3]; //Valor inicial del registro de segundos, minutos y horas

sbit T_RST=P2^2;//ds1302-5

sbit T_IO = P2^3;//ds1302-6

sbit T_CLK=P2^4;//ds1302-7

sbit en=P2^5 //Consulte la instrucción LCD1602; archivo para usar la señal de energía

sbit rw=P2^6 //. . . . . . . . , leer y escribir terminal de señal (leer cuando se ingresa una frecuencia de alta potencia, escribir cuando se ingresa baja potencia)

sbit rs=P2^7; . . . . . . .

, terminal de selección de datos/comandos (H/L)

sbit led=P1^0;

sbit dula=P1^1;

sbit wela=P1 ^2;

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;

sbit arriba=P3^3;

sbit down=P3^4;

sbit set=P3^2;

sbit did=P1^4;

uchar num,clock_ss,clock_sg ,clock_fs,clock_fg,clock_ms,clock_mg,b,clock_s,clock_g;

char hora,mie,sei,c,nhora,nmie,shour,smie;

/*** ***************DS1302: Operación de escritura (flanco ascendente)************************/

void write_byte(uchar da)

{

uchar i;

ACC=da;

for(i =8 ;i>0;i--)

{

T_IO=ACC0;

T_CLK=0

T_CLK=; 1;

ACC=ACC>>1;

}

}

/********** ** ******DS1302: Operación de lectura (flanco descendente)****************/

uchar read_byte(void)

{

uchar i;

for(i=0;i<8;i++)

{

ACC=ACC >>1;

T_CLK = 1;

T_CLK = 0;

ACC7 = T_IO;

}

return(ACC);

}

/******************DS1302: escribir datos (enviar dirección primero, luego escribe datos)******************************/

void write_1302(uchar addr,uchar da)

{

T_RST=0; //Deja de funcionar

T_CLK=0; //Solo cuando CLK es bajo, RST se puede configurar en ping de alta potencia, entonces los datos se pueden transmitir

T_RST=1; //Reelaborar

write_byte(addr); //Escribir dirección

write_byte(da); p>

T_RST=0;

T_CLK=1;

}

/************ ** ****DS1302: Leer datos (enviar dirección primero, luego leer datos)******************************/

uchar read_1302(uchar addr)

{

uchar temp;

T_RST=0;

/Dejar de funcionar

T_CLK=0

T_RST=1; //Reiniciar trabajo

write_byte(addr); //Escribir dirección

temp=read_byte();

T_RST=0;

T_CLK=1; //Dejar de funcionar

return(temp);

}

/************************Programa de retardo=a*1ms******* * ******************************/

retraso nulo (uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y > 0;y--);

}

void fn()

{

did=0;

retraso(120);

hizo=1;

retraso(120);

hizo=0;

retraso ( 120);

did=1;

retraso(120);

did=0;

retraso(120); /p>

hizo=1;

retraso(120);

hizo=0;

retraso(320);

did=1;

demora(400);

}

void write_com(uchar com)

{

led=1;

wela=1;

P0=0xff;

retraso(1);

led =0;

wela=0;

P0=0x00;

dula=1;

retraso(1);

p>

dula=0;

rs=0;

P0=com;

retraso(5);

es=1;

demora(5);

es=0;

}

void write_data(uchar date)

{

led=1;

wela=1;

P0=0xff;

retraso(1 ) ;

led=0;

wela=0;

P0=0x00;

dula=1;

retraso(1);

dula=0;

rs=1;

P0=fecha;

retraso( 5 );

es=1;

retraso(5);

es=0;

}

mañana vacía()

{ shour=clock_ss*10

+clock_sg;

smie=clock_fs*1clock_fg;

if(b==0)

{

if(nhora ==shora)

{

if(smie>=nmie)

{

fn();

}

}

}

}

void init()

{

b=0;

P0=0xff;

retraso(5);

led=1;

retraso( 5);

P0=0xff;

led=0;

dula=0;

wela=1;

delay(5);

wela=0;//Apague el tubo digital de la placa de desarrollo ME-400

nhour=0;

nmie= 0;

rw=0;

en=0;

write_com(0x38);//Configurar LCD

write_com (0x0c);//Establece el cursor, etc.

write_com(0x06);//Escribe un carácter y el puntero de dirección aumenta en 1 y el cursor aumenta en 1

write_com (0x01);//Borrar la pantalla

write_com(0x80);//Establecer el puntero de dirección s

}

void display(uchar add,date )

{

if(b==0)

{

clock_ms=clk_time[0]/ 16; [0]%16;

led=0;

clock_fs=clk_time[1]/ 16; clock_fg=clk_time[1]%16;

led =0;

clock_ss= clk_time[2]/ 16; clock_sg=clk_time[2]%16;

write_com(0x80x44);

write_data (0x3clock_ss);

write_com(0x80x45);

write_data(0x3clock_sg);

write_com(0x80x47);

write_data(0x3clock_fs);

write_com(0x80x48);

write_data(0x3clock_fg);

write_com(0x80) +0x4a);

write_data (0x3clock_ms);

write_com(0x80x4b);

write_data(0x3clock_mg);

}

<

p> if(b!=0)

{

clock_s=fecha/ 10; clock_g=fecha%10;

write_com(0x80x4add );

write_data(0x3clock_s);

write_data(0x3clock_g

}

}

void key()

{

uchar clock_s1, clock_s2, clock_f1, clock_f2;

rw=0;

si (set==0)

{

retraso(10);

if(set==0)

{

did=0;

retraso(10); did=1;

b++;

}

mientras (!set);

if(b==1)

{

hora=clock_ss*1clock_sg;

mie =clock_fs*1clock_fg;

write_com(0x80x45);

write_com(0x0f);

}

si( b==2)

{

write_com(0x80x48);

}

if(b==3)

{

write_com(0x80x40);

for(num=0;num<13;num++)

{

write_data(table2[num]);

}

write_com(0x80x45); display(4,nhora);write_com(0x80x45); /p>

}

if(b==4)

{

write_com(0x80x48);

display(7,nmie); write_com(0x80x48);

}

if(b==5)

{

write_com(0x80x40);

for(num=0;num<4;num++)

{

write_data(table3[num]);

}

write_com(0x80x45);

write_com(0x0c);

b=0;

< pag

> clock_s1=hora/10;//Convertir decimal a hexadecimal

clock_s2=hora%10;//Convertir decimal a hexadecimal

clock_s1=clock_s1&0xff;//Decimal Convertir a hexadecimal

clock_s2=clock_s2&0xff;//Convertir decimal a hexadecimal

clock_s1<<=4;//Convertir decimal a hexadecimal

clock_s1=clock_s1|clock_s2;// convertir decimal a hexadecimal

clock_f1=mie/10;//convertir decimal a hexadecimal

clock_f2=mie%10; //Convertir de decimal a hexadecimal

clock_f1=clock_f1&0xff; //Todo 1 de 1 Y operación

clock_f2=clock_f2&0xff;//Convertir de decimal a hexadecimal

clock_f1<<=4;//Convertir decimal a hexadecimal

clock_f1=clock_f1|clock_f2;//Convertir decimal a hexadecimal

write_1302(0x8e,0x00); //WP=0 operación de escritura

write_1302(0x80) ,0x00);//escribir segundos

write_1302(0x82,clock_f1);//escribir minutos

write_1302(0x84,clock_s1);//Escribir tiempo

write_1302(0x86,0x14);//Escribir día

write_1302(0x88,0x02);//Escribir mes

write_1302(0x8a,0x06);//Escribir el día de la semana

write_1302(0x8c,0x09);

write_1302(0x8e,0x80); //WP=1 Protección contra escritura

}

}

si(b!=0)

{

si(arriba ==0)

{

retraso(10);

if(up==0)

{

did=0;

retraso (10);

did=1;

mientras(!up);

if(b==1)

{

hora++;

if(hora>=24)

{

retraso(1);

hora=0;

}

display(4,hora

);

write_com(0x80x45);

}

if(b==2)

{

mie++;

if(mie>=60)

{

mie=0;

}

display(7,mie) ;

write_com(0x80x48);

}

if(b==3)

{

nhora++;

if(nhora>=24)

{

retraso(1);

nhora=0;

}

display(4,nhora);

write_com(0x80x45);

}

if(b==4)

{

nmie++;

if(nmie>=60)

{

nmie=0;

}

display(7,nmie);

write_com(0x80x48);

}

}

}

si(abajo==0)

{

retraso(10) ;

if(down==0)

{

did=0;

retraso(10);

did=1;

while(!down);

if(b==1)

{

hora --;

if(hora<0)

{

hora=23;

}

display(4,hora);

write_com(0x80x45);

}

if(b==2)

{

mie--;

if(mie<0)

{

mie=59;

}

display(7,mie);

write_com(0x80x48);

}

if(b==3)

{

nhora--;

if(nhora<0)

{

nhora=23;

}

display(4,nhora);

write_com(0x80x45);

}

if(b= =4)

{

nmie--;

if(nmie<0)

{

nmie=59;

}

display(7,nmie);

write_com(0x80x48);

}

}

}

}

}

void main()

{

uchar temp=0x80;

uchar i;

init();

for(num=0;num<14;num++ )

{

escribir_datos(tabla[núm]);

retraso(100);

}

write_com(0x80x40); // Establece el puntero de dirección de datos en 0X40

for(num=0;num<15;num++)

{

write_data(tabla1[núm]);

}

/*for(núm=0;núm<16;núm++)

{

write_com(0x18);

retraso(20);

}*/

write_1302(0x8e,0x00); > escribir_1302(0x90,0xa4);

escribir_1302(0x8e,0x80);

mientras(1)

{

si( b ==0)

{ temp=0x81;

for(i=0;i<3;i++)

{

clk_time[i]=read_1302(temp);

temp+=2;

}

display(0x4b,0x00);

}

mañana();

tecla();

}

}