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