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.