?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{FILE START}

library

?curdirlinks? - Rev 3

?prevdifflink? - Blame - ?getfile?

// KBD modul pro zpracovani tlacitek pripojenych na portu B pod prerusenim od zmeny stavu tohoto portu
// (c)miho 2002
//
// Historie:
//
// 0.0   Uvodni verze
// 0.1   Doplnena funkce kbd_waitc()
//
//
// Funkce:
//
//   kbd_init()            inicializace
//
//   kbd_getch()           vraci kod stisknuteho tlacitka (dle masek KBD_K1 az KBD_K4) nebo 0 (klidovy stav)
//
//   kbd_waitc()           cekej na stisk klavesy
//
//   kbd_key               v teto promenne je kod posledni nepredane klavesy (v klidu 0)
//
//
// Predpoklady:
//
//   Porty pro pripojeni tlacitek jsou definovany jako vstupy (to je stav po resetu soucastky)
//
//
// Definice:
//
//   #define KBD_KALL      zde se definuje, na ktera tlacitka se ma reagovat,
//                         spodni 4 bity odpovidaji 4 tlacitku, 1 znamena platne tlacitko
//
//   #define KBD_TIMEOUT   inicializacni hodnota citace preruseni pro mereni dosazeni klidoveho stavu tlacitek, cas radu 50ms
//
//
//   if (kbd_timer!=0 && kbd_state==0)       // toto se vlozi do casove prerusovaci rutiny
//   {                                       // a nastavi se KBD_TIMEOUT tak, aby celkove spozdeni
//      kbd_timer--;                         // bylo radu 50ms
//   }


// Definice casovani
//
#define KBD_TIMEOUT     3           // pocet preruseni od casovace po jejichz uplynuti se povazuje stav tlacitek za uklidneny
                                    // doporucuji nastavit tak, aby vysledny cas byl cca 50ms

// Definice klaves
//
#define KBD_K1          0b0001      // tlacitko na bitu 4
#define KBD_K2          0b0010      // tlacitko na bitu 5
#define KBD_K3          0b0100      // tlacitko na bitu 6
#define KBD_K4          0b1000      // tlacitko na bitu 7


// Deklarace verejne stavove promenne
//
int kbd_key;         // zde je ulozen kod stlacenoho tlacitka
                     // nastavuje se pro stlaceni tlacitka (prechod ze stavu klidu)
                     // nuluje se vyctenim funkci kbd_getc()



// Privatni sekce, cist jen v pripade, ze neco nefunguje


// Definice masky platnych talcitek pokud nebyla definovana uzivatelem
//
#ifndef KBD_KALL
#define KBD_KALL (KBD_K1 | KBD_K2 | KBD_K3 | KBD_K4)
#endif


// Deklarace privatnich stavovych promennych
//
int kbd_state;       // zde je aktualni stav stisku tlacitek
                     // klid = 0, stav odpovida definovanym maskam KBD_K1 az KBD_K4
int kbd_timer;       // zde je casovac pro timeout, ktery meri cas pro dosazeni klidoveho stavu (0)
                     // pri kazdem stalceni tlacitka se nastavuje hodnota KBD_TIMEOUT
                     // v casovem preruseni (doda uzivatel knihovny) se dekrementuje k 0 (klidovy stav)


// Obsluha preruseni od zmeny stavu portu s tlacitky
//
#int_rb
void IntPortB()
{

   int State;

   #use FAST_IO(B)
   #if KBD_KALL==(KBD_K1 | KBD_K2 | KBD_K3 | KBD_K4)
   kbd_state = (~input_b()>>4);              // vyzvedni jen 4 nejvyssi bity ve spravne polarite
   #else
   kbd_state = (~input_b()>>4)&KBD_KALL;     // vyzvedni jen 4 nejvyssi bity ve spravne polarite, odmaskuj nepouzita tlacitka
   #endif
   #use STANDARD_IO(B)

   if (kbd_state!=0)                   // bylo stlaceno tlacitko
   {
      if (kbd_timer==0 && kbd_key==0)  // pokud byla drive tlacitka v klidovem stavu a znak vycteny
      {                                // jde o nove stlaceni tlacitka
         kbd_key=kbd_state;            // zapamatuj si tlacitko
      }
      kbd_timer=KBD_TIMEOUT;           // tlacitko je stlaceno, natahni timeout
   }
}


// Precteni znaku z klavesnice, pokud nebylo zadne tlacitko stlaceno vraci hodnotu 0, jinak KBD_Kx
//
int kbd_getc()
{
   int i;                  // pomocna promenna

   i=kbd_key;              // uschovej prectenou klavesu
   if (i) kbd_key=0;       // pokud jsem dostal platnou klavesu nuluj stav
   return i;               // vrat cos dostal
}


// Cekej na stisk klavesy
//
int kbd_waitc()
{
   int i;                  // pomocna promenna

   while (!kbd_key)        // dokud neni zmacknuta klavesa
      sleep();             // cekej a spi

   i=kbd_key;              // uschovej hodnotu
   kbd_key=0;              // nuluj priznak stlaceni
   return i;               // vrat prectenou klavesu
}


// Inicializace obsluhy klavesnice
//
kbd_init()
{
   // nastav rezim portu b
   port_b_pullups(TRUE);            // nastav pull up
   #use FAST_IO(B)
   kbd_state = input_b();           // precti stavajici stav
   #use STANDARD_IO(B)

   // nuluj stavove promenne
   kbd_state=0;
   kbd_timer=0;
   kbd_key=0;

   enable_interrupts(INT_RB);       // povol preruseni od zmeny stavu portu
}
{FILE END}
{FOOTER START}

Powered by WebSVN v2.8.3