Guest User

Pergésmentesítés

a guest
Sep 17th, 2014
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.07 KB | None | 0 0
  1. /* a kód nincs tesztelve, csak iránymutatás */
  2.  
  3. #define GOMB_LE     0x01
  4. #define GOMB_FEL    0x02
  5.  
  6. volatile unsigned char gombok_mostani=0, gombok_stabil=0, szamlalo=0;
  7. void tmr_irq(void)  /* nagyságrendileg 1ms időnként hívva */
  8. {
  9.     static unsigned char gombok_elozo=8;
  10.     gombok_mostani = PORTA & (GOMB_LE | GOMB_FEL);  /* port beolvasása, értelemszerűen lehet több bemenetet is egyszerre kezelni */
  11.    
  12.     if (szamlalo!=0)    /* azért nem csak if (szamlalo), mert bár az nekem jobban tetszik, a MISRA kifejezetten tiltja az olyat :-) */
  13.     {
  14.         if (gombok_mostani==gombok_elozo)   /* ha nem volt változás */
  15.         {
  16.             szamlalo--;                     /* számláló csökkentése */
  17.         }
  18.         else                                /* ha volt változás */
  19.         {
  20.             szamlalo=8;                     /* számláló visszaállítása */
  21.             gombok_elozo=gombok_mostani;    /* új állapot mentése */
  22.         }
  23.     }
  24. }
  25.  
  26. void main(void)
  27. {
  28.     static unsigned char gombok_stabil=0;
  29.    
  30.     /* igazából ez helyzetfüggő, hogy hol legyen */
  31.     /* 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 */
  32.     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) :-( */
  33.     {
  34.         if ((gombok_mostani ^ gombok_stabil) & GOMB_FEL)    /* FEL gombon volt változás */
  35.         {
  36.             if (gombok_mostani & GOMB_FEL)                  /* FEL gomb most nyomva van (előzőleg el volt engedve */
  37.             {
  38.                 /* FEL gomb lenyomására itt csinálunk valamit */
  39.             }
  40.             else                                            /* FEL gomb most el van engedve (előzőleg nyomva volt) */
  41.             {
  42.                 /* FEL gomb elengedésére itt csinálhatunk valamit */
  43.             }
  44.         }
  45.         else    /* nem volt változás az adott gombon */
  46.         {
  47.             if (gombok_mostani & GOMB_FEL)                  /* FEL gomb nyomva van */
  48.             {
  49.                 /* itt reagálhatunk arra, ha a gomb folyamatos nyomása mellett akarunk valamit csinálni - pl. számlálót hajtani */
  50.             }
  51.         }
  52.        
  53.         /* ugyanez GOMB_LE-vel */
  54.        
  55.         szamlalo=0;
  56.         gombok_stabil=gombok_mostani;
  57.     }
  58. }
Advertisement
Add Comment
Please, Sign In to add comment