Máquina ensambladora de calendario perpetuo multifuncional
# 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
} p>
}
}
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 ; p>
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 ]); p>
}
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)
{ p>
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
}
}