Views: 1651
- Тип данных – бит
- Битовые операции (установка, сброс и инвертирование бита)
- Тестирование бита в байте
Компилятор 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)
Это может быть интересно
My libraries for Altium DesignerViews: 4490 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 …
PIC32MZ – прерывания (заметки)Views: 536 Виды формирования запоминая контекста при входе в прерывания. Компилятор представляет три варианта AUTO – когда запоминания места возврата из подпрограммы возложено на программу, т.е все создается программно. Этот …
Проект с использованием MCC часть 04Views: 1370 Теперь простого горения светиков нам не достаточно, заставим их мигать. Для начала используем первобытно простой способ, но достаточно простой. Используем функции delay, напрягаться откуда они берутся не будем, самое …
Регулятор влажностиViews: 1397 Регулятор ILLISSI-CH-1000 предназначен для контроля и регулировки относительной влажности в диапазоне от 0 до 100%. Регулятор позволяет работать как в режиме осушения, так и увлажнения. Для измерения возможно …
Audio-bluetooth modules BK8000L (noname)Views: 915 Еще один вариант, так сказать недоразумения Audio-bluetooth modules BK8000L (noname). Его отличительной маркировкой служат два отверстия в плате и надпись R2. Отличают его от модулей на чипе BK8000L, …
USB K-L-line адаптерViews: 4777 USB K-L-line адаптер предназначен для связи персонального компьютера с диагностической шиной автомобиля – интерфейс ISO-9141. Этот проект предназначен для сборки недорого устройства с использованием специально для этой цели …
Модуль CAN в микроконтроллерах PIC18Views: 6019 Введение CAN последовательный интерфейс связи, который эффективно поддерживает распределенное управление в реальном масштабе времени с высокой помехозащищенностью. Протокол связи полностью определен Robert Bosch GmbH, в спецификации требований …
Контроллер управления светодиодным освещением с дистанционным управлениемViews: 2077 Все активнее светодиоды входят в нашу жизнь. Всё эффективнее становится светодиодное освещение. Всё ниже опускаются цены. Всё больше появляется возможностей получения сочных цветов, простоты в управлении. Всё чаще …
HVLD модуль на примере PIC24FJ128GA204Views: 888 HVLD модуль представляет собой простое устройство, для контроля напряжения питания микроконтроллера или внешнего напряжения (через делитель). Его задача при “выходе” напряжения за заданные пределы сформировать сообщение микроконтроллеру, что …
Altium Designer my Libraries, Project templates, System settings by Catcatcat V23.09Views: 751 September 2023 component base update. Release updates V. – 23_09 added new components. Changed the structure of the database. Configuration file name – DXPPreferences1.DXPPrf. Added project CLUBBEST_50_Light. …