const uint8_t sipo_strobe_pin = 6; const uint8_t sipo_data_pin = 7; const uint8_t sipo_clock_pin = 8; void setup() { Serial.begin(9600); pinMode(sipo_strobe_pin, OUTPUT); pinMode(sipo_data_pin, OUTPUT); pinMode(sipo_clock_pin, OUTPUT); } void loop() { for (int i = 0; i < 9999; ++i) { showNumber(i); delay(1000); } } void showNumber(int value) { if (value > 9999) { Serial.println("warning: truncating value"); value = 9999; } for (int i = 3; i >= 0; --i) { uint8_t digit = value % 10; value /= 10; const uint8_t ALL_LATCHED = 0xF0; shiftToSipo(ALL_LATCHED - (16 << i) + digit); shiftToSipo(ALL_LATCHED + digit); } } void shiftToSipo(uint8_t bits) { digitalWrite(sipo_strobe_pin, LOW); shiftOut(sipo_data_pin, sipo_clock_pin, MSBFIRST, bits); digitalWrite(sipo_strobe_pin, HIGH); }