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