Использование массивов, двоичных данных и битового чтения
Это мой первый код, набранный вручную. Я уверен, что в нем могут быть некоторые вопиющие «ошибки школьника», поэтому задавался вопросом, могут ли люди дать ему «один раз». В частности, я никогда не использовал массивы C++, сохраняя двоичные данные внутри, а затем пытаясь прочитать их немного по крупицам. В perl намного проще; вы бы просто использовали многомерное что-то вроде этого:
@code1=('10101010', '01010101');
$bit=$code1[0][0] (..through to..) code1[0][7]
$bit=$code1[1][0] ... code1[1][7]
Итак, это мой код Arduino. Приветствуем предложения.
int pinArray[]={2,3,4,5,6,7,8,9};
int code1[]={B10101010, B01010101,B10101010, B01010101,B10101010, B01010101};
int count=0;
int split=0; // Счетчик для битового цикла
int led; // Сохраняем битовые данные
byte x; // Используется для хранения двоичных данных в code1
void setup(){
for (count=0; count<8; count++){
pinMode(pinArray[count],OUTPUT); // Устанавливает pinMode в качестве вывода на выводах pinArray
]
}
void loop(){
for (count=0; count<6; count++){
x=code1[count];
ledDisplay(x);
}
}
void ledDisplay(){
for (split=7; split>=0; split--){
led=bitRead(x,split);
if (led == 1){
digitalWrite(split+2,HIGH);
}
else{
digitalWrite(split+2,LOW);
}
}
}
Только что изменил разделение, так как понял, что бит 7 является самой левой цифрой. В разделении я добавляю 2 к значению. Нужно ли заключать это в квадратные скобки, т.е. (split+2)?
@Cristofayre, 👍1
Обсуждение1 ответ
Я могу заметить только две ошибки в вашей программе:
Блок кода должен быть заключен в фигурные скобки:
for (count=0; count<8; count++){ pinMode(pinArray[count],OUTPUT); } // ← '}' вместо ']'
Если функция ожидает передачи аргументов, они должны быть объявлены как параметры в прототипе функции:
void ledDisplay(byte x){ // ← обратите внимание на «byte x» // ... }
Кроме этого, вот несколько советов по улучшению внешнего вида кода, и надеюсь, более удобным в обслуживании:
- последовательный отступ
- используйте
const
для уточнения констант - используйте именованные константы вместо магических чисел
- по возможности сохраняйте переменные локальными
- обратите внимание, что int, равный 0 или 1, эквивалентен логическому типу
- используйте
pinArray[]
для доступа к контактам
Применяя эти предложения, я получаю следующее:
const int PIN_COUNT = 8;
const int pinArray[PIN_COUNT] = { 2, 3, 4, 5, 6, 7, 8, 9 };
const int CODE_COUNT = 6;
const int code1[CODE_COUNT] = {
B10101010, B01010101, B10101010, B01010101, B10101010, B01010101
};
void setup() {
for (int count = 0; count < PIN_COUNT; count++) {
pinMode(pinArray[count], OUTPUT);
}
}
void loop() {
for (int count = 0; count < CODE_COUNT; count++) {
ledDisplay(code1[count]);
}
}
void ledDisplay(byte x) {
for (int split = 7; split >= 0; split--) {
if (bitRead(x, split)) {
digitalWrite(pinArray[split], HIGH);
} else {
digitalWrite(pinArray[split], LOW);
}
}
}
На этот раз я искренне хотел бы иметь возможность проголосовать за ответ. Вы дали мне очень конструктивный совет, а не просто указку здесь и там. («]» была просто опечаткой, но спасибо, что указали на это) Мне также нравится логический комментарий, который сэкономит несколько дополнительных байтов. Теперь я буду исследовать "const", чтобы увидеть, что именно он делает... Опять же, я, честно говоря, очень благодарен за ваши подробные отзывы., @Cristofayre
- Изменение одного бита в байтовом массиве
- Как записать последовательность кнопок и сохранить ее в массиве
- Как вернуть значение массива символов в функции Arduino IDE?
- Почему я не могу изменить значения массива, даже если оператор успешно вызван? TFT-сенсорный экран
- Передача массивов, глобальных массивов внутри функций, указателей и объявление размеров массивов.
- Хранение значений широты и долготы в виде символов с заданной точностью
- Как преобразовать строку в шестнадцатеричный массив
- Матричный дисплей с Arduino UNO (ПРОБЛЕМА)
Ваши отступы сбивают с толку. Нажмите Ctrl+Т, @Jot
Когда я пишу свой код в текстовом редакторе, я использую клавишу табуляции для отступа кода, чтобы открывающие/закрывающие скобки «для» и т. д. находились в одном столбце (который, кажется, правильно отображается в моем настольном браузере — возможно, возможно, неправильно на телефон - поэтому в будущем при публикации буду использовать CRTL+t (я знаю, что CODE1 не следует тому же соглашению, но затем я стараюсь держать открытым/закрытым на той же строке, чтобы он не «натыкался» на следующий массив, имея в виду, что у меня будет 14 таких массивов) Это не должно быть «неприятным» для вас, поскольку я ценю, что вы нашли время, чтобы быть полезным, просто демонстрируя мое личное «соглашение об именах», @Cristofayre
Ctrl-T — это просто быстрый способ получить код с правильным отступом в любом стиле IDE по умолчанию. Вы не должны использовать его, хотя. Вы можете использовать любой [стиль отступа](https://en.wikipedia.org/wiki/Indentation_style), который вам нравится, если вы обрабатываете его вручную. Кроме того, вы можете [настроить IDE для своего любимого стиля](https://github.com/arduino/Arduino/wiki/Arduino-IDE-Auto-Format-configuration). Просто убедитесь, что вы выбрали один стиль отступа и применяете его последовательно., @Edgar Bonet