Views: 1455
- Тип данных – бит
- Битовые операции (установка, сброс и инвертирование бита)
- Тестирование бита в байте
Компилятор 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)
Это может быть интересно
- 12-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA204Views: 808 Введение. 12-битный модуль A/D Converter является усовершенствованной версией 10-битного модуля, предлагаемого на некоторых устройствах PIC24. Оба модуля являются преобразователями, в своих ядрах, с последовательным приближением (SAR), в окружении …
- Одноканальный емкостной сенсор – AT42QT1012Views: 2323 Описание сенсора [wpdm_file id=242] Незаконченный проект, так-как сенсор не оправдал своего назначения, не рекомендую, просто выброшенные деньги. Особенности. • Количество сенсоров – один, режим переключения ( touch-on/touch-off ), а также программируемая …
- ch-светомузыка от теории до реализацииViews: 682 Сразу оговоримся технология или теория ch-светомузыки, это постоянно развивающийся процесс и то что будет сказано сегодня завтра может быть опровергнуто и считаться ошибочным. Назовем само решение проблемы автоматического …
- LED драйвер TM1639Views: 2153 TМ1639 позволяет работать на матрицу 8*8 или 8 семисегметных индикаторов. Может работать как на индикаторы с общим катодом, но и есть возможность подключать общим анодом. Для управления драйвером …
- PIC32MZ – прерывания (заметки)Views: 447 Виды формирования запоминая контекста при входе в прерывания. Компилятор представляет три варианта AUTO – когда запоминания места возврата из подпрограммы возложено на программу, т.е все создается программно. Этот …
- PIC18 – модуль DMAViews: 1154 Введение Модуль прямого доступа к памяти (DMA) предназначен для обслуживания передачи данных непосредственно между различными областями памяти без вмешательства процессора. Исключив при этом необходимость в интенсивной обработки …
- Trimax – кодирование и декодирование ИК-командViews: 2149 Первое, что надо понять назначение кнопок клавиш пульта, а также, что за кодирование реализовано в ИК- пульте. Для назначения клавиш обратимся к описанию, а для взлома кодирования воспользуемся …
- OLED RET012864E/REX012864JViews: 1446 RET012864E/REX012864J ОЛЕД индикатор производитель Raystar-Optronics приобретался в http://www.microchip.ua/ к сожалению никакой информации на сайте поставщика нет. Поэтому решил работу с этой версией индикатора на драйвере SSD1305 предоставить на своем сайте. Так как …
- Проблемы классической светомузыкиViews: 2044 Светомузыка – что это такое? Определение: Светомузыка (жаргонное: цветомузыка) — вид искусства, основанный на способности человека ассоциировать звуковые ощущения со световыми восприятиями. Такое явление в неврологии получило название …
- WiFi ESP8266 ESP-202 (ESP-12F)Views: 7642 Первое знакомство, сначала надо его купить… http://voron.ua/catalog/024404 Схема для подключения и тестирования По схеме ставим две кнопки, сброс и кнопку BT2, для перевода в режим обновления прошивки. Если надо сделать …