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

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)


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


  • I2C MODULE – PIC18F25K42 Device ID Revision = A001I2C MODULE – PIC18F25K42 Device ID Revision = A001
    Views: 1207 I2C MODULE Обход ошибок в версии I2C MODULE – PIC18F25K42 Device ID Revision = A001 В Серии K42 применен совершенно новый модуль шины I2C, который позволяет поддерживать все …
  • DIXELL XWEB500D-EVO + RUT900 или как пробить NAT-серверDIXELL XWEB500D-EVO + RUT900 или как пробить NAT-сервер
    Views: 1213 Когда необходимо под какой нибудь контроллер имеющий вэб сервер в инет, то нужен статический IP, что оказалось проблемой при работе с операторами сотовых сетей, конкретно с оператором сети …
  • Проект с использованием MCC часть 14Проект с использованием MCC часть 14
    Views: 1121 С выводом данных на дисплей мы справились (но могу сразу сказать библиотеку графики к этой статьи пришлось доработать, поэтому в этом проекте она обновлена). У нас на текущем …
  • Проект с использованием MCC часть 13Проект с использованием MCC часть 13
    Views: 1270 Так как используя MCC мы можем его использовать со своими библиотеками, поэтому настало время и свое создать. Для начала откроем наш заголовочный файл в нем очень много букв: По …
  • LED модуль P10C4V12LED модуль P10C4V12
    Views: 3327 LED панели на обычных регистрах типа 74HC595. Они выпускаются как монохромные так двух и полно цветные, особенность, что они предназначены для текстовой информации и имеют один уровень яркости. Общую яркость …
  • Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)
    Views: 3476 Солнечные коллекторы для отопления в Европе используют в более 50% от общего количества установленных гелиосистем. Однако следует понимать, что гелиосистемы предназначены лишь для поддержки отопления и экономии затрат на основную …
  • Проект с использованием MCC часть 12-2Проект с использованием MCC часть 12-2
    Views: 1233 Настало время для изучения шины I2C. Изучать будем на примере работы с индикатором RET012864E. Что изменили со старой схемы: В прошлой теме я затупил и не добавил подтягивающие резисторы …
  • ESP8266 применение в проектахESP8266 применение в проектах
    Views: 3803 (Актуально только для версий прошивки 1.хх) ESP8266 показала себя как надежное и безотказное устройство для обмена данными с применением WIFI. Я использую ESP8266 исключительно через UART, с применением AT …
  • MPLAB X IDE – управление проектамиMPLAB X IDE – управление проектами
    Views: 1218 Среда  MPLAB X IDE позволяет оперативно работать с несколькими проектами, например, если у вас в работе несколько проектов: Для того чтобы переключиться достаточно выбрать другой проект: Для выбора …
  • Стабилизатор тока на SN3350, часть 2Стабилизатор тока на SN3350, часть 2
    Views: 1373 Если вам необходимо разработать устройство с применением мощных светодиодов, то никак не обойтись без применения стабилизатора тока. На настоящий момент стабилизаторы тока являются самым эффективным механизмом, для питания светодиода в течение всего …



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