Как установить, сбросить, проверить нужный бит или битовые операции
Для тех кому надо освежить знания оставлю тут памятку, более подробно эти операции будут рассмотрены в статье.
Независимо от того какие микроконтроллеры Вы собираетесь программировать, первое что придётся освоить — это битовые операции.
Битовых операций в языке Си всего 6.
Начнем с того, что выводы микроконтроллера условно разделены на порты, у Atmega16 порт состоит из 8 выводов, у STM32f103 из 16 выводов.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429549337_930a24c8fa49e37a4261654a0e58cec8.jpg)
Отмеченные ножки, как раз и составляют порт А.
Побитовое ИЛИ — результат операции равен 1, если один из соответствующих битов равен 1, иначе 0.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](https://hubstub.ru/uploads/posts/2015-04/1429538079_96298dd3893a48b7fe773c5ae760cb1b.jpg)
Установить в 1 нулевой бит порта B можно следующим образом.
Таким образом, мы установили нулевой бит в 1, а все остальные в 0, то есть мы переопределили все биты порта. А что если мы хотим установить в 1 только нулевой бит и не задеть остальные? В таком случае нужно воспользоваться побитовым ИЛИ.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538199_92d0cf5cac4021dfaf48ec137f99e8e0.jpg)
В результате мы изменили только нулевой бит порта.
Надо отметить, что в микроконтроллерах счёт начинается с нуля, то есть первый бит будет иметь нулевой порядковый номер, а порядковый номер восьмого бита будет 7.
Битовая операция НЕ — изменяет значение бита на противоположное.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538417_860e8143e51906f985432c31bb2c80c8.jpg)
Побитовое И — если соответствующие биты равны 1, результирующий бит равен 1. Если один из соответствующих битов равен 0, то результирующий бит равен 0.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538504_699b355bd7a3fcfcc644b708d6eb30a9.jpg)
Эта операция совместно с битовым НЕ может использоваться для сброса конкретного бита в ноль.
При такой записи, мы выставляем в единицу бит, который хотим обнулить, затем инвертируем получившееся число
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538637_07ec7915577ed7fe08ea7b6e699f8dd0.jpg)
Теперь накладываем получившуюся маску
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538624_6c8bec04f636475dcb7ca876ce7771b9.jpg)
В итоге мы выставили в 0 только первый бит.
Также эту операцию можно использовать для проверки чему равен бит. Например, нам надо проверить чему равен нулевой бит порта B, это можно сделать с помощью следующей конструкции.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538699_79a04f6fd46c864b9b1e1d4747424ee4.jpg)
Если бит равен единице, выражение в скобках будет правда, иначе — ложь.
Побитовое исключающее ИЛИ — если сумма соответствующих битов число чётное, результирующий бит 0, иначе 1.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538796_6a944a78ce7a4ef0eb5485bf55703955.jpg)
С помощью этой операции можно инвертировать состояние выбранного бита. Например, к нулевому выводу порта подключен светодиод и при выполнении одного и того же фрагмента кода, мы хотим чтобы он погас если горит и наоборот, зажёгся если не горит.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538855_fa13311e80d5abe7ec516aee09f9abc7.jpg)
Также с помощью этой операции можно определить равенство регистров. Например, мы хотим сравнить в одинаковом ли состоянии находятся порты B и D.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429539372_a53262e75f2fec0808724759e1633378.jpg)
Если результат равен нулю, то содержимое регистров равно.
Логический сдвиг влево — все разряды при этом сдвигаются на одну позицию влево, самый левый бит теряется, а в самый правый бит записывается 0.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429539218_left.jpg)
Операция логического сдвига влево эквивалентна умножению на 2.
0b0000 1011 = 11
0b0001 0110 = 22
Логический сдвиг вправо — все разряды при этом сдвигаются на одну позицию вправо, самый правый бит теряется, а в самый левый бит записывается 0.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429550500_right.jpg)
Операция логического сдвига влево эквивалентна делению на 2.
0b1000 1011 = 147
0b0100 0101 = 73
Видно, что при делении на 2 результат округляется в меньшую сторону, на этом всё.
установить нулевой бит
PORTB | = 0x01;
сбростить нулевой бит
PORTB &= ~0x01;
проверить установлен ли бит
if(PORTB & 0x01)
{
}
инвертировать значение нулевого бита
#define LED 0x01
PORTB ^= LED;
Независимо от того какие микроконтроллеры Вы собираетесь программировать, первое что придётся освоить — это битовые операции.
Битовых операций в языке Си всего 6.
& ( AND )
| ( OR )
^ ( XOR )
~ ( NOT )
<<(сдвиг влево)
>>(сдвиг вправо)
Начнем с того, что выводы микроконтроллера условно разделены на порты, у Atmega16 порт состоит из 8 выводов, у STM32f103 из 16 выводов.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429549337_930a24c8fa49e37a4261654a0e58cec8.jpg)
Отмеченные ножки, как раз и составляют порт А.
Побитовое ИЛИ — результат операции равен 1, если один из соответствующих битов равен 1, иначе 0.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](https://hubstub.ru/uploads/posts/2015-04/1429538079_96298dd3893a48b7fe773c5ae760cb1b.jpg)
Установить в 1 нулевой бит порта B можно следующим образом.
PORTB = 0x01; //шестнадцатеричная запись
или
PORTB = 0b00000001; //двоичная запись
или
PORTB = 1; //десятичная запись
Таким образом, мы установили нулевой бит в 1, а все остальные в 0, то есть мы переопределили все биты порта. А что если мы хотим установить в 1 только нулевой бит и не задеть остальные? В таком случае нужно воспользоваться побитовым ИЛИ.
установить нулевой бит в единицу
PORTB = PORTB | 0x01;
или воспользовавшись составным присваиванием
PORTB | = 0x01;
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538199_92d0cf5cac4021dfaf48ec137f99e8e0.jpg)
В результате мы изменили только нулевой бит порта.
Надо отметить, что в микроконтроллерах счёт начинается с нуля, то есть первый бит будет иметь нулевой порядковый номер, а порядковый номер восьмого бита будет 7.
Битовая операция НЕ — изменяет значение бита на противоположное.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538417_860e8143e51906f985432c31bb2c80c8.jpg)
Побитовое И — если соответствующие биты равны 1, результирующий бит равен 1. Если один из соответствующих битов равен 0, то результирующий бит равен 0.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538504_699b355bd7a3fcfcc644b708d6eb30a9.jpg)
Эта операция совместно с битовым НЕ может использоваться для сброса конкретного бита в ноль.
сростить нулевой бит
PORTB &= 0xFE;
или
PORTB &= ~0x01;
При такой записи, мы выставляем в единицу бит, который хотим обнулить, затем инвертируем получившееся число
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538637_07ec7915577ed7fe08ea7b6e699f8dd0.jpg)
Теперь накладываем получившуюся маску
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538624_6c8bec04f636475dcb7ca876ce7771b9.jpg)
В итоге мы выставили в 0 только первый бит.
Также эту операцию можно использовать для проверки чему равен бит. Например, нам надо проверить чему равен нулевой бит порта B, это можно сделать с помощью следующей конструкции.
if(PORTB & 0x01)
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538699_79a04f6fd46c864b9b1e1d4747424ee4.jpg)
Если бит равен единице, выражение в скобках будет правда, иначе — ложь.
Побитовое исключающее ИЛИ — если сумма соответствующих битов число чётное, результирующий бит 0, иначе 1.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538796_6a944a78ce7a4ef0eb5485bf55703955.jpg)
С помощью этой операции можно инвертировать состояние выбранного бита. Например, к нулевому выводу порта подключен светодиод и при выполнении одного и того же фрагмента кода, мы хотим чтобы он погас если горит и наоборот, зажёгся если не горит.
#define LED 0x01
PORTB ^= LED;
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429538855_fa13311e80d5abe7ec516aee09f9abc7.jpg)
Также с помощью этой операции можно определить равенство регистров. Например, мы хотим сравнить в одинаковом ли состоянии находятся порты B и D.
if(PORTB ^ PORTD)
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429539372_a53262e75f2fec0808724759e1633378.jpg)
Если результат равен нулю, то содержимое регистров равно.
Логический сдвиг влево — все разряды при этом сдвигаются на одну позицию влево, самый левый бит теряется, а в самый правый бит записывается 0.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429539218_left.jpg)
Операция логического сдвига влево эквивалентна умножению на 2.
0b0000 1011 = 11
0b0001 0110 = 22
Логический сдвиг вправо — все разряды при этом сдвигаются на одну позицию вправо, самый правый бит теряется, а в самый левый бит записывается 0.
![Как установить, сбросить, проверить нужный бит или битовые операции Как установить, сбросить, проверить нужный бит или битовые операции](/uploads/posts/2015-04/1429550500_right.jpg)
Операция логического сдвига влево эквивалентна делению на 2.
0b1000 1011 = 147
0b0100 0101 = 73
Видно, что при делении на 2 результат округляется в меньшую сторону, на этом всё.
Похожие статьи