Operacje na bitach i bajtach

 ArduinoIDE dysponuje zestawem funkcji umożliwiających wykonywanie operacji na bitach i bajtach. Możliwe jest odczytanie wartości bitu lub jej ustawienie. 

    lowByte(), highByte()

Funkcja lowByte() umożliwia wyodrębnienie młodszego bajtu z zapisanej liczby. W przypadku, gdy zadeklarujemy zmienną jako int jej wartość przechowywana jest w dwóch bajtach. Wysłanie tej wartości poprzez port szeregowy wymaga wysłania starszego i młodszego bajtu. Funkcja lowByte() poda nam wartość młodszego bajtu, natomiast highByte() wartość starszego bajtu. Poniżej przedstawiono składnię poleceń:

int x;
lowByte(x);
highByte(x);

Funkcje wywołujemy z parametrem, który jest "większego" typu (wielobajtowy), zwracają natomiast jeden bajt. Tu nasuwa się pytanie, co zwróci funkcja w przypadku, gdy jako parametr podamy zmienną czterobajtową? W rzeczywistości funkcje umożliwiają podanie najstarszego i najmłodszego bajtu. Oznacza to, że dla liczby czterobajtowej otrzymamy bajt pierwszy lub czwarty. Bajty drugi i trzeci nie są dostępne bezpośrednio. Poniżej przedstawiono przykład zastosowania funkcji lowByte() i highByte():

int test = 0xABCD;              // liczba 16-bitowa
long int test2 = 0xABCDEF98     // liczba 32-bitowa
byte hi, lo;                    // dwie zmienne 8-bitowe

hi = HighByte(test);            // hi = 0xAB
lo = LowByte(test);             // lo = 0xCD.

hi = HighByte(test2);           // hi = 0xAB
lo = LowByte(test2);            // lo = 0x98.  

    bitRead(), bitWrite()

Funkcja bitRead() umożliwia odczytanie wartości konkretnego bitu w podanej zmiennej. Wywołujemy ją zawsze z dwoma parametrami. Pierwszy z nich to nazwa zmiennej, z jakiej chcemy odczytać wartość bitową, druga, to numer bitu do odczytu. Numerujemy zawsze od zera, czyli mamy bit zerowy, pierwszy, drugi itd. Funkcja zwróci wartość LOW lub HIGH. Funkcja bitWrite() umożliwia zapisanie konkretnego bitu. Wywoływana jest z trzema parametrami pierwszy z nich to zmienna, drugi to numer bitu, trzeci natomiast to informacja, czy bit ma zostać ustawiony (HIGH), czy skasowany (LOW).

byte x=0xF0;          // binarnie 11110000

bitRead(x,3);         // funkcja zwróci LOW
bitRead(x,7);         // funkcja zwróci HIGH

bitWrite(x,1,HIGH);   // x = 11110010
bitWrite(x,7,LOW);    // x = 01110010

Operacje bitowe często wykorzystywane są podczas programowania do ustawiania lub odczytu stanu rejestrów czy pinów na podstawie przechowywanych lub przesłanych danych. 

    bitSet(), bitClear()

Alternatywnym sposobem zmiany stanu (wartości) bitów dla funkcji bitWrite() są funkcje bitSet() oraz bitClear(). W funkcji bitWrite() jako parametr podajemy czy bit zostanie ustawiony, czy skasowany. Za pomocą jednej z funkcji bitSet() lub bitClear() jednoznacznie określamy, czy chcemy dany bit ustawić, czy skasować. Poniżej kilka przykładów zastosowania funkcji bitSet() oraz bitClear():

byte a=0xAA;              // binarnie 10101010
bitSet(a,6);              //      a = 11101010
bitClear(a,7);            //      a = 01101010
bitClear(a,7);            //      a = 01101010
bitClear(a,6);            //      a = 00101010
bitSet(a,7);              //      a = 10101010

    bit()

Funkcja bit() podaje wartość określonego podanego bitu. Dla przypomnienia w systemie binarnym każdej liczbie odpowiada wartość w zależności od pozycji jej występowania: binarne 0110 = dziesiętnie 0*2^3+1*2^2+1*2^1+0*2^0. Funkcja  bit() zwraca wartość dla podanej pozycji. Poniżej przykłady:

byte x;

x = bit(0);    // x = 1
x = bit(2);    // x = 4
x = bit(4);    // x = 16
x = bit(7);    // x = 128