mikrokontrolery.net

 

   

Przykład 5 - wyświetlacz 7-segmentowy
W tym przykładzie zapoznamy się z obsługą wyśiwetlacza 7-segmentowego LED.

// Przykład 5 - Wyświetlacz 7-segmentowy

// Dołączenie wymaganego pliku nagłówkowego
#include <avr/io.h>
// częstotliwość zegara w megahercach
#define OSC 4
// definicja funkcji opóźniającej
void waitms(unsigned char x)
{
unsigned char a, b; // zmnienne licznikowe
for( ; x > 0; --x) // ta pętla zostanie wykonana x-razy
for(b = 10; b > 0; --b) // a ta 10 razy
for(a = 25 * OSC; a > 0; --a) // natomiast ta 100 razy
__asm("nop"); // dodatkowa instrukcja opóźniająca o 1 cykl
// razem to da opóźnienie ok. x * 1ms
// x od 0 do 255
// gdy x = 0 to opóźnienie = 256ms
}
// tablica z kodami znaków dla wyświetlacza
char znaki[17] = {192,249,164,176,153,146,130,248,128,144,136,131,198,161,134,142,0};
// Program główny
int main(void)
{
// konfiguracja portów I/O
DDRB = 0xFF;
DDRD = 0xFC;
PORTB = 0xFF;
PORTD = 0xF7;
// Pętla nieskoczona
while(1)
{
char i; // deklaracja zmiennej licznikowej
// pętla wykona się 16 razy - tyle ile jest znaków do wyświetlenia
for(i = 0 ; i < 16; ++i)
{
PORTB = *(znaki + i); // na wyświetlacz wyślij znak o indeksie określonym zmienną i
waitms(250); // czekaj ok. 250 ms
}
}// koniec pętli nieskończonej
return 0;
}

Nowością w tym programie jest TABLICA. Jest to zbiór kolejno ułożonych w pamięci danych, do którego odwołujemy się za pomocą IDENTYFIKATORA TABLICY lub WSKAŹNIKA DO TABLICY(wskaźnik jest zmienna przechowującą adres innej zmiennej). W rzeczywistości identyfikator tablicy jest wskaźnikiem do jej pierwszego elementu. Ponieważ utworzenie tablicy w pamięci programu, a raczej odwoływanie się do niej jest w gcc troszkę "pokręcone" (i jak zwykle w róznych wersjach gcc robi się to inaczej), zdecydowałem się na zastosowanie "zwykłej" tablicy w pamięci RAM. W rzeczywistości tablica jest umieszczona w pamięci programu i na pocztku działania programu jej zawartość jest kopiowana do pamieci RAM. Powoduje to niepotrzebne zajęcie kilkunastu komórek pamięci RAM, ale jest to rozwiązanie najbardziej "przenośne" i zbliżone do standartu. W tablicy są zapisane kody cyfr, które mają być wyświetlone na wyświetlaczu. Aby "wydostać" odpowiednią pozycję z tablicy należy użyć operatora wyłuskania *wskaźnik. Jest to zastosowane w wierszu PORTB = *(znaki + i). Naszym wska·nikiem jest identyfikator tablicy znaki. Ponieważ na wskaźnikach można wykonywać większość typowych operacji arytmetycznych, do naszego wskaźnika dodajemy wartość zmiennej licznikowej i w celu uzyskania w pętli for(i = 0 ; i < 16; ++i) dostępu dokolejnych pozycji tablicy (w każdym kolejnym przebiegu pętli zmienna i jest większa o 1 od wartości w przebiegu poprzednim). Efektem działanietego programu będzie wiec wyświetlenie na wyświetlaczu kolejnych cyrf systemu szesnastkowego.

 

 

 

 

 

 

 

 

 

 

 
 
 
 

(c) 2004-2008 Radosław Kwiecień
Polityka prywatności