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

Powered by WebSVN v2.8.3