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)
Это может быть интересно
Интерактивные LedViews: 631 Тема проекта продолжение следует…. Это может быть интересно
MCC – K42 – настройка модуля DMAViews: 1037 MCC – в версии v.3.95.0 и начиная ядра 4.85.0 конфигуратор предоставляет графический интерфейс для настройки модуля DMA. Для начала: Посмотреть какая версия МСС можно в закладке версии, если …
Проект с использованием MCC часть 09Views: 1073 Эта часть будет посвящена созданию практического проекта управления освещение. Тех задание: Два выхода управления ШИМ – светодиодным освещением. Две кнопки управления, каждая кнопка управляет, своим каналом, логика самая …
Мультимедийная сеть – AVC-LAN TOYOTAViews: 5924 AVC LAN – протокол обмена данными мультимедийных систем автомобиля. Кодирование данных. При кодировании различаться три типа данных : преамбула – её назначение, это сообщение устройствам на шине, что начинается передача данных. …
LED модуль P10C4V12Views: 3325 LED панели на обычных регистрах типа 74HC595. Они выпускаются как монохромные так двух и полно цветные, особенность, что они предназначены для текстовой информации и имеют один уровень яркости. Общую яркость …
LCD индикаторы на драйвере ML1001Views: 2065 ML1001 – статический LCD GOG (чип в стекле) драйвер для 40-сегментного LCD в позолоченном противоударном исполнении. На них можно каскадно строить цельные из 80 или 120 сегментов LCD индикаторы. …
Сумеречное релеViews: 1679 Реле управления освещением, датчик день-ночь – одним словом фотореле для управления освещением или формирования сигнала для системы умный дом о понижении или повышении освещенности относительно заданного уровня. Реле выполнено по классической схеме, конденсаторный блок питания, от сети переменного тока …
Altium Designer my Libraries, Project templates, System settings by Catcatcat. V26.0Views: 307 Altium Designer my Libraries, Project templates, System settings by Catcatcat. V26.0 Here I want to share how I configure Altium Designer and how I use the DXPPreferences1.DXPPrf …
ESP8266 процедура получение данных даты и времени от серверов точного времени.Views: 6273 Эта функция доступна уже в версии 1.6.1. Для многих приложений, необходимо часы реального времени, если в вашем проекте есть модуль WiFI ESP8266, то легко можно сделать следующим образом. …
BMP280 – температура и атмосферное давление – учебный проектViews: 2295 Учебный проект на PIC32 и светодиодной панели P5 (2121)-168-6432-80 (32*64). Проект позволяет ознакомиться с простой графикой и с чтением давления и температуры с датчика BMP280. Для тестирования необходимо …