Тип данных – бит

Views: 1651


  1. Тип данных – бит
  2. Битовые операции (установка, сброс и инвертирование бита)
  3. Тестирование бита в байте

Бит

Компилятор XC8 поддерживает разрядные целочисленные типы, которые могут содержать значения  0 или 1. Чтобы обеспечить максимальное удобство программиста при решении задач, связанных с манипуляциями отдельными битами, был введен дополнительный тип данных – бит (bit). Переменные этого типа описываются как обычно:

static bit init_flag;

Переменные типа бит не могут иметь модификатор auto и не могут передаваться в функцию в качестве аргумента, но функция может возвращать значение типа бит. По большому счету переменные этого типа ведут себя как обычные переменные типа unsigned char, но при этом могут принимать значение 0 или 1. Поэтому их удобно использовать для определения различных логических переменных и флагов. Такой подход значительно экономит оперативную память. Компилятор не позволяет создавать указатели типа бит или статически инициализировать переменные этого типа.

Все операции с переменными типа бит выполняются с помощью бит-ориентированных инструкций ассемблера, насколько это вообще возможно, при этом создается очень эффективный и компактный код. Если попытаться присвоить переменной типа бит целое значение, то будет сохранен только младший бит.

Все переменные этого типа упаковываются таким образом, что 8 переменных типа бит в памяти займут один байт.


Битовые операции (установка, сброс и инвертирование бита)

Примеры:

// устанавливается бит (биты) в позиции «1»
foo |= 0b00010000; 
foo |= 0b00010100; 

// сбрасывается бит (биты) в позиции «0»
foo &= 0b10111111;
foo &= 0b10111011;

// инвертируем биты порта
LATB2 = !LATB2;

// инвертирование бита описанного в структуре
Bit.MIG =  !Bit.MIG;

// инвертирование бита в позиции «1»
foo ^= 0b00010000;

// варианты записей
// инвертирование бита 0
leds ^= 1;
// инвертирование бита 1
leds ^= (1<<1);
// инвертирование бита 2
leds ^= (1<<2);
// инвертирование бита 3
leds ^= (1<<3);

Для более наглядного использования работы с битами принятого в ассемблере, можно в начале программы описать макросы для установки,  для очистки и инвертирования бита в переменной:

#define bitset(var,bitno) ((var) |= 1<<(bitno)); 	// установить
#define bitclr(var,bitno) ((var) &= ~(1<<(bitno)));	// сбросить
#define bitbtg(var,bitno) ((var) ^= 1<<(bitno));	// инвертировать

1UL – константа 1 указывается unsigned long – положительное длинное

#define bitset(var,bitno) ((var) |= 1UL<<(bitno)); 	// установить
#define bitclr(var,bitno) ((var) &= ~(1UL <<(bitno)));	// сбросить
#define bitbtg(var,bitno) ((var) ^= 1UL <<(bitno));	// инвертировать

Пример:

unsigned int foo;

	bitset(foo,14);  // установить бит 14
	bitclr(foo,14);   // сбросить бит 14
	bitbtg (foo,14); // инвертировать бит 14  
	foo |= 0b0101; // установить 0 и 2 биты

Тестирование бита в байте

Для тестирования бита в байте можно применить,
например,

//тестируем бит 7 на ноль
if(!(PORTB & 0b10000000))

//тестируем бит 7 на единицу
if(PORTB & 0b10000000)


Это может быть интересно


  • NeoPixel LED and PIC24NeoPixel LED and PIC24
    Views: 781 Популярность однопроводной шины для управления светодиода типа WS2812 не ослабевает, а новые типы светодиодов в корпусах 3,5*3,5мм, 2,0*2,0мм становяться все больше привлекательными. Построение дисплеев для анимации требуют все …
  • DIXELL XWEB500D-EVO + RUT900 или как пробить NAT-серверDIXELL XWEB500D-EVO + RUT900 или как пробить NAT-сервер
    Views: 1210 Когда необходимо под какой нибудь контроллер имеющий вэб сервер в инет, то нужен статический IP, что оказалось проблемой при работе с операторами сотовых сетей, конкретно с оператором сети …
  • Бегущие огни на WS2812BБегущие огни на WS2812B
    Views: 5055 В настоящее время большой популярностью стали пользоваться светодиоды со встроенным драйвером WS2812B. Текущий проект предназначен показать возможность использования и управления этими светодиодами. Это и проект и исследование по …
  • Toyota Auto Fader – Модуль включения усилителяToyota Auto Fader – Модуль включения усилителя
    Views: 2124 Toyota Auto Fader – Модуль включения усилителя. Часто автолюбители прибегают к замене штатного головного устройства на универсальное мультимедийное, в котором значительно расширены функциональные возможности. Если возникает желание оставить …
  • Проект с использованием MCC часть 14Проект с использованием MCC часть 14
    Views: 1106 С выводом данных на дисплей мы справились (но могу сразу сказать библиотеку графики к этой статьи пришлось доработать, поэтому в этом проекте она обновлена). У нас на текущем …
  • PIC32MZ – Core Timer (библиотека)PIC32MZ – Core Timer (библиотека)
    Views: 589 Переработанные файлы от Microchip, библиотека для работы с Core Timer.
  • Просто о структурах и объединениях в СиПросто о структурах и объединениях в Си
    Views: 2391 Какие задачи нам позволяют решать структуры и объединения? Для разработчика встроенных систем эффективность и компактность кода всегда на первом месте. Если программировании на Ассемблере ты сам определяешь как …
  • Униполярный шаговый двигатель – часть 2Униполярный шаговый двигатель – часть 2
    Views: 1057 В этой части только итог и версия 2.0 универсальной, которая позволяет управлять шаговым двигателем во всех трех режимах и 3.0 специальной библиотеки только для одного полушагового режима. В …
  • OLED RET012864E/REX012864JOLED RET012864E/REX012864J
    Views: 1606 RET012864E/REX012864J ОЛЕД индикатор производитель Raystar-Optronics приобретался в http://www.microchip.ua/ к сожалению никакой информации на сайте поставщика нет. Поэтому решил работу с этой версией индикатора на драйвере SSD1305 предоставить на своем сайте. Так как …
  • My libraries for Altium DesignerMy libraries for Altium Designer
    Views: 4478 Attention, this version of the database is outdated today. See updates in articles https://catcatcat.d-lan.dp.ua/altium-designer-my-setup-system-and-project-structure  and https://catcatcat.d-lan.dp.ua/altium-designer-my-setup-system-and-project-structure-v23-2/    My libraries for Altium designer  (Updated V – 29/05/2022) (c) 2021 …



Поделись этим!