Как изменить созданный байт?

Я создал byte для LCD 16x2. По сути, это пользовательский персонаж, который мне придется изменить позже.

byte char[8]{
 B10000,
 B01000,
 B00100,
 B00010,
 B00001,
 B11000,
 B11100
};

Я хочу изменить третье число в четвертой строке. Итак, четвертая строка станет B00110 из B00010. Это возможно? Есть ли альтернативы этому?

, 👍1


2 ответа


3

Ну, во-первых, вы пытаетесь назвать переменную char? который уже является ключевым словом для типа переменной char. Но вы можете получить к нему доступ по индексу массива. Также не уверен, что вы намеревались сделать массив длиной 8 байт, а затем использовать только 7, но это то, что вы сделали в своем примере

//определим все сразу
// byte byteArray[8] = {B10000,B01000,B00100,B00010,B00001,B11000,B11100};
//или по индексу
byte byteArray[8];
byteArray[0]=B10000;
byteArray[1]=B01000;
byteArray[2]=B00100;
byteArray[3]=B00010;
byteArray[4]=B00001;
byteArray[5]=B11000;
byteArray[6]=B11100;


//если вам нужно изменить один в коде в другом месте
byteArray[3]=B00110;
//или
byteArray[3]=6;
}
,

Почему в предпоследней строке вы установили byteArray[3] равным 6? Почему не 3, потому что мы хотим изменить третий элемент?, @Black Thunder

B00110 = B110 = 1 (первая 1) * 2^2 + 1 (вторая 1) * 2^1 + 0 (последняя 0) * 2^0 = 1 * 4 + 1 * 2 + 0 * 1 = 6, @Michel Keijzers

@MichelKeijzers Ну, я не понял. Какова цель этого? Есть ли более простой способ? Я просто не хочу вовлекать другие элементы., @Black Thunder

Например, в обычном (10 или десятичной системе) числе 76 = 7 * 10^1 + 6 * 10^0 = 7 * 10 + 6 * 1 = 70 + 6 = 76. В двоичном (2 системе) числе 110 = 1 * 2^2 + 1 * 2^1 + 0 * 2^0 = 1 * 4 + 1 * 2 + 1 * 0 = 4 + 2 + 0 = 6., @Michel Keijzers

Просто показывал, что его можно установить с использованием десятичного, а не двоичного числа x = B00110 (двоичный), x = 6 (декабрь), x = 0x06 (шестнадцатеричный). Все они равны. Это на самом деле не относится к вашему вопросу, поэтому я должен был просто оставить это, чтобы не сбивать с толку., @Chad G


2

Вы можете использовать следующую инициализацию массива:

В настройках я показываю, как установить бит. Для этого используется битовый оператор или (|). Чтобы немного сбросить, вы можете использовать &. Таким образом вы можете установить/сбросить несколько битов.

Также вы можете использовать 1 << 2, что означает, что 1 (самый правый бит) сдвинут влево на две позиции (таким образом, B100).

Кстати, общепринятой практикой является инициализация всех значений.

byte lcd[8] = 
{
  B10000,
  B01000,
  B00100,
  B00010,
  B00001,
  B11000,
  B11100,
  B00000  // Также инициализируем последний элемент
};

void setup() 
{
   lcd[3] |= B100; // Устанавливаем 4-ю строку (элемент 3), 3-й бит (справа)
   lcd[3] |= 1 << 2; // Альтернатива
}

void loop() 
{
}

Пояснение к арифметике или: ИЛИ означает: если хотя бы один бит равен 1, результат равен 1, иначе 0.

Таблица истинности:

A | B | A or B
--+---+-------
0 | 0 |   0
0 | 1 |   1
1 | 0 |   1
1 | 1 |   1

Для вашего примера это означает:

Original value of lcd[3]: B00010
Or mask (in setup):       B00100
                          ------ OR
Result                    B00110
,

Почему мы это сделали? lcd[3] |= B100; Куда делись остальные элементы?, @Black Thunder

lcd[3] изменит только 3-й элемент, остальные элементы останутся равными. С помощью или (|) вы можете установить бит, все 0-значения в маске или останутся неизменными., @Michel Keijzers

Могу ли я сделать прямо как lcd[3][3] = B1;, где первые 3 — это 4-я строка, а вторая — 3-й элемент?, @Black Thunder

Нет, вы не можете использовать lcd[3][3], потому что lcd[3] — это один элемент (байт), а не массив., @Michel Keijzers