Red de conocimientos turísticos - Conocimientos sobre calendario chino - Problema del buscapersonas del barrio SCM

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()

{

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)

{

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

}