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