Utilice el lenguaje C del microcontrolador para controlar el bloqueo de contraseña de 6 dígitos. Se requiere tener una clave clara y una clave de confirmación, y sonará una alarma si la contraseña se ingresa incorrectamente. Expertos por favor ayuden
Encontré uno en la "Enciclopedia de desarrollo de tecnología de aplicaciones en lenguaje C 51 microcontroladores"
Se está dibujando el diagrama SCH. . .
#include
typedef unsigned char uchar; //Definición de tipo, define el tipo uchar
typedef unsigned int uint; // Definición de tipo, definir tipo uint
//Instrucciones relacionadas con la subrutina del teclado.
#define BLANKCHAR 10 //Definir constantes en blanco
#define PCHAR 11 //Definir constantes de caracteres P
#define OPENCHAR 12 //Definir constantes de caracteres de desbloqueo
#define ALARMCHAR 13 //Definir carácter A constante
#define LINECHAR 14 //Definir carácter-constante
#define BACKKEY 0X0D //Definir tecla de retroceso constante
#define ENTERKEY 0X0F //Definir clave de confirmación constante
#define LOCKKEY 0X0E //Definir clave de bloqueo constante
#define NO_KEY 20 //Definición No valor de retorno de clave
#define KEYPORT P2 //Definir puerto de teclado
//Delay1Ms
void Delay1Ms()
{< / p>
uint i;
for (i=0;i<1000;i++);
}
//Definir código de escaneo de clave Cuándo se escanea la clave de la tabla, las líneas de columna de 4 bits y las líneas de fila de 4 bits forman una tabla de datos de bytes
código uchar KEYCODE[]=
{0XEE,0XED,0XEB,0XE7 ,
p>0XDE,0XDD,0XDB,0XD7,
0XBE,0XBD,0XBB,0XB7,
0X7E,0X7D,0X7B,0X77};
uchar KeyPre; //Guarda el valor clave de la última clave escaneada
uchar KeyUp
//Se utiliza para controlar la operación de rebote de claves. 1: Antirrebote al escanear 2: Esperando liberación 3: Antirrebote al soltar.
#define LEDPORT P0 //Definir el puerto de salida del código de segmento de visualización
#define LEDCON P1 //Definir el puerto de control de bits de visualización
uchar code SEGCODE[ ]=
{0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,//*** código de ánodo de 0~9
0xff, // ***Código de segmento de ánodo que no se muestra
0X8C, //*** código de segmento de ánodo del carácter P
0X8F, //*** código de segmento de ánodo de ┝ p>
0X88, //*** código de segmento de ánodo del carácter A
0XBF, //*** código de segmento de ánodo del carácter -
};
//Definir código de control de código de bits LED
uchar code BITCODE[]={0Xfe,0Xfd,0Xfb,0Xf7,0Xef,0Xdf,0Xbf,0X7f}
;uchar DispBuf[6]; //Guarda los caracteres mostrados
bit DispNormal; //Controla si se muestra normalmente o parpadea cuando se muestra.
uchar DispCnt; //Controla la frecuencia de la visualización parpadeante.
#define SHORT_TIME 10 //El timbre suena durante 200 ms
#define LONG_TIME 100 //El timbre suena durante 2 s
#define LONGER_TIME 9000 //El suena el timbre El timbre suena durante 3 minutos
sbit ALARMCON=P3^4; //Definir el pin de control de alarma
bit AlarmEnable //Si hay una alarma o un mensaje de sonido
uint AlarmTime; //Controla la duración del tiempo de alarma
sbit LOCKCON=P3^3 //Define el pin de control de la cerradura electrónica
uchar code PassWord[] ={1,2,3 ,4,5}; //Definir la tabla de contraseñas inicial
uchar PassInBuf[6] //Guardar los caracteres de contraseña ingresados
uchar PassPosi; // Los caracteres de contraseña ingresados por el usuario se almacenan en la ubicación de PassInBuf [].
bit TimerBit; //El temporizador de 20 ms expira
uchar SysMode; //El sistema está en modo 0: Ingrese la contraseña modo 1: Modo de alarma 2: Modo de desbloqueo
uchar ErrorCnt; //El número de veces que el usuario cometió errores de contraseña consecutivos.
/*
Parámetros de entrada:
FillChar: caracteres escritos en el buffer
Parámetros de salida: Ninguno
*/
void Fill_Buf(uchar FillChar)
{
uchar i;
for(i=0;i< 6 ;i++)
{
DispBuf[i]=FillChar;//Rellenar DispBuf[i] con el carácter FillChar
PassInBuf[i]=FillChar; /Rellenar PassInBuf con el carácter FillChar [i]
}
}
void Fill_Buf_P()
{
Fill_Buf(BLANKCHAR); // DispBuf[1..5]= ' '
DispBuf[0]=PCHAR; // DispBuf[0]='P'
}
void Fill_Buf_O()
{
Fill_Buf(BLANKCHAR) // DispBuf[1..5]= ' '
DispBuf[0]=OPENCHAR; // DispBuf[0]='┝'
}
void Fill_Buf_A()
{
Fill_Buf(LINECHAR); // DispBuf[1..5]= ' -----'
DispBuf[0]=ALARMCHAR; // DispBuf[0]='A' p >
}
/*
Parámetros de entrada:
DispPosi: Número de LED para mostrar datos.
DispChar: El contenido que se mostrará.
Parámetros de exportación: Ninguno
*/
void Disp_Led_Sin(uchar DispChar,uchar DispPosi)
{
LEDPORT=SEGCODE[DispChar];//Código de segmento de visualización de salida
LEDCON&=BITCODE[DispPosi];//Código de bits de visualización de salida
Delay1Ms() //Retraso 1MS
LEDCON|=0X3F;//Apagar la pantalla
}
/* (2) Apagar la función de visualización Disp_Led_OFF.
La función Disp_Led_OFF muestra caracteres en blanco en la pantalla y se utiliza principalmente para la visualización parpadeante. La función logra la funcionalidad requerida llamando a Disp_Led_Sin 6 veces.
El código es el siguiente: */
void Disp_Led_OFF()
{
uchar i;
LEDCON|=0X3F;/ / Apagar la pantalla
for(i=0;i<6;i++)
{
Disp_Led_Sin(BLANKCHAR,i);//Pantalla en blanco caracteres uno por uno
}
}
void Disp_Led_All()
{
uchar i;
LEDCON |=0X3F; // Apagar la pantalla
for(i=0;i<6;i++)
{
Disp_Led_Sin(DispBuf[i],i ); //Mostrar el valor en DispBuf[]
}
}
void Disp_LED()
{
DispCnt++;
DispCnt%=10;
if(DispCnt==0)
{ p>
DispNormal=~DispNormal ;//Invierte el bit de control de visualización parpadeante en 200 ms
}
if(SysMode==1)
{ //Modo de alarma, pantalla parpadeante
p>if(!DispNormal)
{
Disp_Led_OFF();//Mostrar caracteres en blanco
return;
}
}
Disp_Led_All();//Mostrar el valor en DispBuf[]
} p>
/*
Parámetros de entrada:
stime: tiempo del sonido del timbre.
Parámetros de exportación: Ninguno
*/
void Sys_Speaker(uint stime)
{
AlarmEnable= 1;//Alarma permitida
AlarmTime=stime;//Duración del tiempo de alarma
}
void Sys_Alarm()
{
if(AlarmEnable==1)
{//Permitir alarma
ALARMCON=0;//Alarma
AlarmTime-- ;
if(AlarmTime==0)
{//Detener hora de alarma
AlarmEnable=0;
ALARMCON=1; //Desactivar alarma
if(SysMode==1)
{//Cuando la alarma ocurre en modo 1, regresa al modo 0
SysMode=0
Fill_Buf_P();//Mostrar P
}
}
}
} p >
/*
Parámetro de entrada: ninguno
Parámetro de salida: valor clave o sin clave
*/
uchar Find_Key ()
{
uchar KeyTemp,i;
KEYPORT=0xf0;// La línea de fila genera 0 y la línea de columna genera todos 1
KeyTemp=KEYPORT;//Leer el valor del puerto clave
if(KeyTemp==0xf0)
return NO_KEY;//No se presiona ninguna tecla, regresar
KEYPORT=KeyTemp|0x0f;//Salida de línea de columna, entrada de línea de fila
KeyTemp=KEYPORT;//Leer valor de puerto clave
for(i=0;i <16 ;i++)
{
if(KeyTemp==KEYCODE[i])//Encuentre el valor de la clave según el valor de escaneo del puerto clave
return i;/ /Devolver valor clave
}
return NO_KEY;
}
/*
Parámetro de entrada: Ninguno
Parámetros de exportación: valor clave o sin clave
*/
uchar Scan_Key()
{
uchar KeyTemp;
KeyTemp=Find_Key();//Escanea el teclado y obtén el valor de la clave
if(KeyTemp==NO_KEY)
{
if(KeyUp<2)
{//No se presiona ninguna tecla, regresa
KeyUp=0;
regresa NO_KEY ;
}
if(KeyUp==2)
{//Para soltar la tecla, retrasa el rebote
KeyUp= 3;
return NO_KEY;
}
if(KeyUp==3)
{//Suelta la clave y devuelve el valor clave
KeyUp=0;
devolver KeyPre;
}
}
más
p>
{
if(KeyUp==0)
{//Cuando se presiona una tecla, guarda el valor de la clave
KeyUp=1 ;
KeyPre=KeyTemp;
}
else if(KeyUp==1)
{//Después del rebote, detectar nuevamente Se presiona una tecla
if( KeyPre==KeyTemp)
KeyUp=2;
else
KeyPre=KeyTemp; p> p>
} else if(KeyUp==3)
{//Esperar a que se suelte la tecla
KeyUp=2;
}
}
return NO_KEY;
}
/*
Parámetros de entrada:
Clave: Valor clave
Parámetros de exportación: Ninguno
*/
void Key_Process(uchar Key)
{
uchar i;
if(Key==NO_KEY)
return ;// Sin clave, sin procesamiento
switch(SysMode)
{
caso 0://Ingresar contraseña
interruptor(Clave)
{
caso 0: p>
caso 1:
caso 2:
caso 3:
caso 4:
caso 5: p>
caso 6:
caso 7:
caso 8:
caso 9:
DispBuf[PassPosi]= LINECHAR;/ /Mostrar '-'
PassInBuf[PassPosi]=Key;//Guardar la contraseña ingresada por el usuario
if(PassPosi<5)
PassPosi++;// Ajustar la posición de entrada de la contraseña
Sys_Speaker(SHORT_TIME);//Enviar tono de tecla
break;
case BACKKEY://Tecla de retroceso
DispBuf[PassPosi]=BLANKCHAR;//Display ' '
PassInBuf[PassPosi]=BLANKCHAR;//Borrar la contraseña de la ubicación actual
si (PassPosi>1)
PassPosi--;//Ajustar la posición de visualización
Sys_Speaker(SHORT_TIME);//Enviar tono de tecla
pausa; p>
case ENTERKEY://Botón Confirmar
for(i=0;i<5;i++)
{//Compara la contraseña ingresada por el usuario con la contraseña predeterminada del sistema
if(PassInBuf[i+1]!=PassWord[i]
)
break;
}
if(i>=5)
{//Introduce la contraseña correctamente
Fill_Buf_O();//Mostrar estado de desbloqueo
PassPosi=1;
LOCKCON=1;//Desbloqueo
ErrorCnt=0; p >
Sys_Speaker(LONG_TIME);//Enviar un tono de aviso largo
SysMode=2;//Cambiar al modo 2
}
else
{
ErrorCnt++;//El número de errores más uno
if(ErrorCnt>2)
{//El número de errores excede 3 veces
ErrorCnt=0;
Fill_Buf_A();//Mostrar estado de alarma
PassPosi=1;
Sys_Speaker(LONGER_TIME);//Enviar sonido de alarma
SysMode=1;
}
else
{//El número de errores es menor que 3, el usuario vuelve a ingresar
Fill_Buf_P();
PassPosi=1;
Sys_Speaker(LONG_TIME);
}
}
pausa;
case LOCKKEY://Bloquear tecla
Fill_Buf_P();//Mostrar P
PassPosi=1; p>
Sys_Speaker(SHORT_TIME);
descanso
}
descanso; p>
caso 2://estado de desbloqueo
if(Key==LOCKKEY)
{//El usuario presiona el botón de bloqueo
Fill_Buf_P ();
SysMode=0 ;
LOCKCON=0;//Bloqueo
Sys_Speaker(SHORT_TIME);
} p>
descanso;
}
}
void Ini_Timer0()
{
TMOD& =0XF0;
TMOD|= 0X01;//Inicializar T0, modo 1
TR0=0;
TH0=(65536-20000)/256; //T0 asigna valor de recuento inicial
TL0=(65536-20000)%256;
TR0=1;//Iniciar T0
ET0=1; //Permitir interrupción T0
}
void Timer0() interrupción 1
{
TR0=0;
TH0=(65536-20000)/256
; //T0 asigna valor de conteo inicial
TL0=(65536-20000)%256;
TR0=1
TimerBit=1;//Timing Se acabó el tiempo
}
void Ini_System()
{
PassPosi=1;
LOCKCON= 0 ;//Enclavamiento
Ini_Timer0();//Inicializar T0
Fill_Buf_P();
EA=1;//Permitir interrupción del sistema
}
void main()
{
uchar KeyTemp;
Ini_System();
while(1)
{
if (TimerBit==1)
{//El cronómetro ha terminado
Disp_LED () ;//Actualizar la pantalla
Sys_Alarm();//Procesamiento de alarma
KeyTemp=Scan_Key();//Escanear la clave
Key_Process( KeyTemp);/ /Procesamiento de botones
TimerBit=0;
}
}
}