| Line No. | Rev | Author | Line |
|---|---|---|---|
| 1 | 3 | kaklik | // KBD modul pro zpracovani tlacitek pripojenych na portu B pod prerusenim od zmeny stavu tohoto portu |
| 2 | // (c)miho 2002 |
||
| 3 | // |
||
| 4 | // Historie: |
||
| 5 | // |
||
| 6 | // 0.0 Uvodni verze |
||
| 7 | // 0.1 Doplnena funkce kbd_waitc() |
||
| 8 | // |
||
| 9 | // |
||
| 10 | // Funkce: |
||
| 11 | // |
||
| 12 | // kbd_init() inicializace |
||
| 13 | // |
||
| 14 | // kbd_getch() vraci kod stisknuteho tlacitka (dle masek KBD_K1 az KBD_K4) nebo 0 (klidovy stav) |
||
| 15 | // |
||
| 16 | // kbd_waitc() cekej na stisk klavesy |
||
| 17 | // |
||
| 18 | // kbd_key v teto promenne je kod posledni nepredane klavesy (v klidu 0) |
||
| 19 | // |
||
| 20 | // |
||
| 21 | // Predpoklady: |
||
| 22 | // |
||
| 23 | // Porty pro pripojeni tlacitek jsou definovany jako vstupy (to je stav po resetu soucastky) |
||
| 24 | // |
||
| 25 | // |
||
| 26 | // Definice: |
||
| 27 | // |
||
| 28 | // #define KBD_KALL zde se definuje, na ktera tlacitka se ma reagovat, |
||
| 29 | // spodni 4 bity odpovidaji 4 tlacitku, 1 znamena platne tlacitko |
||
| 30 | // |
||
| 31 | // #define KBD_TIMEOUT inicializacni hodnota citace preruseni pro mereni dosazeni klidoveho stavu tlacitek, cas radu 50ms |
||
| 32 | // |
||
| 33 | // |
||
| 34 | // if (kbd_timer!=0 && kbd_state==0) // toto se vlozi do casove prerusovaci rutiny |
||
| 35 | // { // a nastavi se KBD_TIMEOUT tak, aby celkove spozdeni |
||
| 36 | // kbd_timer--; // bylo radu 50ms |
||
| 37 | // } |
||
| 38 | |||
| 39 | |||
| 40 | // Definice casovani |
||
| 41 | // |
||
| 42 | #define KBD_TIMEOUT 3 // pocet preruseni od casovace po jejichz uplynuti se povazuje stav tlacitek za uklidneny |
||
| 43 | // doporucuji nastavit tak, aby vysledny cas byl cca 50ms |
||
| 44 | |||
| 45 | // Definice klaves |
||
| 46 | // |
||
| 47 | #define KBD_K1 0b0001 // tlacitko na bitu 4 |
||
| 48 | #define KBD_K2 0b0010 // tlacitko na bitu 5 |
||
| 49 | #define KBD_K3 0b0100 // tlacitko na bitu 6 |
||
| 50 | #define KBD_K4 0b1000 // tlacitko na bitu 7 |
||
| 51 | |||
| 52 | |||
| 53 | // Deklarace verejne stavove promenne |
||
| 54 | // |
||
| 55 | int kbd_key; // zde je ulozen kod stlacenoho tlacitka |
||
| 56 | // nastavuje se pro stlaceni tlacitka (prechod ze stavu klidu) |
||
| 57 | // nuluje se vyctenim funkci kbd_getc() |
||
| 58 | |||
| 59 | |||
| 60 | |||
| 61 | // Privatni sekce, cist jen v pripade, ze neco nefunguje |
||
| 62 | |||
| 63 | |||
| 64 | // Definice masky platnych talcitek pokud nebyla definovana uzivatelem |
||
| 65 | // |
||
| 66 | #ifndef KBD_KALL |
||
| 67 | #define KBD_KALL (KBD_K1 | KBD_K2 | KBD_K3 | KBD_K4) |
||
| 68 | #endif |
||
| 69 | |||
| 70 | |||
| 71 | // Deklarace privatnich stavovych promennych |
||
| 72 | // |
||
| 73 | int kbd_state; // zde je aktualni stav stisku tlacitek |
||
| 74 | // klid = 0, stav odpovida definovanym maskam KBD_K1 az KBD_K4 |
||
| 75 | int kbd_timer; // zde je casovac pro timeout, ktery meri cas pro dosazeni klidoveho stavu (0) |
||
| 76 | // pri kazdem stalceni tlacitka se nastavuje hodnota KBD_TIMEOUT |
||
| 77 | // v casovem preruseni (doda uzivatel knihovny) se dekrementuje k 0 (klidovy stav) |
||
| 78 | |||
| 79 | |||
| 80 | // Obsluha preruseni od zmeny stavu portu s tlacitky |
||
| 81 | // |
||
| 82 | #int_rb |
||
| 83 | void IntPortB() |
||
| 84 | { |
||
| 85 | |||
| 86 | int State; |
||
| 87 | |||
| 88 | #use FAST_IO(B) |
||
| 89 | #if KBD_KALL==(KBD_K1 | KBD_K2 | KBD_K3 | KBD_K4) |
||
| 90 | kbd_state = (~input_b()>>4); // vyzvedni jen 4 nejvyssi bity ve spravne polarite |
||
| 91 | #else |
||
| 92 | kbd_state = (~input_b()>>4)&KBD_KALL; // vyzvedni jen 4 nejvyssi bity ve spravne polarite, odmaskuj nepouzita tlacitka |
||
| 93 | #endif |
||
| 94 | #use STANDARD_IO(B) |
||
| 95 | |||
| 96 | if (kbd_state!=0) // bylo stlaceno tlacitko |
||
| 97 | { |
||
| 98 | if (kbd_timer==0 && kbd_key==0) // pokud byla drive tlacitka v klidovem stavu a znak vycteny |
||
| 99 | { // jde o nove stlaceni tlacitka |
||
| 100 | kbd_key=kbd_state; // zapamatuj si tlacitko |
||
| 101 | } |
||
| 102 | kbd_timer=KBD_TIMEOUT; // tlacitko je stlaceno, natahni timeout |
||
| 103 | } |
||
| 104 | } |
||
| 105 | |||
| 106 | |||
| 107 | // Precteni znaku z klavesnice, pokud nebylo zadne tlacitko stlaceno vraci hodnotu 0, jinak KBD_Kx |
||
| 108 | // |
||
| 109 | int kbd_getc() |
||
| 110 | { |
||
| 111 | int i; // pomocna promenna |
||
| 112 | |||
| 113 | i=kbd_key; // uschovej prectenou klavesu |
||
| 114 | if (i) kbd_key=0; // pokud jsem dostal platnou klavesu nuluj stav |
||
| 115 | return i; // vrat cos dostal |
||
| 116 | } |
||
| 117 | |||
| 118 | |||
| 119 | // Cekej na stisk klavesy |
||
| 120 | // |
||
| 121 | int kbd_waitc() |
||
| 122 | { |
||
| 123 | int i; // pomocna promenna |
||
| 124 | |||
| 125 | while (!kbd_key) // dokud neni zmacknuta klavesa |
||
| 126 | sleep(); // cekej a spi |
||
| 127 | |||
| 128 | i=kbd_key; // uschovej hodnotu |
||
| 129 | kbd_key=0; // nuluj priznak stlaceni |
||
| 130 | return i; // vrat prectenou klavesu |
||
| 131 | } |
||
| 132 | |||
| 133 | |||
| 134 | // Inicializace obsluhy klavesnice |
||
| 135 | // |
||
| 136 | kbd_init() |
||
| 137 | { |
||
| 138 | // nastav rezim portu b |
||
| 139 | port_b_pullups(TRUE); // nastav pull up |
||
| 140 | #use FAST_IO(B) |
||
| 141 | kbd_state = input_b(); // precti stavajici stav |
||
| 142 | #use STANDARD_IO(B) |
||
| 143 | |||
| 144 | // nuluj stavove promenne |
||
| 145 | kbd_state=0; |
||
| 146 | kbd_timer=0; |
||
| 147 | kbd_key=0; |
||
| 148 | |||
| 149 | enable_interrupts(INT_RB); // povol preruseni od zmeny stavu portu |
||
| 150 | } |
Powered by WebSVN v2.8.3