void BaseDMD::scanDisplay() { if(pin_other_cs >= 0 && digitalRead(pin_other_cs) != HIGH) return; // Rows are send out in 4 blocks of 4 (interleaved), across all panels int rowsize = unified_width() / 8; // in bytes volatile uint8_t *bmp = bitmap; volatile uint8_t *rows[4] = { // Scanning out 4 interleaved rows bmp + (scan_row + 0) * rowsize, bmp + (scan_row + 4) * rowsize, bmp + (scan_row + 8) * rowsize, bmp + (scan_row + 12) * rowsize, }; writeSPIData(rows, rowsize); digitalWrite(pin_noe, LOW); digitalWrite(pin_sck, HIGH); // Latch DMD shift register output digitalWrite(pin_sck, LOW); // (Deliberately left as digitalWrite to ensure decent latching time) // A, B determine which set of interleaved rows we are multiplexing on // 0 = 1,5,9,13 // 1 = 2,6,10,14 // 2 = 3,7,11,15 // 3 = 4,8,12,16 digitalWrite(pin_a, scan_row & 0x01); digitalWrite(pin_b, scan_row & 0x02); scan_row = (scan_row + 1) % 4; if(brightness == 255) digitalWrite(pin_noe, HIGH); else analogWrite(pin_noe, brightness); }
void BaseDMD::scanDisplay() { if(pin_other_cs >= 0 && digitalRead(pin_other_cs) != HIGH) return; // Rows are send out in 4 blocks of 4 (interleaved), across all panels int rowsize = unified_width_bytes(); volatile uint8_t *rows[4] = { // Scanning out 4 interleaved rows bitmap + (scan_row + 0) * rowsize, bitmap + (scan_row + 4) * rowsize, bitmap + (scan_row + 8) * rowsize, bitmap + (scan_row + 12) * rowsize, }; writeSPIData(rows, rowsize); digitalWrite(pin_noe, LOW); digitalWrite(pin_sck, HIGH); // Latch DMD shift register output digitalWrite(pin_sck, LOW); // (Deliberately left as digitalWrite to ensure decent latching time) // Digital outputs A, B are a 2-bit selector output, set from the scan_row variable (loops over 0-3), // that determines which set of interleaved rows we are outputting during this pass. // BA 0 (00) = 1,5,9,13 // BA 1 (01) = 2,6,10,14 // BA 2 (10) = 3,7,11,15 // BA 3 (11) = 4,8,12,16 digitalWrite(pin_a, scan_row & 0x01); digitalWrite(pin_b, scan_row & 0x02); scan_row = (scan_row + 1) % 4; // Output enable pin is either fixed on, or PWMed for a variable brightness display if(brightness == 255) digitalWrite(pin_noe, HIGH); else analogWrite(pin_noe, brightness); }