Advertisement
milanmetal

[AVR/C] [izrada] Brojac -999 do 999 (Interrupt)

Jan 13th, 2018
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.35 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <stdlib.h>             // funkcija abs();
  4.                                 // -123 npr daje problem kada ga koristim sa % i ostalom logikom
  5.                                 // koja priprema cifre za ispis na dipslej, pa sam ukljucio ovo radi
  6.                                 // te funkcije abs()
  7.  
  8. ///////////////////////////////////////////////////////////////////////////////////////
  9.  
  10. // moze i ovako da se implementira ova zajebavancija sa tasterima.
  11. #define KEY_UP          3                               // redni broj PIN-a na portu za tastere
  12. #define KEY_RIGHT       2
  13. #define KEY_DN          1
  14.  
  15. // PINC je ulazni port koji ocitava tastere
  16. #define KEY_PINS        PINC
  17.  
  18. // Macroi koji definisu tastere
  19. #define KEY_DN_PRESS    (~(KEY_PINS) & (1 << KEY_DN))       // ~(PINC) & 1 << 1
  20. #define KEY_RIGHT_PRESS (~(KEY_PINS) & (1 << KEY_RIGHT))    // ~(PINC) & 1 << 2
  21. #define KEY_UP_PRESS    (~(KEY_PINS) & (1 << KEY_UP))       // ~(PINC) & 1 << 3
  22.  
  23. // Nabrajanje ocekivanih stanja tastera.
  24. enum BUTTONS {NONE = 0, DOWN = 1, RIGHT = 2, UP = 3};
  25.  
  26. enum ZNAKBROJACA {POZITIVNO = 1, NEGATIVNO = 0};
  27. enum ZNAKBROJACA znak;
  28. ///////////////////////////////////////////////////////////////////////////////////////
  29.  
  30. const unsigned char simboli[] = {
  31.         0x0c, 0xa4, 0x27, 0xc4
  32. }; //look-up tabela sa simbolima
  33.  
  34. unsigned char DISP_BAFER[4] = {
  35.         //0xfe, 0xfe, 0xfe, 0xfe
  36.         0xff, 0xff, 0xff, 0xff      // brisem displej na pocetku.
  37. }; //bafer displeja
  38. unsigned long millis = 0;
  39. unsigned char disp = 3;
  40.  
  41.  
  42. ///////////////////////////////////////////////////////////////////////////////////////
  43. unsigned char jedinice = 1;
  44. unsigned char desetice = 9;
  45. unsigned char stotice = 0;
  46.  
  47.                             //  0     1     2     3     4     5     6     7     8     9
  48. const unsigned char cifre[] = { 0x05, 0xdd, 0x46, 0x54, 0x9c, 0x34, 0x24, 0x5d, 0x04, 0x14 };
  49.  
  50. int brojac = 120;             // treba mi integer jer ocekujem broj do 999
  51.  
  52.  
  53. // vraca vrednosti iz enumeracije u zavisnosti od pritisnutog tastera.
  54. unsigned char ocitajTaster(){
  55.  
  56.     enum BUTTONS btn;
  57.     if(KEY_DN_PRESS){       // pogledati makroe na vrhu...
  58.         btn = DOWN;
  59.     } else if(KEY_UP_PRESS){
  60.         btn = UP;
  61.     } else if(KEY_RIGHT_PRESS){
  62.         btn = RIGHT;
  63.     } else {
  64.         btn = NONE;
  65.     }
  66.     return btn;
  67. }
  68.  
  69. void azurirajBrojac() {
  70.     brojac = jedinice + (desetice * 10) + (stotice * 100);
  71. }
  72.  
  73. void budziNaDisplej(){
  74.  
  75.     // npr brojac = 123;
  76.     stotice = abs(brojac) / 100;            // (1234 % 1000) / 100 = 234 / 100 = 2
  77.     desetice = (abs(brojac) % 100) / 10;    // ((1234 % 1000) % 100) / 10 = (234 % 100) / 10 = 34 / 10 = 3
  78.     jedinice = (abs(brojac) % 100) % 10;    // 1234 % 1000 = 234 % 100 = 34 % 10 = 4
  79.  
  80.     DISP_BAFER[3] = cifre[jedinice];        // jedinice ispisujem uvijek.
  81.  
  82.     // Podesavam kada da ispisujem znak minus ispred prve znacajne cifre.
  83.     if(brojac < 0 && brojac > -9)                   DISP_BAFER[2] = 0xfe;
  84.     if(brojac < 0 && brojac > -99 && brojac < -9)   DISP_BAFER[1] = 0xfe;
  85.     if(brojac < 0 && brojac < -99)                  DISP_BAFER[0] = 0xfe;
  86.  
  87.     if(abs(brojac) > 9) {
  88.         DISP_BAFER[2] = cifre[desetice];
  89.     }
  90.  
  91.     if(abs(brojac) > 99) {
  92.         DISP_BAFER[1] = cifre[stotice];
  93.     }
  94. }
  95.  
  96. ////////////////////////////////////////////////////////////////////////////////////////
  97.  
  98. ISR(TIMER0_COMPA_vect)
  99. {
  100.     //prekid tajmera 0 usled dostizanja vrednosti registra OCR0A
  101.     if (++disp > 3)
  102.     disp = 0;
  103.  
  104.     PORTB = ~(1 << (3-disp)); //ukljucenje tranzistora
  105.     PORTD = DISP_BAFER[disp]; //ispis na trenutno aktivan displej
  106.     millis++; //sistemsko vreme
  107. }
  108.  
  109. int main()
  110. {
  111.     //unsigned long t0;
  112.     //unsigned char i;
  113.  
  114.     //inicijalizacija portova:
  115.     DDRB = 0x0f; //PB3-PB0 -> izlazi
  116.     DDRD = 0xff; //port D -> izlaz
  117.  
  118.     //inicijalizacija tajmera 0:
  119.     TCCR0A = 0x02; //tajmer 0: CTC mod
  120.     TCCR0B = 0x03; //tajmer 0: fclk = fosc/64
  121.     OCR0A = 249; //perioda tajmera 0: 250 Tclk (OCR0A + 1 = 250)
  122.     TIMSK0 = 0x02; //dozvola prekida tajmera 0
  123.     //usled dostizanja vrednosti registra OCR0A
  124.     sei(); //I = 1 (dozvola prekida)
  125.  
  126.     while(1)
  127.     {
  128.  
  129.         //t0 = millis;
  130.  
  131.         // zbog ove pauze je uociljiv blagi trzaj svih displeja pri inicijalizaciji.
  132.         //while ((millis - t0) < 500); //pauza 500ms
  133.  
  134.         //for (i = 0; i < 4; i++)
  135.         //DISP_BAFER[i] = simboli[i];
  136.         budziNaDisplej();
  137.  
  138.         //t0 = millis;
  139.  
  140.         //while ((millis - t0) < 200); //pauza 500ms
  141.  
  142.         //for (i = 0; i < 4; i++)
  143.         //DISP_BAFER[i] = 0xfe;
  144.         azurirajBrojac();
  145.     }
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement