Red de conocimiento informático - Material del sitio web - Máquina ensambladora de calendario perpetuo multifuncional

Máquina ensambladora de calendario perpetuo multifuncional

Hola, si se puede utilizar el microcontrolador, lo programaré directamente para ti.

# include ltreg52.h gt

#Definición N 4

typedef carácter sin signo uchar

typedef unidad entera sin signo;

sbit sclk = p3^2; //Pin de línea de reloj en tiempo real

sbit io = p1^6; //Pin de línea de datos de reloj en tiempo real

sbit rst = p3^7; //Pin de línea de reinicio del reloj en tiempo real

sbit clk=p0^2;

sbit data=p0^3;

sbit ACC 0 = acc^0;

sbit ACC 7 = acc^7;

uchar cod[N], tab[]={0xb7, 0x90, 0x3d, 0xb9, 0x9a , 0xab, 0xaf, 0xb0, 0xbf, 0x bb};

uchar qq

/******************** ** *******************

//Nombre del grupo de funciones: grupo de funciones cci

//Función: escaneo 4 *4 Teclado, valor de retorno.

//Parámetros de función: Ninguno

//Valor de retorno de la función: valor del teclado

//Descripción: un valor de 16 significa que no hay entrada.

******************************************/

Retraso no válido (tiempo de uchar)

{

uchar i, j

for(I = tiempo; i gt0; i -)

for(j = 25;j gt0;j-);

}

clave uchar (no válida)

{

uchar ucTemp1, ucTemp2

P2 = 0xf 0; // Baja primero todas las líneas de fila.

Delay(1);

If ((P2 amp; 0xf0)!= 0xf0) //Si la línea de la columna cambia

{

Delay(1); //El retraso es de unos 10 ms.

If ((P2 amp; 0xf0)!= 0xf0) //Si la línea de la columna todavía está cambiando en este momento, significa que efectivamente hay un botón.

{

uctemp 1 = P2

P2 = 0x0f;

UC temp 2 = P2; >Return UC temp 1 | UC temp 2; //Devuelve el código de identificación El código de identificación se calcula según el algoritmo de la declaración anterior.

//Cada código de identificación corresponde a una clave, y un * * * tiene 16 códigos de identificación.

}

}

Devuelve 0x00 //Si no hay ningún botón, devuelve 0.

}

Uchar·CCI

{

uchar a = 0;

a = Clave () ; //Valor de retorno del teclado

Interruptor (a)

{

Caso 0x7e: Devolución 3 //Correspondiente a cada valor de retorno del teclado;

Caso 0xbe: devuelve 7; romper

caso 0xde: devuelve 11;

Caso 0xee: devuelve 15; p> p>

Caso 0x7d: devuelve 2;

Caso 0xbd: devuelve 6;

Caso 0xdd: devuelve 10; p> Caso 0xed: devuelve 14;

Caso 0x7b: devuelve 1;

Caso 0xbb: devuelve 5; return 9 ;Break;

Caso 0xeb: Devuelve 13;Break;

Caso 0x77: Devuelve 0;Break;

Caso 0xb7: Devuelve 4;Break;

p>

Caso 0xd7: devuelve 8; descanso

Caso 0xe7: devuelve 12; /Regresar 16 sin pulsar una tecla

}

}

/********************* ******* ****************

//Nombre del grupo de funciones: función Shixian (visualización)

// Función: mostrar una cadena.

//Parámetros de función: la dirección del encabezado de la cadena

//Valor de retorno de la función: Ninguno

//Descripción: solo se pueden usar cadenas de cuatro dígitos entró.

********************************************* *** */

Void xsq(void) //Función de visualización

{

uchar a, b, c, d

<; p>for (d = 20; d; d -)

{

c = 0xe0//c asigna valor inicial

for(a = 0; a lt4; a )

{

P0 = 0x00

QQ = cod[a] //El valor enviado al registro

for (b = 8; b gt0; b-) // Envía ocho números al registro.

{

data = (bit)(qq amp0x 80);

clk = 0; //Haz un pulso uno * * * ocho.

clk = 1;

qq = qq lt lt1; //qq cambio

}

P0 = ~ c; Controla el tubo digital para encenderlo.

Retraso (1); //Retraso

c = (c lt; lt1)| 0x 10; //Tubo digital de control de cambios

}

}

}

