Przykład 3 - przerzutnik T
Algorytm działania programu przedstawia poniższy rusynek :

Zadaniem programu jest zanegowanie stanu diody LED podłączonej do
wyprowadzenia PB7 po naciśnięciu przycisku S1
// Przykład 3 -
Przerzutnik T
// Dołączenie wymaganego pliku nagłówkowego
#include <avr/io.h>
// makroinstrukcja negująca stan wyprowadzenia PORTB.7
#define TOGGLE_LED PORTB ^= 0x80;
// 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
}
// Program główny
int main(void)
{
// konfiguracja portów I/O
DDRB = 0xFF;
DDRD = 0xFC;
PORTB = 0xFF;
PORTD = 0xF7;
// Pętla nieskoczona
while(1)
{
// Jeśli PIND.0 jest w sanie niskim
// to znaczy, że wciśnięto S1
if(bit_is_clear(PIND, 0))
{
TOGGLE_LED; // a wtedy zaneguj bit PORTD.7 (negacja poprzez
wykonanie funcji ex-or ze stałą 0x80)
waitms(250); // i czekaj ok. 250ms
}
}// koniec pętli nieskończonej
return 0;
} |
Program jest podobny do poprzedniego przykładu. Sprawdzany jest stan
tylko jednego przycisku i jeśli przycisk został naciśniety wykonywana
jest makroinstrucja TOGGLE_LED. W wyniku jej wykonania zanegowany
zostanie najstarszy bit rejestru PORTB. Negacja zostanie zrealizowana
poprzez operację sumy modulo-2 rejestru PORTB
ze stałą 0x80 (zanegowana zostanie
zawartość najstarszego bitu, natomiast pozostałe bity zostaną
niezmienione)