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

Views: 1649


  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)


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


  • Analog-to-Digital Converter with Computation Technical BriefAnalog-to-Digital Converter with Computation Technical Brief
    Views: 1457 Аналого-цифровой преобразователь с вычислительным модулем. ВВЕДЕНИЕ Аналого-цифровой преобразователь (ADC) с вычислительным модулем (ADC2) в 8-разрядном микроконтроллере Microchip имеет встроенные вычислительные функции, которые обеспечивают функции пост-обработки, такие как передискретизация, …
  • Инфракрасный датчик движения, PIR-sensorИнфракрасный датчик движения, PIR-sensor
    Views: 3297 Домашняя автоматика предполагает наличие датчиков движения, которые способны контролировать движения человека. Самым простым и доступным устройством позволяющие контролировать изменения ИК-излучения, это ПИР-сенсоры. На текущий момент доступны не дорогие модели D203B, D204B, D205B. Все …
  • DS18B20 – удаленный контроль температурыDS18B20 – удаленный контроль температуры
    Views: 3232 Контроль температуры с использованием датчиков температуры DS18B20 и платы ILLISSI-4B-09-primum Проект позволяет подключать к плате ILLISSI-4B-09-primum до 16 датчиков температуры DS18B20, удаленных более 300 метров,  и выводить информацию …
  • ch-4000 – универсальная печатная платаch-4000 – универсальная печатная плата
    Views: 1128 На смену устаревшей плате ch-3000, пришла новая ch-4000. Плату уже можно приобрести в магазине Ворон. Схема. Плата позволяет создавать таймеры, часы реального времени, регуляторы температуры, регуляторы влажности, вольтметры, …
  • Real-time music visualization technologyReal-time music visualization technology
    Views: 320 Music visualization technology in real time (RTMV-technology). Я не музикант і я не маю спеціальної музичної освіти, я інженер розробник вбудованих систем. Але моє хобі розроблення технології візуалізації …
  • Просто о внешних переменныхПросто о внешних переменных
    Views: 938  Часто возникает задача когда необходимо предавать данные между модулями программы. Например, передать данные между файлами, или управлять работой модулей. Для этого создаем заголовочный файл и описываем наши переменные как …
  • УКВ – радиоприем, часть 1УКВ – радиоприем, часть 1
    Views: 9806 Музыкальная тема к статье, слушаем: Первый мой радиоприемник, выглядел так. Использовал исключительно в школе на уроках, держась за одно ухо и преданно смотря на училку и сладко улыбаясь. …
  • Мониторинг температурыМониторинг температуры
    Views: 1474 Настоящий проект создан как обучающий с применением библиотек ds18b20 и LCDHD44780 и компилятора Microchip MPLAB XC8 C Compiler V1.12. Если необходимо иметь информацию по состоянию температуры в помещении или в здании, с количеством до 6 точек (16), то …
  • Применение typedef, struct и unionПрименение typedef, struct и union
    Views: 8909 Полезные описания переменных Часто необходимо в памяти расположить последовательно разные виды данных, что бы потом можно было их использовать. Полезные ссылки Взято и переработано с сайта http://www.butovo.com/~zss/cpp/struct.htm http://cppstudio.com/post/9172/ …
  • Дифференциальный терморегуляторДифференциальный терморегулятор
    Views: 4142 Дифференциальный терморегулятор ch-3020 Назначение. Ch-c3020 представляет собой дифференциальный терморегулятор. Основное назначение солнечные системы горячего водоснабжения, а также вентиляционные системы управление притоком свежего воздуха. Контроллер позволяет работать пяти режимах. …



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