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)
Это может быть интересно
ch-4000 – универсальная печатная платаViews: 1154 На смену устаревшей плате ch-3000, пришла новая ch-4000. Плату уже можно приобрести в магазине Ворон. Схема. Плата позволяет создавать таймеры, часы реального времени, регуляторы температуры, регуляторы влажности, вольтметры, …
Проект с использованием MCC часть 08Views: 1344 И так создадим проект в котором при помощи двух кнопок мы сможем управлять яркостью светодиодов. При использовании МСС у нас лафа полная, добрые дяди с Microchipa подготовили функции, …
Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)Views: 3477 Солнечные коллекторы для отопления в Европе используют в более 50% от общего количества установленных гелиосистем. Однако следует понимать, что гелиосистемы предназначены лишь для поддержки отопления и экономии затрат на основную …
Проект с использованием MCC часть 11Views: 1034 Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость …
TDA7294 part 2Views: 725 Це друга частина проекту TDA7294, початок дивись тут. Тут ви знайдете повністю проект високоякісного підсилювача на TDA7294, схема, 3D моделі, гербер файли для виготовлення друкованої плати. І звичайно …
MCC PIC24 – модуль REAL-TIME CLOCK AND CALENDAR (RTCC)Views: 718 RTCC предоставляет пользователю часы реального времени и функция календаря (RTCC), точность “хода” может быть откалибрована. Основные особенности модуля RTCC: • Работает в режиме глубокого сна. • Возможность выбора источника …
Униполярный шаговый двигатель – часть 2Views: 1062 В этой части только итог и версия 2.0 универсальной, которая позволяет управлять шаговым двигателем во всех трех режимах и 3.0 специальной библиотеки только для одного полушагового режима. В …
Сенсорный выключатель светаViews: 16554 Хотя в настоящий момент актуальны системы управления освещением с передачей данных по электросети, но я думаю, что проекты такого рода тоже имеют право на жизнь. Анонс Три вида …
LCD индикаторы на драйвере ML1001Views: 2065 ML1001 – статический LCD GOG (чип в стекле) драйвер для 40-сегментного LCD в позолоченном противоударном исполнении. На них можно каскадно строить цельные из 80 или 120 сегментов LCD индикаторы. …
Гаджеты для домашней автоматики – Емкостной сенсорViews: 1832 Управление светодиодным освещением – Сенсор емкостной. Данный гаджет предназначен для управления освещением где необходимо включением освещение сенсорным прикосновением. Датчик позволяет управлять светодиодной нагрузкой в виде модулей или светодиодных лент …