// Digit selectors on 2 - 5 inclusive. // Segment selectors on 6 - 12 inclusive. // This is for a common cathode display, so we make a digit selector low // and a segment selector high to display things. const int digit_base = 2; const int segment_base = 6; void setup() { for (int i = 2; i <= 12; ++i) { pinMode(i, OUTPUT); } for (int i = 2; i <= 5; ++i) { digitalWrite(i, HIGH); } for (int j = 6; j <= 12; ++j) { digitalWrite(j, LOW); } } // Segments patterns for the digits. // Bit 0 - segment A, etc. // Bit patterns are segments .GFEDBCA int segments[] = { B00111111, // 0: ABCDEF B00000110, // 1: BC B01011011, // 2: ABDEG B01001111, // 3: ABCDG B01100110, // 4: BCFG B01101101, // 5: ACDFG B01111101, // 6: ACDEFG B00000111, // 7: ABC B01111111, // 8: ABCDEFG B01101111 // 9: ABCDFG }; // Select digit, 0 = leftmost. void selectDigit(int position) { for (int i = 0; i < 4; ++i) { digitalWrite(i + digit_base, (i == position) ? LOW : HIGH); } } void displayDigit(int value) { int pattern = segments[value]; for (int i = 0; i < 8; ++i) { boolean on = pattern & 1; pattern = pattern >> 1; digitalWrite(i + segment_base, on ? HIGH : LOW); } } void displayNumber(int value) { for (int i = 3; i >= 0; --i) { selectDigit(i); displayDigit(value % 10); delay(5); value = value / 10; } } void loop() { int number = random(10000); for (int i = 0; i < 100; ++i) { displayNumber(number); } }