Re: tlačítko a zákmity
Michal HW
michalgregor@centrum.cz
Pátek Červen 23 14:09:15 CEST 2006
Dnes zkousim obsluhu klavesnice v C. Jeste to asi bude chtit doladit casy v
praxi, ale zda se ze to funguje.
Ctyri klavesy, dlouhy stisk - pro opakovani. Dve klavesy spolu neresim:
//časování klávesnice - po 10mS
#define K_KEY_CAS_OPAKUJ 9; // čas opakování kláves po dlouhém stisku
#define K_KEY_CAS_KRATKY 9; // čas pro stisk klávesy
#define K_KEY_CAS_DLOUHY 150; // čas pro dlouhý stisk klávesy
volatile static near u08 Key_Cas=K_KEY_CAS_KRATKY; //časování kláves
volatile static near u08 Key_Klavesa=0; //Vyhodnocena klávesa
volatile static near u08 Key_Posledni=0; //Minule stisklá klávesa
volatile static near u08 Task_Key=0; //úloha
volatile static near bit Key_Dlouho; //Dlouhý stisk
/*---------------------------------------------------------*/
// Klávesnice
Pom_ISR=0;
if (Tlacitko1==0) Pom_ISR=1;
if (Tlacitko2==0) Pom_ISR=2;
if (Tlacitko3==0) Pom_ISR=3;
if (Tlacitko4==0) Pom_ISR=4;
if (Pom_ISR==0) {
//Žádná klávesa - inicializace
Key_Klavesa=0;
Key_Posledni=0;
Key_Cas=K_KEY_CAS_KRATKY;
Key_Dlouho=0;
Task_Key=0;
}
else {
switch (Task_Key) {
/*---------------------------------------------------------*/
//Tady se čeká na první stisk klávesy
case 0:
Key_Posledni=Pom_ISR;
Task_Key=1;
break;
/*---------------------------------------------------------*/
//Tady se kontroluje po dobu K_KEY_CAS_KRATKY stisk klavesy
case 1:
if (Key_Posledni==Pom_ISR) {
if (--Key_Cas==0) {
//Platný stisk
Key_Klavesa==Key_Posledni;
Key_Cas=K_KEY_CAS_DLOUHY;
Task_Key=2;
} //if (--Key_Cas
} // if (Key_Posledni
else {
//Chyba - jiná klávesa, testovat znovu
Key_Klavesa=0;
Key_Posledni=0;
Key_Cas=K_KEY_CAS_KRATKY;
Key_Dlouho=0;
Task_Key=0;
} // else
break;
/*---------------------------------------------------------*/
//Tady se kontroluje po dobu K_KEY_CAS_DLOUHY dlouhý stisk klávesy
case 2:
if (Key_Posledni==Pom_ISR) {
if (--Key_Cas==0) {
//Platný stisk
Key_Klavesa==Key_Posledni;
Key_Cas=K_KEY_CAS_KRATKY;
Key_Dlouho=1;
Task_Key=3;
}
} // if (Key_Posledni==Pom_ISR)
else {
//Chyba - jiná klávesa, testovat znovu
Key_Klavesa=0;
Key_Posledni=0;
Key_Cas=K_KEY_CAS_KRATKY;
Key_Dlouho=0;
Task_Key=0;
} // else
break;
/*---------------------------------------------------------*/
//Tady se kontroluje po dobu K_KEY_CAS_KRATKY opakování stisku klávesy
case 3:
if (Key_Posledni==Pom_ISR) {
if (--Key_Cas==0) {
//Platný opakovaný stisk
Key_Klavesa==Key_Posledni;
Key_Cas=K_KEY_CAS_KRATKY;
}
} // if (Key_Posledni==Pom_ISR)
else {
//Chyba - jiná klávesa, testovat znovu
Key_Klavesa=0;
Key_Posledni=0;
Key_Cas=K_KEY_CAS_KRATKY;
Key_Dlouho=0;
Task_Key=0;
} // else
break;
/*---------------------------------------------------------*/
default:
Task_Key=0;
break;
} //switch (Task_Key)
} //else
Michal Gregor
Další informace o konferenci Hw-list