Advertisement
FR4GG13

[Mikro] przerwania przygotowane prog

Nov 30th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.57 KB | None | 0 0
  1. #include <avr/io.h> //Biblioteka zawieraj¹ca funkcje steruj¹ce portami
  2. #include <avr/interrupt.h> //Biblioteka do obs³ugi przerwañ
  3.  
  4. ISR(TIMER0_OVF_vect) //Pocz¹tek procedury przerwania
  5. {
  6.     TCNT0 = 55; //Ustawienie wartoœci pocz¹tkowej timera na 55
  7.     PORTA ^= _BV(0); //Negacja najm³odszego bitu portu A
  8. }
  9.  
  10. int main()
  11. {
  12.     DDRA = 0xFF; //Ustawienie linii portu A jako wyjœcie
  13.     TIMSK |= (1 << TOIE0); //Ustawienie przerwania (wykona siê gdy licznik bêdzie przepe³niony)
  14.     sei(); //Globalne zezwolenie na przerwanie
  15.     TCCR0 |= (1 << CS00) | (1 << CS02); //Start timera (tryb normalny preskaler 1024)
  16.  
  17.     while(1) //Pêtla nieskoñczona
  18.     {
  19.     }
  20. }
  21. ===================================================================================================
  22. ===================================================================================================
  23. #include <avr/io.h> //Biblioteka zawieraj¹ca funkcje steruj¹ce portami
  24. #include <avr/interrupt.h> //Biblioteka do obs³ugi przerwañ
  25.  
  26. volatile char a; //Inicjalizacja zmiennej swobodnej (dostêpnej w ca³ym programie)
  27.  
  28. ISR(TIMER0_OVF_vect) //Pocz¹tek procedury przerwania
  29. {
  30.     a = 1; //Ustawienie wartoœci zmiennej a na 1
  31.     TCNT0 = 55; //Ustawienie wartoœci pocz¹tkowej timera na 55
  32. }
  33.  
  34. int main()
  35. {
  36.     DDRA = 0xFF; //Ustawienie linii portu A jako wyjœcie
  37.     TIMSK |= (1 << TOIE0); //Ustawienie przerwania (wykona siê gdy licznik bêdzie przepe³niony)
  38.     sei(); //Globalne zezwolenie na przerwanie
  39.     TCCR0 |= (1 << CS00) | (1 << CS02); //Start timera (tryb normalny preskaler 1024)
  40.  
  41.     while(1) //Pêtla nieskoñczona
  42.     {
  43.         if(a == 1) //Instrukcja wykona siê jeœli zmienna a ma wartoœæ 1 (czyli wyst¹pi³o przerwanie)
  44.         {
  45.             PORTA ^= _BV(0); //Negacja najm³odszego bitu portu A
  46.             a = 0; //Ustawienie wartoœci zmiennej a na 0
  47.         }
  48.     }
  49. }
  50.  
  51. ===================================================================================================
  52. ===================================================================================================
  53. #include <avr/io.h> //Biblioteka zawieraj¹ca funkcje steruj¹ce portami
  54. #include <util/delay.h> //Biblioteka zawieraj¹ca funkcjê opóŸniaj¹c¹
  55. #include <avr/interrupt.h> //Biblioteka do obs³ugi przerwañ
  56.  
  57. char button() //Pocz¹tek procedury do obs³ugi klawiatury
  58. {
  59.     PORTA = 0xFF;
  60.     char key, row, pressed = 0;
  61.     unsigned char button = 0;
  62.  
  63.     for(row = 4; row <= 7; row++)
  64.     {
  65.         DDRA = _BV(row);
  66.         PORTA = ~_BV(row);
  67.         key = PINA;
  68.         _delay_ms(15);
  69.              
  70.         if(key != PINA)
  71.         {
  72.             key = PINA;
  73.         }
  74.  
  75.         key &= 0x0F;
  76.  
  77.         if(key != 0x0F)
  78.         {
  79.             if(pressed == 0)
  80.             {
  81.                 button = (key | (PORTA & 0xF0));
  82.                 pressed++;
  83.             }
  84.  
  85.             else
  86.             {
  87.                 return 0xFF;
  88.             }
  89.         }
  90.          
  91.     }
  92.  
  93.     if(pressed == 0)
  94.     {
  95.         return 0;
  96.     }
  97.  
  98.     else
  99.     {
  100.         switch(button)
  101.         {
  102.             case 0b11101110: return 1;
  103.             case 0b11011110: return 2;
  104.             case 0b10111110: return 3;
  105.             case 0b01111110: return 4;
  106.             case 0b11101101: return 5;
  107.             case 0b11011101: return 6;
  108.             case 0b10111101: return 7;
  109.             case 0b01111101: return 8;
  110.             case 0b11101011: return 9;
  111.             case 0b11011011: return 10;
  112.             case 0b10111011: return 11;
  113.             case 0b01111011: return 12;
  114.             case 0b11100111: return 13;  
  115.             case 0b11010111: return 14;  
  116.             case 0b10110111: return 15;
  117.             case 0b01110111: return 16;
  118.             default: return 0xFF;
  119.         }
  120.     }
  121. }
  122.  
  123. ISR(INT0_vect) //Pocz¹tek procedury przerwania
  124. {
  125.     cli(); //Wy³¹czenie systemu przerwañ
  126.     GICR &= _BV(INT0); //Ustawienie bitu INT0 w rejestrze GICR na 0
  127.     PORTB = button(); //Zamiana stanu diod na taki jaki zwróci procedura odczytuj¹ca, który przycisk na klawiaturze jest wciœniêty
  128.     DDRA = 0xF0; //Ustawienie 4 starszych linii portu A jako wyjœcie (wybór kolumny) i m³odszych jako wejœcie (wybór wiersza)
  129.     PORTA = 0x0F;
  130.     GIFR &= _BV(INTF0); //Ustawienie flagi INTF0 w rejestrze GIFR na 0
  131.     GICR |= _BV(INT0); //W³¹czenie przerwania INT0
  132.     sei(); //Globalne zezwolenie na przerwanie
  133. }
  134.  
  135. int main()
  136. {
  137.     unsigned char tmp = MCUCR;
  138.     DDRB = 0xFF; //Ustawienie linii portu B jako wyjœcie
  139.     DDRD = 0; //Ustawienie linii portu D jako wejœcie
  140.     PORTD |= _BV(2); //Ustawienie 2 bitu portu D na 1
  141.     DDRA = 0xF0; //Ustawienie 4 starszych linii portu A jako wyjœcie (wybór kolumny) i m³odszych jako wejœcie (wybór wiersza)
  142.     PORTA = 0x0F;
  143.  
  144.     tmp |= _BV(ISC01);
  145.     tmp &= ~_BV(ISC00);
  146.     MCUCR = tmp; //Ustawienie bitu ISC01 na 1 oraz bitu ISC00 na 0 w rejestrze MCUCR (reakcja INT0 na zbocze opadaj¹ce)
  147.     GICR|= _BV(INT0); //W³¹czenie przerwania INT0
  148.     sei(); //Globalne zezwolenie na przerwanie
  149.  
  150.     while(1)
  151.     {
  152.         _delay_ms(5); //OpóŸnienie o 5 milisekund
  153.     }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement