const uint8_t row_pins[4] = {4, 5, 6, 7}; const uint8_t col_pins[6] = {8, 9, 10, 11, 12, 11}; volatile uint8_t row_cnt = 0; uint8_t col_cnt = 0; uint8_t row_cnt2 = 23; #define rowClkPin A0 volatile bool matrixImage[4][6] = { 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 }; ISR(TIMER0_COMPA_vect) { //This is the interrupt request if (col_cnt < 6) { col_cnt++; } else { col_cnt = 0; } switch (row_cnt) { case 0: PORTD = B00010000; row_cnt = 1; break; case 1: PORTD = B00100000; row_cnt = 2; break; case 2: PORTD = B01000000; row_cnt = 3; break; case 3: PORTD = B10000000; row_cnt = 0; break; } } void setup() { Serial.begin(115200); pinMode(rowClkPin,OUTPUT); for (uint8_t i = 0; i < 4; i++) { pinMode(row_pins[i], OUTPUT); digitalWrite(row_pins[i], LOW); } Serial.println(""); for (uint8_t i = 0; i < 6; i++) { pinMode(col_pins[i], OUTPUT); digitalWrite(col_pins[i], LOW); } Serial.println("pins set"); TCCR0A = (1 << WGM01); //Set the CTC mode OCR0A = 0xF9; //Value for ORC0A for 1ms TIMSK0 |= (1 << OCIE0A); //Set the interrupt request sei(); //Enable interrupt TCCR0B |= (1 << CS02); TCCR0B |= (0 << CS01); //Set the prescale 1/265 clock TCCR0B |= (0 << CS00); } void loop() { digitalWrite(rowClkPin,!digitalRead(rowClkPin)); }