Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* a kód nincs tesztelve, csak iránymutatás */
- #define GOMB_LE 0x01
- #define GOMB_FEL 0x02
- volatile unsigned char gombok_mostani=0, gombok_stabil=0, szamlalo=0;
- void tmr_irq(void) /* nagyságrendileg 1ms időnként hívva */
- {
- static unsigned char gombok_elozo=8;
- gombok_mostani = PORTA & (GOMB_LE | GOMB_FEL); /* port beolvasása, értelemszerűen lehet több bemenetet is egyszerre kezelni */
- if (szamlalo!=0) /* azért nem csak if (szamlalo), mert bár az nekem jobban tetszik, a MISRA kifejezetten tiltja az olyat :-) */
- {
- if (gombok_mostani==gombok_elozo) /* ha nem volt változás */
- {
- szamlalo--; /* számláló csökkentése */
- }
- else /* ha volt változás */
- {
- szamlalo=8; /* számláló visszaállítása */
- gombok_elozo=gombok_mostani; /* új állapot mentése */
- }
- }
- }
- void main(void)
- {
- static unsigned char gombok_stabil=0;
- /* igazából ez helyzetfüggő, hogy hol legyen */
- /* ha a főprogram sokáig foglalkozik valamivel, akkor akár lehet ez a rész IRQ-ban, és pl. körkörös pufferbe lehet pakolni az eseményeket, amit majd a főprogram lekezel */
- if (szamlalo==0) /* lett egy stabil állapotunk, ki lehet értékelni az előző STABIL állapothoz képest történt változásokat. Szintén MISRA miatt nem if (!szamlalo) :-( */
- {
- if ((gombok_mostani ^ gombok_stabil) & GOMB_FEL) /* FEL gombon volt változás */
- {
- if (gombok_mostani & GOMB_FEL) /* FEL gomb most nyomva van (előzőleg el volt engedve */
- {
- /* FEL gomb lenyomására itt csinálunk valamit */
- }
- else /* FEL gomb most el van engedve (előzőleg nyomva volt) */
- {
- /* FEL gomb elengedésére itt csinálhatunk valamit */
- }
- }
- else /* nem volt változás az adott gombon */
- {
- if (gombok_mostani & GOMB_FEL) /* FEL gomb nyomva van */
- {
- /* itt reagálhatunk arra, ha a gomb folyamatos nyomása mellett akarunk valamit csinálni - pl. számlálót hajtani */
- }
- }
- /* ugyanez GOMB_LE-vel */
- szamlalo=0;
- gombok_stabil=gombok_mostani;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment