 uint8_t row_i = 0;
 volatile uint8_t may_flip = 0;
 int pwm_lengths[] = { 0x30, 0x10, 0x06 }; // PWM cycle lengths
-int pwm_i = 0; // Current PWM cycle
+volatile int pwm_i = 0; // Current PWM cycle
 
 // Hardware configuration
-uint8_t pin_col[] = {5, A0, 4, A1, 3, A2, 2, A3};
-#define PIN_ROW_LATCH 6
+#define PIN_COL_BIT0 A2
+#define PIN_COL_BIT1 A1
+#define PIN_COL_BIT2 A0
+#define PIN_ROW_LATCH 7
 #define PIN_COL_LATCH 8
 
 // Serial access


	// Timer magic
	cli();
	TCCR1A = 0; // Do not toggle pins
	TCCR1B = (1 << CS11 | 1 << CS10); // Clock divider 64, 64/16e6 = 40µs cycle
	TCCR1C = 0; // not forcing output compare
	TCNT1 = 0; // set timer counter initial value (16 bit value)
	TIMSK1 = 1 << OCIE1A; // enable timer compare match 1A interrupt
	OCR1A = 1; // Go to the interrupt vector ASAP
	sei();
}

void loop() {

			digitalWrite(PIN_ROW_LATCH, LOW);
			digitalWrite(PIN_ROW_LATCH, HIGH);
		}
		// Pick correct column
		digitalWrite(PIN_COL_BIT2, col_i & 0b100);
		digitalWrite(PIN_COL_BIT1, col_i & 0b010);
		digitalWrite(PIN_COL_BIT0, col_i & 0b001);
      	}

	// Main screen turn on! (force OC1A on)
	TCCR1A = (1 << COM1A1) | (1 << COM1A0);
	TCCR1C = (1 << FOC1A);
  
	// Say we want to turn off when we hit the target even if interrupt doesn't run
	TCCR1A = (1 << COM1A1);

	// Restart timer counter
	TCNT1 = 0;
	
	// Set run length
	OCR1A = pwm_lengths[pwm_i];
	
	/* After turning on the screen, we have "plenty" of CPU cycles
	 * to spend. Preparing a new segment to display.
