| Line No. | Rev | Author | Line |
|---|---|---|---|
| 1 | 3 | kaklik | ///////////////////////////////////////////////////////////////////////////////////////////// |
| 2 | // |
||
| 3 | // KNIHOVNA PRO PRACI S TLACITKY PRIPOJENYCH NA PORT |
||
| 4 | // |
||
| 5 | ///////////////////////////////////////////////////////////////////////////////////////////// |
||
| 6 | // |
||
| 7 | // (c) PEFI 2003 |
||
| 8 | // Verze 1.00 - uvodni verze, vyslo se z kbd_b4.c od MIHO |
||
| 9 | // 1.01 - pridana funkce kbd_progress() |
||
| 10 | // - uprava fci kbd_waitc() a kbd_timeoutc() s ohledem na tuto funkci |
||
| 11 | // |
||
| 12 | ///////////////////////////////////////////////////////////////////////////////////////////// |
||
| 13 | // |
||
| 14 | // Funkce: |
||
| 15 | // |
||
| 16 | // kbd_init() inicializace, vola se na zacatku programu |
||
| 17 | // |
||
| 18 | // kbd_ticktimer() nutno vlozit do mista, ktere zajistuje odmerovani casu, |
||
| 19 | // zpravidla se vklada do presusovaci rutiny nektereho s timeru, nebo do hlavni smycky programu |
||
| 20 | // |
||
| 21 | // kbd_pullkbd() pulluje port s tlacitky, |
||
| 22 | // zpravidla se vklada do hlavni smycky, nebo v pripade pouziti tlacitek v horni polovine portu B |
||
| 23 | // do prerusovaci rutiny od zmeny na portu B |
||
| 24 | // |
||
| 25 | // kbd_getc() vraci kod stisknuteho tlacitka/tlacitek |
||
| 26 | // (vycita jej s bufferu) dle masek KBD_K1 az KBD_K8 nebo 0 (klidovy stav) |
||
| 27 | // |
||
| 28 | // kbd_waitc() ceka na stisk tlacitka/tlacitek a vraci jejich kod jako fce kbd_getc, |
||
| 29 | // pokud neni cteni klavesnice a tik casovace pod prerusenim, je treba pouzit variantu s WDT timerem |
||
| 30 | // |
||
| 31 | // kbd_timeoutc(timeout) ceka na stisk tlacitka/tlacitek a vraci jejich kod jako funkce kbd_getc, ale ceka jen po |
||
| 32 | // omezenou dobu, timeout je int16 a krok urcuje rutina pro odmerovani casu (fce kbd_ticktimer) |
||
| 33 | // v pripade, ze je zapnuta varianta s WDT timerem, je timeout int8 |
||
| 34 | // |
||
| 35 | // kbd_press() vraci kod prave stisknuteho tlacitka/tlacitek dle masek KBD_K1 az KBD_K8 nebo 0 (klidovy stav) |
||
| 36 | // |
||
| 37 | // kbd_progress() vraci 1 pokud probiha proces cteni tlacitek, jinak vraci 0, pomucka pro proces usinani |
||
| 38 | // |
||
| 39 | // Predpoklady: |
||
| 40 | // |
||
| 41 | // Porty pro pripojeni tlacitek jsou definovany jako vstupy (to je stav po resetu soucastky) |
||
| 42 | // |
||
| 43 | // |
||
| 44 | // Definice: |
||
| 45 | // |
||
| 46 | // defince portu tlacitek se dela na dvakrat, protoze preporcesor neumi vnorena makra !!!!! |
||
| 47 | // #define KBD_PORT P // zde se definuje port, na kterem jsou pripojena tlacitka, misto P se doplnuje hodnota A .. E |
||
| 48 | // #define INPUT_X input_P() // definuje port, ze ktereho se ctou tlacitka, misto P se doplnuje hodnota KBD_PORT tedy pismena A .. E |
||
| 49 | // |
||
| 50 | // #define KBD_CALMTIME // inicializacni hodnota citace preruseni pro mereni dosazeni klidoveho stavu tlacitek, |
||
| 51 | // // nastavit tak, aby byl cas radu 50ms POZOR HODNOTA 0XFF JE VYHRAZENA !!! |
||
| 52 | // |
||
| 53 | // #define KBD_WDT // zapne/vypne realizaci kbd_waitc pomoci WDT timeru (1 zap 0, vyp) |
||
| 54 | // |
||
| 55 | // #define KBD_PULLUP_B // zapne/vypne pullupy na portu B (1 zap, 0 vyp) |
||
| 56 | // |
||
| 57 | // #define KBD_K1 // zde se definuje, na kterem bitu portu se prislusne tlacitko nachazi, |
||
| 58 | // #define KBD_K2 // 1 v prislusnem bitu znamena platne tlacitko |
||
| 59 | // #define KBD_K3 |
||
| 60 | // #define KBD_K4 |
||
| 61 | // #define KBD_K5 |
||
| 62 | // #define KBD_K6 |
||
| 63 | // #define KBD_K7 |
||
| 64 | // #define KBD_K8 |
||
| 65 | // |
||
| 66 | // |
||
| 67 | // Defaultni definice |
||
| 68 | // |
||
| 69 | // Definice portu klavesnice |
||
| 70 | // |
||
| 71 | #ifndef KBD_PORT |
||
| 72 | #define KBD_PORT B // port, na kterem jsou pripojena tlacitka |
||
| 73 | #define INPUT_X input_b() |
||
| 74 | #endif |
||
| 75 | // |
||
| 76 | // Definice casovani |
||
| 77 | // |
||
| 78 | #ifndef KBD_CALMTIME |
||
| 79 | #define KBD_CALMTIME 3 // pocet preruseni od casovace po jejichz uplynuti se povazuje stav tlacitek za uklidneny |
||
| 80 | #endif // doporucuji nastavit tak, aby vysledny cas byl cca 50ms |
||
| 81 | // |
||
| 82 | // Zapnuti pullupu na portu B |
||
| 83 | #ifndef KBD_PULLUP_B |
||
| 84 | #define KBD_PULLUP_B 1 |
||
| 85 | #endif |
||
| 86 | // |
||
| 87 | // Vypnuti realizace kbd_c pomoci WDT timeru |
||
| 88 | #ifndef KBD_WDT |
||
| 89 | #define KBD_WDT 0 |
||
| 90 | #endif |
||
| 91 | // |
||
| 92 | // Definice klaves |
||
| 93 | // |
||
| 94 | #ifndef KBD_K1 |
||
| 95 | #define KBD_K1 0b00010000 // tlacitko na bitu 4 |
||
| 96 | #endif |
||
| 97 | #ifndef KBD_K2 |
||
| 98 | #define KBD_K2 0b00100000 // tlacitko na bitu 5 |
||
| 99 | #endif |
||
| 100 | #ifndef KBD_K3 |
||
| 101 | #define KBD_K3 0b01000000 // tlacitko na bitu 6 |
||
| 102 | #endif |
||
| 103 | #ifndef KBD_K4 |
||
| 104 | #define KBD_K4 0b10000000 // tlacitko na bitu 7 |
||
| 105 | #endif |
||
| 106 | #ifndef KBD_K5 |
||
| 107 | #define KBD_K5 0b00000000 // tlacitko na bitu neexistuje |
||
| 108 | #endif |
||
| 109 | #ifndef KBD_K6 |
||
| 110 | #define KBD_K6 0b00000000 // tlacitko na bitu neexistuje |
||
| 111 | #endif |
||
| 112 | #ifndef KBD_K7 |
||
| 113 | #define KBD_K7 0b00000000 // tlacitko na bitu neexistuje |
||
| 114 | #endif |
||
| 115 | #ifndef KBD_K8 |
||
| 116 | #define KBD_K8 0b00000000 // tlacitko na bitu neexistuje |
||
| 117 | #endif |
||
| 118 | |||
| 119 | |||
| 120 | |||
| 121 | |||
| 122 | /****************************************************************************************************/ |
||
| 123 | // Privatni sekce, cist jen v pripade, ze neco nefunguje |
||
| 124 | /****************************************************************************************************/ |
||
| 125 | |||
| 126 | // Definice masky platnych talcitek pokud nebyla definovana uzivatelem |
||
| 127 | // |
||
| 128 | #define KBD_KALL (KBD_K1 | KBD_K2 | KBD_K3 | KBD_K4 | KBD_K5 | KBD_K6 | KBD_K7 | KBD_K8) |
||
| 129 | |||
| 130 | #if (KBD_CALMTIME==0xFF) |
||
| 131 | #error KBD_CALMTIME is not in range 0-254 |
||
| 132 | #endif |
||
| 133 | |||
| 134 | // Deklarace privatnich stavovych promennych |
||
| 135 | // |
||
| 136 | int kbd_state; // zde je aktualni stav stisku tlacitek, lze ho ziskat funkci kbd_press |
||
| 137 | // klid = 0, stav odpovida definovanym maskam KBD_K1 az KBD_K4 |
||
| 138 | int kbd_timer; // zde je casovac, ktery meri cas pro dosazeni klidoveho stavu tlacitek |
||
| 139 | // pri kazdem stlaceni tlacitka se nastavuje hodnota KBD_TIMEOUT |
||
| 140 | // v casovem preruseni (doda uzivatel knihovny) se dekrementuje k 0 (klidovy stav) |
||
| 141 | int kbd_key; // zde je ulozen kod stlaceneho tlacitka, ktery ceka na zpracovani funkci kbd_getc (buffer tlacitka) |
||
| 142 | // nastavuje se po uklidneni tlacitka |
||
| 143 | // nuluje se vyctenim funkci kbd_getc() |
||
| 144 | #if KBD_WDT==0 |
||
| 145 | int16 kbd_timeout; // zde je casovac, ktery meri timeout pro funkci kbd_timeoutc |
||
| 146 | #endif |
||
| 147 | |||
| 148 | |||
| 149 | |||
| 150 | // Inicializace obsluhy klavesnice |
||
| 151 | // |
||
| 152 | kbd_init() |
||
| 153 | { |
||
| 154 | // nastav rezim portu b |
||
| 155 | #if KBD_PULLUP_B==1 |
||
| 156 | port_b_pullups(TRUE); // nastav pull up |
||
| 157 | #endif |
||
| 158 | |||
| 159 | #use FAST_IO(KBD_PORT) |
||
| 160 | kbd_state = INPUT_X; // precti stavajici stav |
||
| 161 | #use STANDARD_IO(KBD_PORT) |
||
| 162 | |||
| 163 | // nuluj stavove promenne |
||
| 164 | kbd_state=0; |
||
| 165 | kbd_timer=0xFF; |
||
| 166 | kbd_key=0; |
||
| 167 | } |
||
| 168 | |||
| 169 | |||
| 170 | |||
| 171 | // Tik casovace kbd_timer |
||
| 172 | // |
||
| 173 | #inline |
||
| 174 | void kbd_ticktimer() |
||
| 175 | { |
||
| 176 | if (kbd_timer==0) |
||
| 177 | { |
||
| 178 | #use FAST_IO(KBD_PORT) |
||
| 179 | kbd_state = (~INPUT_X)&KBD_KALL; // vyzvedni bity ve spravne polarite, odmaskuj nepouzita tlacitka |
||
| 180 | #use STANDARD_IO(KBD_PORT) |
||
| 181 | kbd_timer=0xFF; // priznak ukonceni cteni |
||
| 182 | if (kbd_key==0) kbd_key=kbd_state; // predej do bufferu; je-li prazdny |
||
| 183 | } |
||
| 184 | if (kbd_timer!=0xFF) kbd_timer--; // tikej |
||
| 185 | #if KBD_WDT==0 |
||
| 186 | if (kbd_timeout!=0) kbd_timeout--; // tik timeoutu |
||
| 187 | #endif |
||
| 188 | } |
||
| 189 | |||
| 190 | |||
| 191 | |||
| 192 | // pulluje stav klavesnice |
||
| 193 | // |
||
| 194 | #inline |
||
| 195 | void kbd_pullkbd() |
||
| 196 | { |
||
| 197 | int state; |
||
| 198 | #use FAST_IO(KBD_PORT) |
||
| 199 | State = (~INPUT_X)&KBD_KALL; // vyzvedni bity ve spravne polarite, odmaskuj nepouzita tlacitka |
||
| 200 | #use STANDARD_IO(KBD_PORT) |
||
| 201 | if (State!=kbd_state) // byla zmena na tlacitkach? |
||
| 202 | { |
||
| 203 | kbd_timer=KBD_CALMTIME; // natahni cas pro uklidneni |
||
| 204 | kbd_state=state; // poznamenej si stav tlacitek |
||
| 205 | } |
||
| 206 | } |
||
| 207 | |||
| 208 | |||
| 209 | // vraci kod stisknuteho tlacitka/tlacitek |
||
| 210 | // (vycita jej s bufferu kbd_key) dle masek KBD_K1 az KBD_K8 nebo 0 (klidovy stav) |
||
| 211 | // |
||
| 212 | int kbd_getc() |
||
| 213 | { |
||
| 214 | int i; |
||
| 215 | |||
| 216 | i=kbd_key; // uschovej prectenou klavesu |
||
| 217 | if (i!=0) |
||
| 218 | kbd_key=0; // pokud jsem dostal platnou klavesu nuluj stav |
||
| 219 | return i; // vrat cos dostal |
||
| 220 | } |
||
| 221 | |||
| 222 | |||
| 223 | // vraceni stavu procesu cteni tlacitek |
||
| 224 | // |
||
| 225 | int1 kbd_progress() |
||
| 226 | { |
||
| 227 | if(kbd_timer==0xFF) return(FALSE); |
||
| 228 | else return(TRUE); |
||
| 229 | } |
||
| 230 | |||
| 231 | |||
| 232 | // Ceka na stisk klavesy a vraci jeji kod |
||
| 233 | // |
||
| 234 | int kbd_waitc() |
||
| 235 | { |
||
| 236 | int i; // pomocna promenna |
||
| 237 | |||
| 238 | while (kbd_key==0) // dokud neni zmacknuta klavesa |
||
| 239 | { |
||
| 240 | sleep(); // cekej a spi |
||
| 241 | delay_cycles(1); // nutne NOP, nasledujici podminka se musi zpracovavat az po rutine preruseni od tlacitek |
||
| 242 | while(kbd_progress()) restart_wdt(); // nelze spat, pokud probiha cteni tlacitek, nebezely by timery |
||
| 243 | #if KBD_WDT==1 |
||
| 244 | kbd_pullkbd(); // precti stav klavesnice |
||
| 245 | delay_ms(80); // pevny cas pro odezneni zakmitu tlacitek |
||
| 246 | kbd_timer=0; // citac pro mereni doby k odstraneni zakmitu vyprsel |
||
| 247 | kbd_ticktimer(); // v podstate precteni casu klavesnice podruhe, po zakmitech |
||
| 248 | #endif |
||
| 249 | |||
| 250 | } |
||
| 251 | i=kbd_key; // uschovej hodnotu |
||
| 252 | kbd_key=0; // nuluj priznak stlaceni |
||
| 253 | return i; // vrat prectenou klavesu |
||
| 254 | } |
||
| 255 | |||
| 256 | |||
| 257 | |||
| 258 | #if KBD_WDT==0 |
||
| 259 | int kbd_timeoutc(int16 timeout) |
||
| 260 | { |
||
| 261 | int i; |
||
| 262 | |||
| 263 | kbd_timeout=timeout; // natahni timeout |
||
| 264 | while(kbd_key==0 && kbd_timeout!=0) // dokud neni zmacknuta klavesa, nebo nevyprsel timeout |
||
| 265 | { |
||
| 266 | sleep(); // cekej a spi |
||
| 267 | delay_cycles(1); // nutne NOP, nasledujici podminka se musi zpracovavat az po rutine preruseni od tlacitek |
||
| 268 | while(kbd_progress()) restart_wdt(); // nelze spat, pokud probiha cteni tlacitek, nebezely by timery |
||
| 269 | } |
||
| 270 | i=kbd_key; // uschovej hodnotu |
||
| 271 | kbd_key=0; // nuluj priznak stlaceni |
||
| 272 | return i; // vrat prectenou klavesu |
||
| 273 | } |
||
| 274 | #else |
||
| 275 | int kbd_timeoutc(int timeout) |
||
| 276 | { |
||
| 277 | int i; |
||
| 278 | int timer; |
||
| 279 | |||
| 280 | timer=timeout; // natahni timer |
||
| 281 | while (kbd_key==0 && timer!=0) // dokud neni zmacknuta klavesa a nevyprsel timeout |
||
| 282 | { |
||
| 283 | sleep(); // cekej a spi |
||
| 284 | kbd_pullkbd(); // precti stav klavesnice |
||
| 285 | delay_ms(80); // pevny cas pro odezneni zakmitu tlacitek |
||
| 286 | kbd_timer=0; // citac pro mereni doby k odstraneni zakmitu vyprsel |
||
| 287 | kbd_ticktimer(); // v podstate precteni stavu klavesnice podruhe, po zakmitech |
||
| 288 | timer--; |
||
| 289 | } |
||
| 290 | |||
| 291 | i=kbd_key; // uschovej hodnotu |
||
| 292 | kbd_key=0; // nuluj priznak stlaceni |
||
| 293 | return i; // vrat prectenou klavesu |
||
| 294 | } |
||
| 295 | #endif |
||
| 296 | |||
| 297 | |||
| 298 | // Precteni aktualniho stavu klavesnice |
||
| 299 | // |
||
| 300 | int kbd_press() |
||
| 301 | { |
||
| 302 | if (kbd_timer!=0xFF) return 0; // stav v kbd_state neni platny, ceka se na uklidneni |
||
| 303 | else return kbd_state; |
||
| 304 | } |
||
| 305 | |||
| 306 | |||
| 307 | // End of file |
Powered by WebSVN v2.8.3