У меня есть следующий код для записи данных на MAX7219 для освещения светодиодной матрицы 8x8:
for (i = 0; i < 8; i++) {
CLK = LOW;
DIN = temp & MSBIT >> i;
CLK = HIGH;
}
Дело в том, к сожалению, я просто знаю, что строка кода (DIN = temp & MSBIT >> i;) должна быть именно такой, иначе светодиоды не покажут ожидаемого, но я не понимаю, как это работает ...
Пожалуйста, мне действительно нужно объяснение, потому что я застрял ....
Примечание: переменная «temp» всегда является шестнадцатеричным числом, например 0x20, а «MSBIT» = 0x80.





Ваш пример неполный, поэтому дать подробный ответ невозможно. Пожалуйста, предоставьте полный минимальный рабочий пример и расскажите нам что-нибудь о платформе, над которой вы работаете. Например, переменная «temp» не была объявлена или определена в вашем фрагменте кода. Сначала вы должны кое-что узнать о точности операторов. Посмотрите здесь: https://en.cppreference.com/w/c/language/operator_precedence
Вы можете использовать этот онлайн-компилятор gcc для запуска и отладки небольших тестовых приложений, чтобы проверить поведение вашей строки кода. http://pythontutor.com/c.html
Итак, я предполагаю, что DIN - это регистр периферийного устройства. Вы присваиваете значение этому регистру. Это значение является результатом операции побитового «И» из-за того, что переменная temp и MSBIT («Может быть, константа») смещены на i бит вправо.
Чтобы сделать выражение более ясным, вы также можете написать: DIN = temp & (MSBIT >> i).
Более подробную информацию о том, как работает MAX7210, можно найти здесь. https://howtomechatronics.com/tutorials/arduino/8x8-led-matrix-max7219-tutorial-scrolling-text-android-control-via-bluetooth/
Дай угадаю:
CLK: вывод тактового сигнала вашего микроконтроллера DIN: вывод данных вашего микроконтроллера
Таким образом, вы сдвигаете значение в temp бит за битом на DIN с тактовым сигналом на CLK.
i = 0 -> DIN = bit 7 of temp
i = 1 -> DIn = bit 6 of temp
...
i = 7 -> DIN = bit 0 of temp