Всі ці оператори є двомісними, т. Е. Вони працюють з бітами операндів і зберігають результат у відповідних бітах зазначеної вихідної змінної.

Бітовий оператор NOT

Цей оператор інвертує біти операнда. Це одномісний оператор:

Бітовий оператор OR

Побітовий оператор or виконує операцію логічного АБО з бітами операндів. Наприклад, припустимо, що у нас є два байта даних: а = obioioioio і ь = oboioioioi. Тоді вираз з = а | ь виконує логічне АБО по бітам а і ь, а потім зберігає результат в с. Результат буде дорівнює оьішш.

Ми вже обговорили проблему при виставленні контакту 3 порти PORTB в логічну 1 (не зачіпаючи значення контакту 1 того ж самого порту). Вирішити цю проблему можна за допомогою побітового АБО:

PORTB = PORTB | ОЬООООЮОО;

Як видно, виконується логічна операція АБО по вмісту PORTB і числу з одиницею в третьому бите. Ми знаємо, що якщо якийсь з операндів оператора or дорівнює 1, то результат буде дорівнює 1 (незалежно від другого операнда). Тому дана операція виставляє третій біт порту PORTB в 1. Але що буде з іншими битами? Інші біти порту PORTB будуть піддані Побітові or з нулями, а при цьому результат завжди дорівнює другому операнд. Отже, ми домоглися бажаного. Цей оператор можна записати коротко:

PORTB | = ОЬООООЮОО;

Побітовий оператор AND

Побітовий AND виконує логічну операцію І з битами операндів. Припустимо, що у нас як і в попередньому прикладі є два байта даних а = оьюююю і ь = оьою ίο ιοί. Тоді вираз з = а & ь виконує логічне І по бітам а і ь, а потім зберігає результат в с. Результат дорівнює оьоооооооо.

Ми обговорили, як встановити окремі біти в 1 за допомогою операції or. Аналогічно біти можна встановлювати в 0 за допомогою оператора and:

PORTB = PORTB & – (ОЬООООЮОО);

Оператор ~ дає зворотний побітовий код, тому еквівалентним оператором буде:

PORTB = PORTB & (ОМ 1110111);

Виконується логічна операція І по вмісту порту PORTB і числу з нулем в третьому бите. Ми знаємо, що якщо будь-який з операндів оператора and дорівнює 0, то результат теж буде дорівнює 0 (незалежно від другого операнда). Ця операція виставляє третій біт порту PORTB в 0. А що ж буде з іншими битами? Інші біти PORTB піддалися операції and з одиницями, а якщо один з операндів операції and дорівнює 1, то результат дорівнює другому операнд. Отже, ми отримали рішення і для цієї проблеми.

Побітовий оператор XOR

Побітовий xor (виключає АБО) виконує логічну операцію xor по бітам двох операндів. Як і в попередніх випадках припустимо, що у нас є два байта даних а = obioioioii і ь = oboioioioi. Тоді вираз з = аль виконує логічне xor по бітам а і ь, а потім зберігає результат в с. Значення з після цього буде одно оьшшю.

При програмуванні контролерів AVR оператор xor використовується для перемикання бітів порту без перевірки умов в операторі if-else. Якщо один з операндів цього оператора дорівнює 1, то в результаті виходить зворотний код другого операнда; а якщо один з операндів дорівнює 0, то результат дорівнює другому операнд. Тому контакт 4 порти PORTC можна перемкнути наступним чином:

Використання операторів зсуву вправо і вліво

Ці оператори зрушують вміст двійковій змінної вліво або вправо на вказане число бітів.

Припустимо, що початкове вміст змінної а показано в наступній таблиці:

Біт 7

Біт 6

Біт 5

Біт 4

Біт 3

Біт 2

Біт 1

Біто

1

1

1

1

0

1

1

1

Ми виконуємо операцію зсуву вліво на чотири біти:

а = а < < 4;

Після операції вміст а буде таким, як показано в наступній таблиці:

Біт 7

Битв

Біт 5

Біт 4

Біт 3

Біт 2

Біт 1

Біто

0

1

1

1

0

0

0

0

Ви бачите, що вміст змінної а було зрушено вліво на 4 біта і чотирьом молодшим бітам були привласнені нулі.

Давайте розглянемо інший приклад:

Ь = 1 «2;

Цей оператор говорить компілятору про те, що потрібно зрушити вміст одиниці вліво на 2 біти. Спочатку одиниця представляється так, як показано в наступній таблиці:

Біт 7

Біт 6

Біт 5

Біт 4

Біт 3

Біт 2

Біт 1

Біто

0

0

0

0

0

0

0

1

Після операції вміст змінної ь буде таким :.

Біт 7

Біт 6

Біт 5

Біт 4

Біт 3

Біт 2

Біт 1

Біто

0

0

0

0

0

1

0

0

Другий біт змінної ь став дорівнює 1. Це стандартний спосіб маніпуляції окремими бітами. Застосування побітового xor до будь-якого порту і змінної ь (з подальшим збереженням результату назад в порт) встановить другий біт в 1 і не вплине на інші біти (як це вже було роз’яснено раніше). Наприклад, розглянемо наступні оператори для оголошення сьомого біта порту PORTD як вихідного:

DDRD | = 1«7 ;

Всі біти регістрів введення / виводу контролерів AVR мають імена, які можна знайти в специфікації контролера. Ці імена потім транслюються компілятором WinAVR в макроси. Наприклад, контакти регістра PORTD мають імена від PD7 до PD0 і оголошуються в компіляторі так:

#define PD7 7 and others alike

Таким чином, наступний рядок коду також встановлює третій біт порту PORTB в одиницю:

PORTB | = 1 «РВЗ;

Вивчивши цей матеріал, ви зможете зрозуміти всі коди проекту 1 з глави 1.

Джерело: Гадре, Д., Цікаві проекти на базі мікроконтролерів tinyAVR / Дхананья Гадре, Нігула Мелхотра: Пер. з англ. – СПб .: БХВ-Петербург, 2012. – 352 с .: іл. – (Електроніка)