Voidfz (uchar a [], uchar cod [], uchar b)//La función de asignación asigna el valor de a a cod.

{

uchar i, c = b-1;

for(I = 0; i ltb; I , c-)//Cambiar A's The Los primeros números se asignan al bacalao.

{

cod[3-I]= a[c]

}

for(;iltn;i)

{

cod[3-I]= 0x 00; //No muestra los primeros valores de //cod.

}

xsq();

}

/*************** *** ****************************

//Nombre del grupo de funciones: función xszh (conversión de pantalla)

//Función: convierte un carácter uchar en un número sin signo que se puede generar.

//Parámetros de función: número de caracteres

//Valor de retorno de función: número de caracteres sin signo

//Descripción: solo se pueden ingresar de 0 a 9 personajes entre.

********************************************* *** */

/*uchar xszh(uchar a) // Función de conversión de pantalla, convierte una matriz de tipo uchar en una matriz de tipo uchar para su visualización.

{

Cambiador (a)

{

Caso 0: Devuelve 0xb7 para romper;

Caso 1: Devuelve 0x90 para romper;

Caso 2: Devuelve 0x3d para romper;

Caso 3: Devuelve 0xb9 para romper;

Caso 4: Devuelve 0x9a a break;

Caso 5: Devuelve 0xab al break;

Caso 6: Devuelve 0xaf al break;

Caso 7: Devuelve 0xb0 al break;

Caso 8: Devolución 0xbf rota;

Caso 9: Devolución 0xbb rota

}

}*/

/******* *************************************

//Nombre del grupo de funciones: función Shi Xian (Pantalla)

//Función: convierte la cadena uchar en una cadena sin firmar que se puede generar.

//Parámetros de función: la dirección del encabezado de la cadena, el número de dígitos válidos en la cadena.

//Valor de retorno de la función: Ninguno

//Descripción: solo se pueden ingresar cadenas de cuatro dígitos.

********************************************* *** */

Void Shixian (uchar a[], uchar i) //Para convertir los números que se mostrarán y asignarlos a la matriz de cod, debe ingresar la cantidad de números y números asignado a la matriz.

{

uchar b, c[N];

for(b = 0; b lt i; b )

{

c[b]= tab[a[b]]; /* xszh(a[b] *///Convierte el valor de la matriz A al valor de salida de la función C.

}

fz(c, cod, I);

}

Void RTInputByte(uchar d) //Escribe un dato al 1302.

{

Uchar I;

ACC = d;

for(I = 8; I gt0; I -)

p>

{

IO = ACC0 // Equivalente a RRC en ensamblador.

SCLK = 0;

SCLK = 1;

ACC = ACC gt gt1

}

}

Uchar RTOutputByte(void) //Leer datos de 1302.

{

Uchar I;

for(I = 0; I lt8; i)

{//Equivalente a RRC en asamblea.

ACC7 = IO

SCLK = 1

SCLK = 0

ACC = ACC gt gt1

}

SCLK = 1;

Retorno (ACC);

}

Nulo w1302 (ucharuccaddr, ucharucda)// El primer byte es el comando y el último byte son los datos.

{

RST = 0;

SCLK = 0;

RST = 1; UC addr); //Dirección, comando

RTInputByte(ucDa); //Escribir datos de 1 byte

SCLK = 1;

RST = 0 ;

}

uchar R1302(uchar ucAddr)

{

uchar ucData

RST = 0

SCLK = 0;

RST = 1;

RTInputByte(UC addr); //Dirección, comando

Datos UC = RTOutputByte( ); //Leer 1 byte de datos

SCLK = 1;

RST = 0;

return(datos UC);

}

Administrador no válido (no válido)

