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

Views: 1637


  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)


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


  • Audio-bluetooth modules BK8000L (noname)Audio-bluetooth modules BK8000L (noname)
    Views: 817 Еще один вариант, так сказать недоразумения Audio-bluetooth modules BK8000L (noname). Его отличительной маркировкой служат два отверстия в плате и надпись R2. Отличают его от модулей на чипе BK8000L, …
  • Проект с использованием MCC часть 03Проект с использованием MCC часть 03
    Views: 1687 Первым делом перенастроим регистры конфигурации, следующим образом: Отключим выход генератора (CLKOUT function is disabled. I/O function on the CLKOUT pin) Включим сторожевой таймер (WDT enabled) После этой настройки …
  • Проблемы классической светомузыкиПроблемы классической светомузыки
    Views: 2164 Светомузыка – что это такое? Определение: Светомузыка  (жаргонное: цветомузыка)  — вид искусства, основанный на способности человека ассоциировать звуковые ощущения со световыми восприятиями. Такое явление в неврологии получило название …
  • Сумеречное релеСумеречное реле
    Views: 1627 Реле управления освещением, датчик день-ночь – одним словом фотореле для управления освещением или формирования сигнала для системы умный дом о понижении или повышении освещенности относительно заданного уровня. Реле выполнено по классической схеме, конденсаторный блок питания, от сети переменного тока …
  • Проект с использованием MCC часть 07Проект с использованием MCC часть 07
    Views: 1172 Модуль PWM – широтно импульсная модуляция (ШИМ). ПИК контроллеры часто на борту имеют модули ШИМ. На их основе строятся многие узлы управления электро приводами. В нашем варианте мы …
  • Простой оптический сенсор приближенияПростой оптический сенсор приближения
    Оптический сенсор, назначение оптический концевик, для автоматики, бесконтактный выключатель с функцией автоматического отключения...
  • Сенсорный выключатель светаСенсорный выключатель света
    Views: 14466 Хотя в настоящий момент актуальны системы управления освещением с передачей данных по электросети, но я думаю, что проекты такого рода тоже имеют право на жизнь. Анонс Три вида …
  • Универсальный терморегулятор ch-c3000Универсальный терморегулятор ch-c3000
    Views: 3166 Терморегулятор ch-c3000 предназначен для управления системами регулирования температуры в пределах от – (минус) 55 до + 125 С. Регулятор может использоваться как в системах отопления, так и в …
  • Проект с использованием MCC часть 04Проект с использованием MCC часть 04
    Views: 1295 Теперь простого горения светиков нам не достаточно, заставим их мигать. Для начала используем первобытно простой способ, но достаточно простой. Используем функции delay, напрягаться откуда они берутся не будем, самое …
  • Защита датчиков температуры DS18B20 от статического электричестваЗащита датчиков температуры DS18B20 от статического электричества
    Views: 1954 Статья перепечатана с сайта http://svetomuzyka.narod.ru При удалении датчика на большие расстояния возникает опасность наведения импульсов высокого напряжения на кабель, который соединяет датчик с контролером. Если не принимать меры защиты, …



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