const int dataPin = 2; const int clockPin = 4; const int latchPin = 3; unsigned char Digits[] = {// 0 1 2 3 4 5 6 7 8 9 A b C d E F - 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf }; unsigned char DigitCells[4]; unsigned long previousMillis = 0; const long interval = 1000; void setup() { // put your setup code here, to run once: pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } int max_minutes = 10; int current_num = 0; void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; int seconds = current_num % 60; int minutes = current_num / 60; if (minutes > max_minutes) { current_num = 0; seconds = current_num % 60; } DigitCells[0] = seconds % 10; DigitCells[1] = seconds / 10 % 10; DigitCells[2] = minutes % 10; DigitCells[3] = minutes / 10 % 10; current_num++; } Display_Digits(); } //http://edi.wang/post/2016/4/29/windows-10-iot-74hc595-led-digital-tube void Display_Digits() { unsigned char *led_table; unsigned char i; led_table = Digits + DigitCells[0]; i = *led_table; Digit_Write(i); Digit_Write(0x01); digitalWrite(latchPin,LOW); digitalWrite(latchPin,HIGH); led_table = Digits + DigitCells[1]; i = *led_table; Digit_Write(i); Digit_Write(0x02); digitalWrite(latchPin,LOW); digitalWrite(latchPin,HIGH); led_table = Digits + DigitCells[2]; i = *led_table; Digit_Write(i); Digit_Write(0x04); digitalWrite(latchPin,LOW); digitalWrite(latchPin,HIGH); led_table = Digits + DigitCells[3]; i = *led_table; Digit_Write(i); Digit_Write(0x08); digitalWrite(latchPin,LOW); digitalWrite(latchPin,HIGH); } void Digit_Write(unsigned char X) { unsigned char i; for(i=8;i>=1;i--) { if (X&0x80) { digitalWrite(dataPin,HIGH); } else { digitalWrite(dataPin,LOW); } X<<=1; digitalWrite(clockPin,LOW); digitalWrite(clockPin,HIGH); } }