{

uchar i, c=0, claves=17, da;

uchar a[N];

W1302(0x8f, 0x 00);

W1302(0x8e, 0x 00); //Activar protección contra escritura

W1302( 0x80, 0x 00);

While (1) //Ingresa al bucle.

{

If (cci()!=keys) //Requiere que cada entrada sea diferente de la anterior para evitar una entrada continua.

{

keys = CCI(); //Registrar valor de clave

If(keys==10) //Presione 10 para mostrar el año.

{

mientras(1)

{

W1302(0x8e, 0x 00);

da = r 1302(0x8d); //Leer datos en el registro del año

a[0]= 2;

a[1]= 0;

a[2]=(da amp;0xf 0)/16;

a[3]=(da amp;0x0f); // Decimalizarlo en las últimas cuatro oraciones y registrar el valor de la clave

I = 4;

ShiXian(一,I); //Mostrar

teclas = CCI();

if(claves== 14)

{

for(I = 2;ilt4;)

{

si (CCI() lt; 10)

{

teclas = CCI();

a[I]=teclas;

i ;

mientras(1)

{

if(cci()==16)

Descanso;

Shi Xian (uno, yo);

}

}

Shi Xian (uno, yo);

}

W1302 (0x8e, 0x 00);

W1302(0x8c, (a[2]* 16)| a[3]);

}

if( claves gt; 10. ampkeys lt14)

break;

}//Registre los dígitos válidos del valor de la clave.

}

If(keys==11) //Presione 11 para mostrar el mes y el día.

{

mientras(1)

{

W1302(0x8e, 0x 00);

da = r 1302(0x 89); //Leer datos en el registro del mes

a[0]=(da amp;0xf0)> gt4;

a[1]= ( da amp; 0x0f);

W1302(0x8e, 0x 00);

da = r 1302(0x 87); //Leer datos del registro del día

a[2]=(da amp; 0xf0)> gt4;

a[3]=(da amp; 0x0f); //Registrar valor de clave

I = 4 ;

Shixian(一,我);

claves = CCI();

if(claves==14)

{

for(I = 0;i lt4;)

{

if(CCI() lt;10)

{

teclas = CCI();

a[I]=clave;

i;

mientras(1)

{

if(cci()==16)

Romper;

Shixian(一,我);

}

}

Shixian(一,我);

}

W1302 (0x8e, 0x 00) ;

W1302(0x88, (a[0]* 16)| a[1]);

W1302(0x86, (a[2]* 16)| a[3 ]);

}

if(teclas = = 10 | | teclas = = 12 | | teclas = = 13)

Romper;

}/ / Registre los números válidos del valor clave.

}

If(keys==12) //Presione 12 para mostrar la hora.

{

mientras(1)

{

W1302(0x8e, 0x 00);

da = r 1302(0x 85); //Leer datos del registro del reloj

a[0]=(da amp;0xf0)> gt4;

a[1]=( da amp; 0x0f);

W1302(0x8e, 0x 00);

da = r 1302(0x 83); //Leer datos en el subregistro

a[2]=(da amp; 0xf0)> gt4;

a[3]=(da amp; 0x0f); //Registrar valor de clave

I = 4 ;

Shixian(一,我);

claves = CCI();

if(claves==14)

{

for(I = 0;i lt4;)

{

if(CCI() lt;10)

{

claves = CCI();

a[I]=clave;

i;

mientras(1)

p>

{

if(cci()==16)

Romper

Shixian(一,我);

}

}

Shixian(一,我);

}

W1302(0x8e, 0x 00); p>

W1302(0x84, (a[0]* 16)| a[1]

W1302(0x82, (a[2]* 16)| a[3] );

}

if(teclas = = 10 | | teclas = = 11 | | teclas = = 13)

Romper;

}// Registre los números válidos del valor clave.

}

If(keys==13) //Presione 13 para mostrar los segundos.

{

mientras(1)

{

W1302(0x8e, 0x 00);

da = r 1302(0x 81); //Leer datos en el segundo registro

a[0]= 0;

a[1]= 0;

a[2]=(da amp; 0xf0)> gt4;

a[3]=(da amp; 0x0f); //Registrar valor de clave

I = 4;

Shixian(一,我);

claves = CCI();

if(claves==14)

{

for(I = 2;i lt4;)

{

if(CCI() lt;10)

{

teclas = CCI();

a[I]=clave;

i;

mientras(1)

{

if(cci()==16)

Romper;

Shixian(一,我);

}

}

Shixian(一,我);

}

W1302 (0x8e, 0x 00) ;

W1302(0x80, (a[2]* 16)|a[3]);

}

if(teclas gt; 9 amp ampkeys lt13)

Descanso;

}//Registre los números válidos del valor clave.

}

}

Shixian(一,我); //Mostrar una matriz

}

}