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

library

?curdirlinks? - Rev 3

?prevdifflink? - Blame - ?getfile?

/////////////////////////////////////////////////////////////////////////////////////////////
//
// KNIHOVNA PRO PRACI S TLACITKY PRIPOJENYCH NA PORT
//
/////////////////////////////////////////////////////////////////////////////////////////////
//
// (c) PEFI 2003
// Verze 1.00     - uvodni verze, vyslo se z kbd_b4.c od MIHO
//       1.01     - pridana funkce kbd_progress()
//                - uprava fci kbd_waitc() a kbd_timeoutc() s ohledem na tuto funkci
//
/////////////////////////////////////////////////////////////////////////////////////////////
//
// Funkce:
//
//   kbd_init()            inicializace, vola se na zacatku programu
//
//   kbd_ticktimer()       nutno vlozit do mista, ktere zajistuje odmerovani casu,
//                         zpravidla se vklada do presusovaci rutiny nektereho s timeru, nebo do hlavni smycky programu
//
//   kbd_pullkbd()         pulluje port s tlacitky,
//                         zpravidla se vklada do hlavni smycky, nebo v pripade pouziti tlacitek v horni polovine portu B
//                         do prerusovaci rutiny od zmeny na portu B
//
//   kbd_getc()            vraci kod stisknuteho tlacitka/tlacitek
//                         (vycita jej s bufferu) dle masek KBD_K1 az KBD_K8 nebo 0 (klidovy stav)
//
//   kbd_waitc()           ceka na stisk tlacitka/tlacitek a vraci jejich kod jako fce kbd_getc,
//                         pokud neni cteni klavesnice a tik casovace pod prerusenim, je treba pouzit variantu s WDT timerem
//
// kbd_timeoutc(timeout)   ceka na stisk tlacitka/tlacitek a vraci jejich kod jako funkce kbd_getc, ale ceka jen po
//                         omezenou dobu, timeout je int16 a krok urcuje rutina pro odmerovani casu (fce kbd_ticktimer)
//                         v pripade, ze je zapnuta varianta s WDT timerem, je timeout int8
//
//   kbd_press()           vraci kod prave stisknuteho tlacitka/tlacitek dle masek KBD_K1 az KBD_K8 nebo 0 (klidovy stav)
//
//   kbd_progress()        vraci 1 pokud probiha proces cteni tlacitek, jinak vraci 0, pomucka pro proces usinani
//
// Predpoklady:
//
//   Porty pro pripojeni tlacitek jsou definovany jako vstupy (to je stav po resetu soucastky)
//
//
// Definice:
//
//   defince portu tlacitek se dela na dvakrat, protoze preporcesor neumi vnorena makra !!!!!
//   #define KBD_PORT      P           // zde se definuje port, na kterem jsou pripojena tlacitka, misto P se doplnuje hodnota A .. E
//   #define INPUT_X       input_P()   // definuje port, ze ktereho se ctou tlacitka, misto P se doplnuje hodnota KBD_PORT tedy pismena A .. E
//
//   #define KBD_CALMTIME              // inicializacni hodnota citace preruseni pro mereni dosazeni klidoveho stavu tlacitek,
//                                     // nastavit tak, aby byl cas radu 50ms POZOR HODNOTA 0XFF JE VYHRAZENA !!!
//
//   #define KBD_WDT                   // zapne/vypne realizaci kbd_waitc pomoci WDT timeru (1 zap 0, vyp)
//
//   #define KBD_PULLUP_B              // zapne/vypne pullupy na portu B (1 zap, 0 vyp)
//
//   #define KBD_K1                    // zde se definuje, na kterem bitu portu se prislusne tlacitko nachazi,
//   #define KBD_K2                    // 1 v prislusnem bitu znamena platne tlacitko
//   #define KBD_K3
//   #define KBD_K4
//   #define KBD_K5
//   #define KBD_K6
//   #define KBD_K7
//   #define KBD_K8
//
//
// Defaultni definice
//
// Definice portu klavesnice
//
#ifndef KBD_PORT
  #define  KBD_PORT       B              // port, na kterem jsou pripojena tlacitka
  #define  INPUT_X        input_b()
#endif
//
// Definice casovani
//
#ifndef KBD_CALMTIME
  #define KBD_CALMTIME     3             // pocet preruseni od casovace po jejichz uplynuti se povazuje stav tlacitek za uklidneny
#endif                                   // doporucuji nastavit tak, aby vysledny cas byl cca 50ms
//
// Zapnuti pullupu na portu B
#ifndef KBD_PULLUP_B
  #define KBD_PULLUP_B    1
#endif
//
// Vypnuti realizace kbd_c pomoci WDT timeru
#ifndef  KBD_WDT
   #define  KBD_WDT       0
#endif
//
// Definice klaves
//
#ifndef KBD_K1
 #define KBD_K1          0b00010000      // tlacitko na bitu 4
#endif
#ifndef KBD_K2
 #define KBD_K2          0b00100000      // tlacitko na bitu 5
#endif
#ifndef KBD_K3
 #define KBD_K3          0b01000000      // tlacitko na bitu 6
#endif
#ifndef KBD_K4
 #define KBD_K4          0b10000000      // tlacitko na bitu 7
#endif
#ifndef KBD_K5
 #define KBD_K5          0b00000000      // tlacitko na bitu neexistuje
#endif
#ifndef KBD_K6
 #define KBD_K6          0b00000000      // tlacitko na bitu neexistuje
#endif
#ifndef KBD_K7
 #define KBD_K7          0b00000000      // tlacitko na bitu neexistuje
#endif
#ifndef KBD_K8
 #define KBD_K8          0b00000000      // tlacitko na bitu neexistuje
#endif




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

// Definice masky platnych talcitek pokud nebyla definovana uzivatelem
//
 #define KBD_KALL (KBD_K1 | KBD_K2 | KBD_K3 | KBD_K4 | KBD_K5 | KBD_K6 | KBD_K7 | KBD_K8)

#if (KBD_CALMTIME==0xFF)
  #error KBD_CALMTIME is not in range 0-254
#endif

// Deklarace privatnich stavovych promennych
//
int kbd_state;       // zde je aktualni stav stisku tlacitek, lze ho ziskat funkci kbd_press
                     // klid = 0, stav odpovida definovanym maskam KBD_K1 az KBD_K4
int kbd_timer;       // zde je casovac, ktery meri cas pro dosazeni klidoveho stavu tlacitek
                     // pri kazdem stlaceni tlacitka se nastavuje hodnota KBD_TIMEOUT
                     // v casovem preruseni (doda uzivatel knihovny) se dekrementuje k 0 (klidovy stav)
int kbd_key;         // zde je ulozen kod stlaceneho tlacitka, ktery ceka na zpracovani funkci kbd_getc (buffer tlacitka)
                     // nastavuje se po uklidneni tlacitka
                     // nuluje se vyctenim funkci kbd_getc()
#if KBD_WDT==0
int16 kbd_timeout;   // zde je casovac, ktery meri timeout pro funkci kbd_timeoutc
#endif



// Inicializace obsluhy klavesnice
//
kbd_init()
{
   // nastav rezim portu b
  #if KBD_PULLUP_B==1
   port_b_pullups(TRUE);            // nastav pull up
  #endif

   #use FAST_IO(KBD_PORT)
   kbd_state = INPUT_X;           // precti stavajici stav
   #use STANDARD_IO(KBD_PORT)

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



// Tik casovace kbd_timer
//
#inline
void kbd_ticktimer()
{
  if (kbd_timer==0)
  {
    #use FAST_IO(KBD_PORT)
    kbd_state = (~INPUT_X)&KBD_KALL;     // vyzvedni bity ve spravne polarite, odmaskuj nepouzita tlacitka
    #use STANDARD_IO(KBD_PORT)
    kbd_timer=0xFF;                      // priznak ukonceni cteni
    if (kbd_key==0) kbd_key=kbd_state;   // predej do bufferu; je-li prazdny
  }
  if (kbd_timer!=0xFF) kbd_timer--;      // tikej
 #if KBD_WDT==0
  if (kbd_timeout!=0) kbd_timeout--;     // tik timeoutu
 #endif
}



// pulluje stav klavesnice
//
#inline
void kbd_pullkbd()
{
  int state;
     #use FAST_IO(KBD_PORT)
     State = (~INPUT_X)&KBD_KALL;        // vyzvedni bity ve spravne polarite, odmaskuj nepouzita tlacitka
     #use STANDARD_IO(KBD_PORT)
     if (State!=kbd_state)               // byla zmena na tlacitkach?
     {
       kbd_timer=KBD_CALMTIME;           // natahni cas pro uklidneni
       kbd_state=state;                  // poznamenej si stav tlacitek
     }
}


// vraci kod stisknuteho tlacitka/tlacitek
// (vycita jej s bufferu kbd_key) dle masek KBD_K1 az KBD_K8 nebo 0 (klidovy stav)
//
int kbd_getc()
{
   int i;

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


// vraceni stavu procesu cteni tlacitek
//
int1 kbd_progress()
{
  if(kbd_timer==0xFF) return(FALSE);
  else return(TRUE);
}


// Ceka na stisk klavesy a vraci jeji kod
//
int kbd_waitc()
{
   int i;                  // pomocna promenna

   while (kbd_key==0)      // dokud neni zmacknuta klavesa
    {
     sleep();              // cekej a spi
     delay_cycles(1);      // nutne NOP, nasledujici podminka se musi zpracovavat az po rutine preruseni od tlacitek
     while(kbd_progress()) restart_wdt(); // nelze spat, pokud probiha cteni tlacitek, nebezely by timery
    #if KBD_WDT==1
     kbd_pullkbd();        // precti stav klavesnice
     delay_ms(80);         // pevny cas pro odezneni zakmitu tlacitek
     kbd_timer=0;          // citac pro mereni doby k odstraneni zakmitu vyprsel
     kbd_ticktimer();      // v podstate precteni casu klavesnice podruhe, po zakmitech
    #endif

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



#if KBD_WDT==0
int kbd_timeoutc(int16 timeout)
{
   int i;

   kbd_timeout=timeout;    // natahni timeout
   while(kbd_key==0 && kbd_timeout!=0)      // dokud neni zmacknuta klavesa, nebo nevyprsel timeout
   {
     sleep();              // cekej a spi
     delay_cycles(1);      // nutne NOP, nasledujici podminka se musi zpracovavat az po rutine preruseni od tlacitek
     while(kbd_progress()) restart_wdt();  // nelze spat, pokud probiha cteni tlacitek, nebezely by timery
   }
   i=kbd_key;              // uschovej hodnotu
   kbd_key=0;              // nuluj priznak stlaceni
   return i;               // vrat prectenou klavesu
}
#else
int kbd_timeoutc(int timeout)
{
   int i;
   int timer;

   timer=timeout;          // natahni timer
   while (kbd_key==0 && timer!=0)      // dokud neni zmacknuta klavesa a nevyprsel timeout
   {
     sleep();              // cekej a spi
     kbd_pullkbd();        // precti stav klavesnice
     delay_ms(80);         // pevny cas pro odezneni zakmitu tlacitek
     kbd_timer=0;          // citac pro mereni doby k odstraneni zakmitu vyprsel
     kbd_ticktimer();      // v podstate precteni stavu klavesnice podruhe, po zakmitech
     timer--;
   }

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


// Precteni aktualniho stavu klavesnice
//
int kbd_press()
{
  if (kbd_timer!=0xFF) return 0;    // stav v kbd_state neni platny, ceka se na uklidneni
    else return kbd_state;
}


// End of file
{FILE END}
{FOOTER START}

Powered by WebSVN v2.8.3