?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{BLAME START}

library

?curdirlinks? -

Blame information for rev 3

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
{BLAME END}
{FOOTER START}

Powered by WebSVN v2.8.3