Using ideas from:
- http://www.instructables.com/id/Creating-a-charlieplexed-LED-grid-to-run-on-ATTiny/
- http://makezine.com/projects/charlieplexing-leds-with-an-avr-atmega328-or-arduino/
- http://pcbheaven.com/wikipages/Charlieplexing/
Modified the code to match my circuit:
#define A 7 #define B 6 #define C 5 #define D 4 #define PIN_CONFIG 0 #define PIN_STATE 1 #define LED_COUNT 12 int matrix[LED_COUNT][2][4] = { // PIN_CONFIG PIN_STATE // A B C D A B C D { { OUTPUT, OUTPUT, INPUT, INPUT }, { HIGH, LOW, LOW, LOW } }, // AB 0 { { OUTPUT, INPUT, OUTPUT, INPUT }, { HIGH, LOW, LOW, LOW } }, // BA 1 { { OUTPUT, INPUT, INPUT, OUTPUT }, { HIGH, LOW, LOW, LOW } }, // BC 2 { { INPUT, OUTPUT, OUTPUT, INPUT }, { LOW, HIGH, LOW, LOW } }, // CB 3 { { INPUT, OUTPUT, INPUT, OUTPUT }, { LOW, HIGH, LOW, LOW } }, // AC 4 { { OUTPUT, OUTPUT, INPUT, INPUT }, { LOW, HIGH, LOW, LOW } }, // CA 5 { { INPUT, INPUT, OUTPUT, OUTPUT }, { LOW, LOW, HIGH, LOW } }, // AD 6 { { OUTPUT, INPUT, OUTPUT, INPUT }, { LOW, LOW, HIGH, LOW } }, // DA 7 { { INPUT, OUTPUT, OUTPUT, INPUT }, { LOW, LOW, HIGH, LOW } }, // BD 8 { { OUTPUT, INPUT, INPUT, OUTPUT }, { LOW, LOW, LOW, HIGH } }, // DB 9 { { INPUT, OUTPUT, INPUT, OUTPUT }, { LOW, LOW, LOW, HIGH } }, // CD 10 { { INPUT, INPUT, OUTPUT, OUTPUT }, { LOW, LOW, LOW, HIGH } } // DC 11 }; void turnOn( int led ) { pinMode( A, matrix[led][PIN_CONFIG][0] ); pinMode( B, matrix[led][PIN_CONFIG][1] ); pinMode( C, matrix[led][PIN_CONFIG][2] ); pinMode( D, matrix[led][PIN_CONFIG][3] ); digitalWrite( A, matrix[led][PIN_STATE][0] ); digitalWrite( B, matrix[led][PIN_STATE][1] ); digitalWrite( C, matrix[led][PIN_STATE][2] ); digitalWrite( D, matrix[led][PIN_STATE][3] ); } void setup() {} void loop() { for( int l = 0; l < LED_COUNT; l++ ) { turnOn( l ); delay( 100 ); } }
And finally got this: