#define CLK 13
#define DIN 11
#define CS 10
#define X_SEGMENTS 4
#define Y_SEGMENTS 4
#define NUM_SEGMENTS (X_SEGMENTS * Y_SEGMENTS)
// Funktion för att skicka data till alla segment
void shiftAll(byte address, byte data) {
digitalWrite(CS, LOW);
for (int i = 0; i < NUM_SEGMENTS; i++) {
shiftOut(DIN, CLK, MSBFIRST, address);
shiftOut(DIN, CLK, MSBFIRST, data);
}
digitalWrite(CS, HIGH);
}
// Funktion för att skicka data till en specifik modul
void shiftToModule(int module, byte address, byte data) {
digitalWrite(CS, LOW);
for (int i = 0; i < NUM_SEGMENTS; i++) {
if (i == module) {
shiftOut(DIN, CLK, MSBFIRST, address);
shiftOut(DIN, CLK, MSBFIRST, data);
} else {
shiftOut(DIN, CLK, MSBFIRST, 0); // Skicka tom data till övriga moduler
shiftOut(DIN, CLK, MSBFIRST, 0);
}
}
digitalWrite(CS, HIGH);
}
void setup() {
Serial.begin(115200);
pinMode(CLK, OUTPUT);
pinMode(DIN, OUTPUT);
pinMode(CS, OUTPUT);
// Initiera MAX7219
shiftAll(0x0f, 0x00); // Stäng av testläge
shiftAll(0x0b, 0x07); // Aktivera alla 8 rader
shiftAll(0x0c, 0x01); // Normal drift
shiftAll(0x0a, 0x08); // Ljusstyrka
shiftAll(0x09, 0x00); // Direktmatrisläge
drawFrame(); // Rita ramen vid start
}
void loop() {
// Inget kontinuerligt att göra i denna kod
}
// Funktion för att rita ramen
void drawFrame() {
for (int module = 0; module < NUM_SEGMENTS; module++) {
for (int row = 1; row <= 8; row++) {
byte data = 0b00000000;
// Första och sista raden ska lysa helt
if (row == 1 || row == 8) {
data = 0b11111111;
}
// För övriga rader, tänd endast första och sista kolumnen
else {
data = 0b10000001;
}
shiftToModule(module, row, data);
}
}
}