Advertisement
milanmetal

AVR/C Kolokvijum 4 ... LOrA/dUGE

Jan 17th, 2018
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.06 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. unsigned char simboli[] = {
  4.         0xa7, 0x05, 0x2f, 0x0c
  5. }; //look-up tabela sa simbolima
  6.  
  7. unsigned char DISP_BAFER[4] = {
  8.         0xff, 0xff, 0xff, 0xff
  9. }; //bafer displeja
  10.  
  11. unsigned char LOrA[4] = {
  12.         0xa7, 0x05, 0x2f, 0x0c
  13. };
  14.  
  15. unsigned char dUGE[4] = {
  16.         0xc4, 0x85, 0x24, 0x26
  17. };
  18.  
  19.  
  20. unsigned long millis = 0;
  21. unsigned char disp = 3;
  22. unsigned char cntr = 0;
  23. unsigned char brojimNapred = 1;
  24.  
  25. ISR(TIMER0_COMPA_vect)
  26. {
  27.  //prekid tajmera 0 usled dostizanja vrednosti registra OCR0A
  28.  if (++disp > 3)
  29.  disp = 0;
  30.  
  31.  PORTB = ~(1 << (3-disp)); //ukljucenje tranzistora
  32.  PORTD = DISP_BAFER[disp]; //ispis na trenutno aktivan displej
  33.  
  34.  if(millis % 1000 == 0){
  35.      cntr++;
  36.      if( cntr == 5) {
  37.          if(brojimNapred == 0) {
  38.              brojimNapred = 1;
  39.          } else {
  40.              brojimNapred = 0;
  41.          }
  42.          cntr = 0;
  43.      }
  44.  }
  45.  
  46.  millis++; //sistemsko vreme
  47. }
  48.  
  49. ISR(PCINT1_vect)
  50. {
  51.     //prekid usled promene stanja pina PCINT10 ili pina PCINT8
  52.     switch ((~PINC) & 0x05)
  53.     {
  54.         case 0x01: //pritisnut levi taster
  55.             for(int i = 0; i < 4; i++) {
  56.                 simboli[i] = LOrA[i];
  57.             }
  58.         break;
  59.         case 0x04: //pritisnut desni taster
  60.             for(int i = 0; i < 4; i++) {
  61.                 simboli[i] = dUGE[i];
  62.             }
  63.         break;
  64.     }
  65. }
  66.  
  67.  
  68. int main()
  69. {
  70.     unsigned long t0;
  71.     unsigned char i;
  72.  
  73.     //inicijalizacija portova:
  74.     DDRB = 0x0f; //PB3-PB0 -> izlazi
  75.     DDRD = 0xff; //port D -> izlaz
  76.  
  77.     PCICR = (1 << PCIE1); //dozvola prekida usled promene stanja
  78.     PCMSK1 = 0x05; //pina PCINT10, ili pina PCINT8
  79.  
  80.     //inicijalizacija tajmera 0:
  81.     TCCR0A = 0x02; //tajmer 0: CTC mod
  82.     TCCR0B = 0x03; //tajmer 0: fclk = fosc/64
  83.     OCR0A = 249; //perioda tajmera 0: 250 Tclk (OCR0A + 1 = 250)
  84.     TIMSK0 = 0x02; //dozvola prekida tajmera 0
  85.     //usled dostizanja vrednosti registra OCR0A
  86.     sei(); //I = 1 (dozvola prekida)
  87.  
  88.     while(1)
  89.     {
  90.         t0 = millis;((millis - t0) < 300); //pauza 500ms
  91.  
  92.         if(brojimNapred) {
  93.             for (i = 0; i < cntr; i++){
  94.                     DISP_BAFER[i] = simboli[i];
  95.             }
  96.         }
  97.  
  98.         if(!brojimNapred) {
  99.             for (i = 0; i < cntr; i++){
  100.                     DISP_BAFER[3-i] = 0xff;
  101.             }
  102.         }
  103.  
  104.     }
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement