Sicuramente millis() non è precisissimo ma non ha un errore così grande.
Analizzando grossolanamente il codice mi pare che si basi su un timer, che dovrebbe partire ogni 10 millisecondi (quindi 1 centesimo di secondo) e con questo incrementare un contatore di centesimi e, a cascata, secondi, minuti ed ore.
Questo in teoria sarebbe corretto, ma dipende strettamente dal fatto che quel timer debba poter scattare realmente 100 volte al secondo, ma se il codice "fa altro" rischia di andare ben oltre e quindi scattare molte meno volte del previsto.
Per dire le prime cose, bisogna evitare cicli do/while e delay() nel resto del codice è essenziale. E di "while" ne vedo vari in giro (fortunatamente non i "delay()"), anche se, come dicevo, non ho analizzato l'intero codice.
Qualche nota formalmente secondaria ma che potrebbe causare malfunzionamenti. Non capisco perché le variabili come "Display" e "lcdclear" tu le vada ad incrementare quando poi il confronto è sempre se siano a zero o meno. Trasformale in bool ed impostale a true o false quando serve, perché se sono delle "int" (inbtero con segno) e le incrementi continuamente, una volta che arrivano a 32767 e le incrementi diventa -32768 e prosegue da lì, e dopo 65535 cicli tornano a zero!
Per non parlare della variabile "x", il cui scopo non mi è affatto chiaro (ed anche questo viene incrementato senza limiti, e senza che venga mai reimpostato)...