You could go this route - I am only setup to count from from 10:00, but you could change that easy enough. This code runs on a 5V 16 MHz promini.
I have this at the start of my loop. After this, I look for timer control buttons (start/stop), score updates, and then have a section that writes the time & score digits out to a MAX7221 8 x 7-segment display driver if they changed.
I use time_running = 0 to show timer is stopped, and =1 & =2 to show time is running (1 allows time to stop if some actions occur, and 2 to not stop if the same actions occur).
I have colon on/off twice a second, that's what the quarter interval is for.
Define all the variables prior to setup, add some stuff to set the start time you want - I have a section after this code that monitors a wireless remote control I built to start & stop time and set it to 1:00, 3:00, 10:00 (and quarter_interval to 0 - important) if time is stopped. You could do same by reading some discrete buttons or similar. If no button presses are seen and update_time=1, then the max7221 is updated with the new values.
Just update the 10:00 area to count down from 60:00 instead.
void loop()
{
// check if time needs updating
if ((time_running == 1) || (time_running == 2)) // fencing time is counting down or delay time is counting down
{
unsigned long currentMillis = millis(); // see how long its been
if (currentMillis - previousMillis > interval) // more than our quarter second interval?
{
// save the last time we okayed time updates
previousMillis = currentMillis;
quarter_interval = quarter_interval+1;
// cycle the colon state
if (colon == 0x80)
{
colon = 0x00;
}
else
{
colon = 0x80;
}
update_time = 1; // enable time display to be updated
if (quarter_interval == 4) // we hit the one second update time
{
quarter_interval = 0;
// update the time digits
// cases:
// 0:01, final second - stop time, disable touch lights, sound buzzer
// Tens of seconds rollover: time = x:50, x:40, x:30, x:20, x:10: decrement tens of seconds, rollover seconds to 9
// Minutes rollover: time = 9:00, 8:00, etc. 2:00, 1:00: decrement ones of minutes, rollover tens of seconds to 5, ones of seconds to
9
// 10:00: Roll all the digits over
// otherwise: just roll over the seconds
// Case: Final Second
if ((minutes_ones == 0) && (seconds_tens == 0) && (seconds_ones == 1)) // don't need minutes_tens, can't have 10:01
{
time_running = 0; // stop time running
seconds_ones = 0; // clear the last second
updated = 1; // fake a Case complete flag
buzzer = 1; // add a buzzer for this: end of time buzzer sounds
}
} // end of if final second
// Case: x:50, x:40, x:30, x:20, x:10
if ((seconds_tens >0) && (seconds_ones == 0)) // case for the last tens of seconds
{
seconds_tens = seconds_tens - 1; // decrement the tens
seconds_ones = 9; // rollover the ones
updated = 1;
} // end of if 10 of seconds rollover
// Case: 9:00, 8:00, etc 2:00, 1:00
if ((minutes_ones > 0) && (seconds_tens == 0) && (seconds_ones == 0)) // case for the last ones of minutes
{
minutes_tens = 0x00; //
minutes_ones = minutes_ones - 1; // decrement the minutes
seconds_tens = 5; // rollover the tens of seconds;
seconds_ones = 9; // rollover the ones of seconds;
updated = 1;
} // end of if minutes rollover
// Case: starting from 10:00
if (minutes_tens == 0x01) // roll over all digits
{
minutes_tens = 0x00; // rollover the tens of minutes
minutes_ones = 9; // rollover the ones of mints;
seconds_tens = 5; // rollover the tens of seconds;
seconds_ones = 9; // rollover the ones of seconds;
updated = 1;
} // end of if 10:00 rollover
// General Case: just decrement the seconds
if (updated == 0) // nothing else updated - but don't decrement if = 0.
{
seconds_ones = seconds_ones - 1;
}
updated = 0; // reset for next pass thru
} // end of if quarter_interval
} // end of reaching our interval
} // end of if time_running
else
{
update_time = 0; // no time update this time around - probably don't need this
}
// next sections: look for control button presses to start/stop time, reset the time digits if time is stopped, update the score digits if time is stopped, set off the buzzer for a few seconds ...