Добрый день. Подключил такую матрицу согласно схеме: Написал под неё несколько строчек кода и возникло несколько вопросов: 1) Можно ли сделать ШИМ управление яркостью конкретного светодиода? 2) Что лучше использовать сдвиговые регистры 74HC595 или драйвер MAX7219? 3) Как написать код, так чтобы крайние светодиоды одного цвета были постоянно включены (рамка), а те что внутри - меняли свой цвет и положение? Функция millis() для этого подойдет? П.С. Пример моего очень плохого кода. Его буду переписывать с циклами. битовыми операциями и т.д. Код (Text): #include <SPI.h> enum { REG = 8 }; void setup() { pinMode(REG, OUTPUT); SPI.begin(); } void loop() { //field digitalWrite(8,LOW); SPI.transfer(B01111110); // Red SPI.transfer(B01111110); // Blue SPI.transfer(B10000001); // Column SPI.transfer(B01111110); // Green digitalWrite(8, HIGH); delay(200); digitalWrite(8,LOW); SPI.transfer(B11111111); // Red SPI.transfer(B10111101); // Blue SPI.transfer(B01000010); // Column SPI.transfer(B10111101); // Green digitalWrite(8, HIGH); delay(200); digitalWrite(8,LOW); SPI.transfer(B11011011); // Red SPI.transfer(B11011011); // Blue SPI.transfer(B00100100); // Column SPI.transfer(B11111111); // Green digitalWrite(8, HIGH); delay(200); digitalWrite(8,LOW); SPI.transfer(B11111111); // Red SPI.transfer(B11100111); // Blue SPI.transfer(B00011000); // Column SPI.transfer(B11111111); // Green digitalWrite(8, HIGH); delay(200); }
ШИМ через сдвиговые регистры нельзя. Могу подкинуть свой код, правда не знаю тот же алгоритм у вас или нет, я схему сам придумывал. У меня есть массив 8х8 который некая процедура выводит на матрицу. 0 - выкл, 1 - зеленый, 2 - красный, 3 - оранжевый. Менять можно что угодно где угодно, у меня например три разноцветных шарика бегает по матрице с разной скоростью отскакивая от стенок и друг от друга.
Частично вот, чтобы не мешало. Поле вот такое: Код (Text): #define DATA_PIN 13 #define LATCH_PIN 12 #define CLOCK_PIN 11 #define DDD // отладка и печать в ком порт byte masRG [8][8] = { // поле 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; Сами кадры вот так выводятся: Код (Text): void setKadr_RG () { // отрисовка кадра byte bytSTR; byte mR; byte mG; for (byte s = 0; s <= 7; s++) { bytSTR = 0; bitSet(bytSTR, s); for (byte i = 0; i <= 7; i++) { bitWrite(mR, i, !(bitRead(masRG[s][i], 0))); bitWrite(mG, i, !(bitRead(masRG[s][i], 1))); } MC_WRITE_PIN(LATCH_PIN, LOW); writeByte(bytSTR); writeByte(mR); writeByte(mG); MC_WRITE_PIN(LATCH_PIN, HIGH); } } void writeByte(byte byteW) { // аналог shiftOut, работает чуть быстрее for (int i = 7; i >= 0; i--) { MC_WRITE_PIN(DATA_PIN, (bitRead(byteW, i))); MC_WRITE_PIN(CLOCK_PIN, HIGH); MC_WRITE_PIN(CLOCK_PIN, LOW); } } MC_WRITE_PIN(LATCH_PIN, HIGH); это тоже самое что digitalWrite(LATCH_PIN, HIGH);