Ciekawym projektem jaki można wykonać w ramach pierwszych projektów z mikrokontrolerami jest wykonania Knight Rider’a. Efekt którego osobom oglądającym Nieustraszonego nie trzeba przypominać.
Efekt jest dość podobny do poprzedniego projektu (Linijka Diodowa) z tą różnicą, że świecące diody przesuwają się w dwie strony. Trzeba też rozróżniać kierunki przesuwania się.
/***************************************************************** * * R01_Diody * Knight_Rider * main.c * Plik : main.c * Mikrokontroler : Atmel AVR atmega644p * Kompilator : avr-gcc Toolchain * Autor : Mariusz Czajkowski * Źródło : http://uengineering.net/ * Data : 08.12.2012 * *****************************************************************/ /***************************************************************** * * PORTB podlaczony do diod LED * *****************************************************************/ /* Definicje */ #define F_CPU 16000000UL //Definicja czestotliwosci procesora #define LEDS PORTB #define PRAWO 1 #define LEWO 0 /* Dolaczane biblioteki */ #include <avr/io.h> //Biblioteka wejsc/wyjsc #include <util/delay.h> //Biblioteka opoznien #include <stdint.h> //Biblioteka typow liczb /* Funkcje wlasne */ void ConfIO(void) { /* DDRx rejestr ustawiajacy tryb pracy pinow, 1 - wyjscie, 0 - wejscie */ DDRB = 0xff; //Port diod LED /* PORTx rejestr ustawiajacy stany pinow */ PORTB = 0xff; //Ustawienie wartosci stanu wysokiego } /* Funckja main() */ int main() { /* Zmienne lokalne */ char kierunek = 0; char Temp = 0b00000111; /* Konfiguracja procesora */ ConfIO(); //LEDS = 0b11111000; /* Petla nieskonczona */ while(1) { if( kierunek == LEWO && Temp == 0b00000111 ) { kierunek = PRAWO; Temp = Temp * 2; LEDS = ~Temp; } else if( kierunek == PRAWO && Temp == 0b11100000 ) { kierunek = LEWO; Temp = Temp / 2; LEDS = ~Temp; } else if( kierunek == PRAWO ) { Temp = Temp * 2; LEDS = ~Temp; } else if( kierunek == LEWO ) { Temp = Temp / 2; LEDS = ~Temp; } _delay_ms(100); } }
You must log in to post a comment.