?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