Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define F_CPU 1000000L
- #include <avr/io.h> // plik nagłówkowy, w którym są definicje portów
- #include <util/delay.h> // plik nagłówkowy do obsługi opóźnienia
- #include <stdbool.h> // typ bool
- int main(void) {
- DDRA = 0xff; // maska portu A, wlaczenie wszystkich pinow jako wyjścia
- DDRB = 0x0; // maska portu B, włączenie wszystkich pinów jak wejścia
- PORTB = 0xff; // włączenie wszystkich rezystorów potrzebnych do działania przycisków
- bool on = false; // zmienna przechowująca aktualny stan ostatniej diody
- while(1) { // glowna petla
- if(checkForSwitch1()) playSequence(); // odtwarzanie sekwencji
- if(checkForSwitch2()) { // zmiana diody 7
- if(!on) {
- PORTA |= (1<<LED7);
- on = false;
- } else {
- PORTA &= ~(1<<LED7);
- on = true;
- }
- }
- }
- }
- // Funkcja zaświeca trzy diody, ich pozycja zależy od parametru shift
- void lightThreeLEDs(int shift) {
- PORTA = (0b111<<shift); // przesunięcie trzech jedynek na odpowiednie bity PORTA - zaświecanie odpowiednich diód
- }
- // Funkcja odtwarzająca odpowiednią sekwencję
- void playSequence() {
- int pressedCount = 0; // zmienna przekazywana jako paramatr do funkcji lightThreeLEDs(), decyduje które trzy diody mają zostać zaświecone
- int ascending = 1; // czy ledy "leca" aktualnie w gore czy w dol
- 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ół
- lightThreeLEDs(pressedCount);
- if(ascending) pressedCount++; else pressedCount--; // w zależności od ustawienia zmiennej ascending
- if(pressedCount == 5) ascending = 0; // przy dojściu do końca ustaw, że diody będą "leciały" w dół
- if(pressedCount == 0) ascending = 1; // przy zejściu do początku, ustaw spowrotem aby
- }
- }
- bool checkForSwitch1() {
- if(!(PINB & (1<<PB0))) { // sprawdzanie czy naciśnięto przycisk SW_1
- _delay_ms(80); // opóźnienie
- 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
- return true;
- } else return false;
- } else return false;
- }
- bool checkForSwitch2() {
- if(!(PINB & (1<<PB1))) { // sprawdzanie czy naciśnięto przycisk SW_2
- _delay_ms(80); // opóźnienie
- 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
- return true;
- } else return false;
- } else return false;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement