/////////////////////////////////////////////////////////////////////////////////////////////
//
// 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
|