Warren,
I've adjusted it to use micros() instead millis() (ignore the names) and have it printing the time on screen once a second.
I downloaded a clock that CNET had a link to, to have something to watch that the PC updated once a second.
The screen update seems to update with no discernible change in rate, while the PC clock seems to catch up every once on a while - yet the two times are still in agreement after 37 minutes. Has not gained or lost any time.
I am wondering what I have that has more accurate time - maybe my Garmin Nuvi GPS? Have to see if the battery is charged and compare to that.
Have you decided if you have crystal, such as pictured here next to the USB connector,

or a resonator, which may look like the 3-lead blue part here

or this yellow part

unsigned long currentmillis = 0;
unsigned long previousmillis = 0;
unsigned long interval = 10000;
unsigned long elapsedmillis = 0;
byte latchpin = 2; // connect to pin 12 on the 74HC595
byte clockpin = 3; // connect to pin 11 on the 74HC595
byte datapin = 4; // connect to pin 14 on the 74HC595
byte testpin5 = 5;
byte ones_seconds = 0;
byte tens_seconds = 0;
byte ones_minutes = 0;
byte tens_minutes = 0;
byte tenths = 0;
byte hundredths= 0;
int segdisp[10] = {
63,6,91,79,102,109,125,7,127,111 }; //segment references using 74HC595 Shift Registers
//The above numbers light up different segments of a digit
byte time_update = 0;// added new flag
void setup()
{
pinMode(latchpin, OUTPUT);
pinMode(clockpin, OUTPUT);
pinMode(datapin, OUTPUT);
pinMode(testpin5, OUTPUT);
Serial.begin(57600);
}
void loop()
{
currentmillis = micros(); // read the time.
elapsedmillis = currentmillis - previousmillis;
if (elapsedmillis >= interval) // 10 milliseconds have gone by
{
previousmillis = previousmillis + elapsedmillis; // save the time for the next comparison
time_update = 1;
// if (elapsedmillis>10000){
// Serial.println (ones_seconds,DEC);
// Serial.println (elapsedmillis,DEC); I notice this prints out 10004 a lot, with an occasional 10008
//}
}
if (time_update == 1){ // no updating if not at 10ms interval, skip this whole section
// increment the counters, roll as needed, shift the digits out
time_update = 0; // reset for next pass thru
hundredths = hundredths +1;
if (hundredths == 10){
hundredths = 0;
tenths = tenths +1;
}
if (tenths == 10){
tenths = 0;
ones_seconds = ones_seconds +1;
Serial.print ( tens_minutes,DEC);
Serial.print (ones_minutes,DEC);
Serial.print (tens_seconds,DEC);
Serial.println(ones_seconds,DEC);
}
if (ones_seconds == 10){
ones_seconds = 0;
tens_seconds = tens_seconds +1;
}
if (tens_seconds == 6){
tens_seconds = 0;
ones_minutes = ones_minutes +1;
}
if (ones_minutes == 10){
ones_minutes = 0;
tens_minutes = tens_minutes +1;
}
if (tens_minutes == 6){
tens_minutes = 0;
}
// counters are all updated now, just do the shiftout one time here:
digitalWrite(latchpin, LOW); // send the digits down to the shift registers!
shiftOut(datapin, clockpin, MSBFIRST, segdisp[hundredths]); // print the % first "hundredths" digit
shiftOut(datapin, clockpin, MSBFIRST, segdisp[tenths]); // print the tens of hundredths digit
shiftOut(datapin, clockpin, MSBFIRST, segdisp[ones_seconds]); // print the % first "seconds" digit
shiftOut(datapin, clockpin, MSBFIRST, segdisp[tens_seconds]); // print the tens of seconds digit
shiftOut(datapin, clockpin, MSBFIRST, segdisp[ones_minutes]); // print the % first "minute" digit
shiftOut(datapin, clockpin, MSBFIRST, segdisp[tens_minutes]); // print the tens of minutes digit
digitalWrite(latchpin, HIGH);
} // end if time to be updated
} // end void loop