Как установить, сбросить, проверить нужный бит или битовые операции

Как установить, сбросить, проверить нужный бит или битовые операции

Для тех кому надо освежить знания оставлю тут памятку, более подробно эти операции будут рассмотрены в статье.

установить нулевой бит
PORTB | = 0x01;

сбростить нулевой бит
PORTB &= ~0x01;

проверить установлен ли бит
if(PORTB & 0x01)
{

}

инвертировать значение нулевого бита
#define    LED    0x01 
PORTB ^= LED;


Независимо от того какие микроконтроллеры Вы собираетесь программировать, первое что придётся освоить — это битовые операции.
Битовых операций в языке Си всего 6.

& ( AND )
| ( OR )
^ ( XOR )
~  ( NOT )
<<(сдвиг влево)
>>(сдвиг вправо)

Начнем с того, что выводы микроконтроллера условно разделены на порты, у Atmega16 порт состоит из 8 выводов, у STM32f103 из 16 выводов.
Как установить, сбросить, проверить нужный бит  или битовые операции

Отмеченные ножки, как раз и составляют порт А.
Побитовое ИЛИ — результат операции равен 1, если один из соответствующих битов равен 1, иначе 0.
Как установить, сбросить, проверить нужный бит  или битовые операции

Установить в 1 нулевой бит порта B можно следующим образом.

PORTB = 0x01; //шестнадцатеричная запись
или
PORTB = 0b00000001; //двоичная запись
или
PORTB = 1; //десятичная запись

Таким образом, мы установили нулевой бит в 1, а все остальные в 0, то есть мы переопределили все биты порта. А что если мы хотим установить в 1 только нулевой бит и не задеть остальные? В таком случае нужно воспользоваться побитовым ИЛИ.


установить нулевой бит в единицу
PORTB = PORTB | 0x01;
или воспользовавшись составным присваиванием
PORTB | = 0x01;

Как установить, сбросить, проверить нужный бит  или битовые операции

В результате мы изменили только нулевой бит порта.
Надо отметить, что в микроконтроллерах счёт начинается с нуля, то есть первый бит будет иметь нулевой порядковый номер, а порядковый номер восьмого бита будет 7.


Битовая операция НЕ — изменяет значение бита на противоположное.
Как установить, сбросить, проверить нужный бит  или битовые операции

Побитовое И — если соответствующие биты равны 1, результирующий бит равен 1. Если один из соответствующих битов равен 0, то результирующий бит равен 0.
Как установить, сбросить, проверить нужный бит  или битовые операции

Эта операция совместно с битовым НЕ может использоваться для сброса конкретного бита в ноль.


сростить нулевой бит
PORTB &= 0xFE;
или
PORTB &= ~0x01;

При такой записи, мы выставляем в единицу бит, который хотим обнулить, затем инвертируем получившееся число
Как установить, сбросить, проверить нужный бит  или битовые операции

Теперь накладываем получившуюся маску
Как установить, сбросить, проверить нужный бит  или битовые операции

В итоге мы выставили в 0 только первый бит.

Также эту операцию можно использовать для проверки чему равен бит. Например, нам надо проверить чему равен нулевой бит порта B, это можно сделать с помощью следующей конструкции.
if(PORTB & 0x01)

Как установить, сбросить, проверить нужный бит  или битовые операции

Если бит равен единице, выражение в скобках будет правда, иначе — ложь.


Побитовое исключающее ИЛИ — если сумма соответствующих битов число чётное, результирующий бит 0, иначе 1.
Как установить, сбросить, проверить нужный бит  или битовые операции

С помощью этой операции можно инвертировать состояние выбранного бита. Например, к нулевому выводу порта подключен светодиод и при выполнении одного и того же фрагмента кода, мы хотим чтобы он погас если горит и наоборот, зажёгся если не горит.

#define    LED    0x01 
PORTB ^= LED;

Как установить, сбросить, проверить нужный бит  или битовые операции

Также с помощью этой операции можно определить равенство регистров. Например, мы хотим сравнить в одинаковом ли состоянии находятся порты B и D.
if(PORTB ^ PORTD)

Как установить, сбросить, проверить нужный бит  или битовые операции

Если результат равен нулю, то содержимое регистров равно.


Логический сдвиг влево — все разряды при этом сдвигаются на одну позицию влево, самый левый бит теряется, а в самый правый бит записывается 0.
Как установить, сбросить, проверить нужный бит  или битовые операции

Операция логического сдвига влево эквивалентна умножению на 2.
0b0000 1011 = 11
0b0001 0110 = 22


Логический сдвиг вправо — все разряды при этом сдвигаются на одну позицию вправо, самый правый бит теряется, а в самый левый бит записывается 0.
Как установить, сбросить, проверить нужный бит  или битовые операции

Операция логического сдвига влево эквивалентна делению на 2.
0b1000 1011 = 147
0b0100 0101 = 73
Видно, что при делении на 2 результат округляется в меньшую сторону, на этом всё.
комментарии
2