Advertisement
Guest User

Untitled

a guest
Oct 19th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.73 KB | None | 0 0
  1. #define F_CPU 1000000L
  2. #include <avr/io.h> // plik nagłówkowy, w którym są definicje portów
  3. #include <util/delay.h> // plik nagłówkowy do obsługi opóźnienia
  4. #include <stdbool.h> // typ bool
  5.  
  6. int main(void) {
  7.     DDRA = 0xff; // maska portu A, wlaczenie wszystkich pinow jako wyjścia
  8.     DDRB = 0x0; // maska portu B, włączenie wszystkich pinów jak wejścia
  9.     PORTB = 0xff; // włączenie wszystkich rezystorów potrzebnych do działania przycisków
  10.  
  11.     bool on = false; // zmienna przechowująca aktualny stan ostatniej diody
  12.  
  13.     while(1) { // glowna petla
  14.  
  15.         if(checkForSwitch1()) playSequence(); // odtwarzanie sekwencji
  16.  
  17.         if(checkForSwitch2()) { // zmiana diody 7
  18.             if(!on) {
  19.                 PORTA |= (1<<LED7);
  20.                 on = false;
  21.             } else {
  22.                 PORTA &= ~(1<<LED7);
  23.                 on = true;
  24.             }
  25.         }
  26.  
  27.     }
  28. }
  29.  
  30. // Funkcja zaświeca trzy diody, ich pozycja zależy od parametru shift
  31. void lightThreeLEDs(int shift) {
  32.     PORTA = (0b111<<shift); // przesunięcie trzech jedynek na odpowiednie bity PORTA - zaświecanie odpowiednich diód
  33. }
  34.  
  35. // Funkcja odtwarzająca odpowiednią sekwencję
  36. void playSequence() {
  37.     int pressedCount = 0; // zmienna przekazywana jako paramatr do funkcji lightThreeLEDs(), decyduje które trzy diody mają zostać zaświecone
  38.     int ascending = 1; // czy ledy "leca" aktualnie w gore czy w dol
  39.     for(int i = 0; i < (5 * 4 * 2); i++) { // 5 pozycji trzech diód, 4 razy sekwencja, 2 razy, bo jedna sekwencja = diody "lecą" w górę i spowrotem w dół
  40.         lightThreeLEDs(pressedCount);
  41.         if(ascending) pressedCount++; else pressedCount--; // w zależności od ustawienia zmiennej ascending
  42.         if(pressedCount == 5) ascending = 0; // przy dojściu do końca ustaw, że diody będą "leciały" w dół
  43.         if(pressedCount == 0) ascending = 1; // przy zejściu do początku, ustaw spowrotem aby
  44.     }
  45. }
  46.  
  47. bool checkForSwitch1() {
  48.     if(!(PINB & (1<<PB0))) { // sprawdzanie czy naciśnięto przycisk SW_1
  49.         _delay_ms(80); // opóźnienie
  50.         if(!(PINB & (1<<PB0))) { // ponowne sprawdzenie czy przycisk SW_1 jest naciśnięty, potrzebne aby nie brać pod uwagę skoków napięcia przy naciskaniu przycisków
  51.             return true;
  52.         } else return false;
  53.     } else return false;
  54. }
  55.  
  56. bool checkForSwitch2() {
  57.     if(!(PINB & (1<<PB1))) { // sprawdzanie czy naciśnięto przycisk SW_2
  58.         _delay_ms(80); // opóźnienie
  59.         if(!(PINB & (1<<PB1))) { // ponowne sprawdzenie czy przycisk SW_2 jest naciśnięty, potrzebne aby nie brać pod uwagę skoków napięcia przy naciskaniu przycisków
  60.             return true;
  61.         } else return false;
  62.     } else return false;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement