Lekcja 9: Sterowanie wieloma diodami LED

Kilka wyjść, maski bitów, wzorce świecenia i myślenie jak programista systemów wbudowanych.

1) Cel lekcji

W tej lekcji przestajesz myśleć o LED-zie jako o „jednym pinie”. Zaczynasz traktować port mikrokontrolera jako 8-bitową magistralę wyjść.

  • sterowanie wieloma diodami jednocześnie,
  • używanie masek bitowych,
  • tworzenie wzorców świecenia,
  • praca na całym rejestrze PORT.
To jest fundament pod: wyświetlacze LED, linijki świetlne, wskaźniki, multipleksowanie.

2) Konfiguracja sprzętowa

Podłącz diody LED (z rezystorami) do portu PORTB:

  • PB0 – LED1
  • PB1 – LED2
  • PB2 – LED3
  • PB3 – LED4

Wspólna masa (GND), zasilanie 5V jak w poprzedniej lekcji.

3) Ustawienie wielu wyjść jednocześnie

DDRB |= (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3);

Jedna linia kodu ustawia cztery piny naraz.

Wniosek:
Rejestr DDRB to tylko liczba 8-bitowa. Operujesz na bitach, nie na „pinach”.

4) Zapalanie kilku LED jednocześnie

PORTB |= (1 << PB0) | (1 << PB2);   // LED1 i LED3

Możesz sterować dowolną kombinacją diod jednym zapisem.

5) Wzorce świecenia – podejście binarne

PORTB = 0b00001111; // wszystkie 4 LED ON
_delay_ms(500);

PORTB = 0b00000000; // wszystkie OFF
_delay_ms(500);

To dokładnie to samo, co:

PORTB = 0x0F;
Uwaga dydaktyczna:
Zapis binarny jest czytelniejszy na początku nauki niż heksadecymalny.

6) Efekt „biegnącego światła”

while (1)
{
    PORTB = (1 << PB0); _delay_ms(200);
    PORTB = (1 << PB1); _delay_ms(200);
    PORTB = (1 << PB2); _delay_ms(200);
    PORTB = (1 << PB3); _delay_ms(200);
}

To klasyczny efekt testowy stosowany w elektronice i automatyce.

7) Biegnące światło – wersja logiczna (shift)

uint8_t pattern = 0x01;

while (1)
{
    PORTB = pattern;
    _delay_ms(200);
    pattern <<= 1;
    if (pattern > 0x08) pattern = 0x01;
}
To jest bardzo ważny moment.
Właśnie używasz przesunięć bitowych jak w prawdziwych sterownikach LED.

8) Zadania praktyczne – poziom podstawowy

  1. Zapal wszystkie LED naraz.
  2. Zrób miganie: wszystkie ON / wszystkie OFF.
  3. Zrób efekt „prawo → lewo”.

9) Zadania praktyczne – poziom średni

  1. Zrób „licznik binarny” na 4 LED.
  2. Zwiększaj wartość co 300 ms.
  3. Zresetuj licznik po 15.

10) Zadanie rozszerzające

Zaimplementuj tablicę wzorców:

uint8_t patterns[] = {
  0b0001,
  0b0011,
  0b0111,
  0b1111
};

I odtwarzaj je w pętli.

Jeśli to rozumiesz – jesteś gotowy na przyciski i warunki logiczne.