Problema del buscapersonas del barrio SCM
Análisis de funciones: 1. Pulsa el beeper, la luz se iluminará inmediatamente
2. Pulsa el beeper durante 1 segundo mientras está encendido, la luz se apagará
¿Es esto bueno? 8 teclas requieren 8 máquinas de estado de teclado: aquí solo se hace 1.
#define Byte unsigned char
#define Word unsigned int
#define DWord unsigned long
#define KEYDOWN !K1 // Tecla abajo
#define KEYUP K1 //Tecla arriba
#include lt; at89x52.hgt;
sbit K1=P3^0; .0 a K1
sbit L1=P1^0; //Establece P1.0 en L1
bit fKeyLongPress1;
bit fKeyDown1;
p>bit fKeyUp1;
bit fKey10ms;
////////////////////////// //////////////////////////////////
void Timer_Init();
void KeyboardServer(); //Servicio de teclado
void LampServer(); //Servicio de lámpara
/////////////// //////////////////////////////////////////////
void main(void)
{
Timer_Init();
while(1) //Bucle infinito
{
KeyboardServer();
LampServer();
}
}
void Timer_Init() p>
{
ET2 = 0;
TH0=0xD8; //10ms a 12MHz en modo 1
TL0=0xF0; >
RCAP2H =0xD8;
RCAP2L =0xF0;
ET2 = 1; // interrupción del temporizador2 habilitada
EA = 1;
TR2=1; //Iniciar temporizador
}
void LampServer()
{
if(fKeyDown1) / / Si se presiona el interruptor
{
fKeyDown1 = 0
L1=0 //La luz está encendida
}
if (fKeyLongPress1) //Si el interruptor se mantiene presionado
{
fKeyLongPress1 =0
L1 = 1; /Luz apagada
}
}
void KeyboardServer() //Máquina de estado del teclado
{
Palabra estática cntLongPress= 0;
Byte estático keyState = 0;
Byte estático keyFilter = 0;
if (!fKey10ms) return
fKey10ms =0
switch(keyState)
{
caso 0: //Arriba
if(KEYDOWN)
{
fKeyLongPress1 =0
; fKeyDown1 =0;
keyFilter = 0;
cntLongPress = 0;
keyState
}
break;
caso 1: //Arriba---gt; Abajo
if(KEYDOWN)
{
if( keyFilter gt; =2) //Rebote
{
fKeyDown1 = 1;
keyState; //La tecla efectivamente está presionada
}
}
else
{
keyState-- //Está temblando
}< / p>
break;
caso 2: //Abajo
if(KEYUP)
{
keyFilter = 0 ;
keyState;
}
else
{
if (cntLongPress gt; 1000)// Abajo Si la detección excede 1S, presione prolongadamente
{
cntLongPress=1000 //Evitar desbordamiento
fKeyLongPress1 =1;
}
}
break;
caso 3: //Abajo---gt; arriba
if(KEYUP) p>
{
if( keyFilter gt;=2)
{
fKeyUp1 = 1;
//fKey_Down = 0;
keyState = 0; //La clave está efectivamente levantada
}
}
else
{
keyState--; //Está temblando
}
descanso;
predeterminado:
descanso;
}
}
void ISR_T2(void) interrupción 5
{
TF2 =0 ;
fKey10ms =1
}