Как установить биты в байтовой переменной (Arduino)

Мой вопрос будет специфичным для *******, хотя, если вы знаете, как это сделать в C, он тоже будет похож на IDE *******.

Итак, у меня есть 5 целых переменных:

r1, r2, r3, r4, r5

Их значение равно 0 (выкл.) или 1 (вкл.). Я хотел бы сохранить их в байтовой переменной, пусть вызовет ее реле, а не путем добавления их, но установив определенные биты в 1/0 независимо от того, являются ли они 0 или 1. Например:

1, 1, 0, 0, 1

Я хотел бы иметь то же самое значение в моей переменной байтового байта, а не r1 + r2 + r3 + r4 + r5, который в этом случае будет десятичным 3, двоичным 11.

Спасибо!

2 ответа

Я рекомендую использовать UNION структуры битов. Это добавляет ясности и делает его легко переносимым. Вы можете указать один или любой размер соседних битов. Наряду с быстрой перестановкой их.

union {
 ******* BAR;
 struct {
 ******* r1 : 1; // bit position 0
 ******* r2 : 2; // bit positions 1..2
 ******* r3 : 3; // bit positions 3..5
 ******* r4 : 2; // bit positions 6..7 
 // total # of bits just needs to add up to the ******* size
 } bar;
} foo;
void setup() {
 Serial.begin(9600);
 foo.bar.r1 = 1;
 foo.bar.r2 = 2;
 foo.bar.r3 = 2;
 foo.bar.r4 = 1;
 Serial.print(F("foo.bar.r1 = 0x"));
 Serial.println(foo.bar.r1, HEX);
 Serial.print(F("foo.bar.r2 = 0x"));
 Serial.println(foo.bar.r2, HEX);
 Serial.print(F("foo.bar.r3 = 0x"));
 Serial.println(foo.bar.r3, HEX);
 Serial.print(F("foo.bar.r4 = 0x"));
 Serial.println(foo.bar.r5, HEX);
 Serial.print(F("foo.BAR = 0x"));
 Serial.println(foo.BAR, HEX);
}

Если вы можете развернуть этот UNION размером больше байтов

Примечание. ******* совпадает с байтом.

Вы даже можете разделить объединение на массив байтов, а затем отправить байты через последовательный порт или вывести их отдельно как одно длинное слово и т.д. см. более подробный пример.


Как насчет:

char byte = (r1 << 4) | (r2 << 3) | (r3 << 2) | (r4 << 1) | r5;

Или наоборот:

char byte = r1 | (r2 << 1) | (r3 << 2) | (r4 << 3) | (r5 << 4);

licensed under cc by-sa 3.0 with attribution.