Как изменить созданный байт?
Я создал byte
для LCD 16x2. По сути, это пользовательский символ, который мне придется изменить позже.
byte char[8]{
B10000,
B01000,
B00100,
B00010,
B00001,
B11000,
B11100
};
Я хочу изменить третье число в четвертой строке. Итак, четвертая строка станет B00110
из B00010
. Это возможно? Есть ли альтернативы этому?
@Black Thunder, 👍1
2 ответа
Лучший ответ:
Ну, во-первых, вы пытаетесь назвать переменную 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;
}
Вы можете использовать следующую инициализацию массива:
В настройках я показываю, как установить бит. Для этого используется битовый оператор или (|). Чтобы немного сбросить, вы можете использовать &. Таким образом вы можете установить/сбросить несколько битов.
Также вы можете использовать 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
- Из-за чего LCD перестанет работать после 5-секундного подключения к Arduino?
- ЖК-дисплей 20x4 будет писать, но не будет обновляться
- Конфликт I2C с двумя ардуино
- Ошибка компиляции для Arduino Nano 33 BLE с библиотекой LiquidCrystal
- нужно сравнить, если байт меньше 80 шестнадцатеричных
- Передать массив байтов в Char и отправить на отдельный Arduino
- переменная 'LiquidCrystal_I2C lcd' имеет инициализатор, но неполный тип
- Вход Последовательного Монитора Arduino, шифрование 3DES
Почему в предпоследней строке вы установили
byteArray[3]
равным6
? Почему не3
, потому что мы хотим изменить третий элемент?, @Black ThunderB00110 = 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