En este caso particular de tu programa, revisandolo, veo que es un reloj, que te indica hora, minutos y segundos.
La funcion delay() es un retardo, en tu caso tenemos dos anidadas, la de mas adentro es una de: delay_us(1000); que significa que hace un retardo
de 1000 microsegundos o un milisegundo y la funcion delay_ms(998); que significa que hara un retardo de 998 milisegundos, osea le faltan 2 milisegundos
para que sea 1 segundo.
Como veras, todo reloj necesita un oscilador, en el caso de este programa y de tu hardware su oscilador es el cristal externo o si es configurado
con un cristal interno del micro, que corre a una frecuencia mayor, que podria ser ejm: 16MHz
Gracias a esta funcion delay_ms() se convierte esa frecuencia alta del cristal a una mas baja conocida y util para nuestro proyecto,
en el caso de nuestro reloj 1Hz o periodo de 1 segundo.
Al analizar el programa veras que hay un bucle infinito for(;
{ ...} en el cual dentro esta la funcion delay_ms(998) y la parte que actualiza el display
con el nuevo valor de segundo, minuto y hora.
Osea cada segundo o cada 1 Hz se actualizan los segundos (aumenta en uno), y en caso que llegue a 59, pasa a cero y aumenta automaticamente
a un minuto++ y si este llega a 59 min pasa a cero y tambien aumenta a hora++.
¿Porque no pone delay_ms(1000) para que sea exactamente un retardo de 1 segundo?
El programador considera que las instrucciones antes del delay_ms(998) y que estan dentro del for(;
{ ...} toman un tiempo de ejecucion calculado de
2 milisegundos.
¿Que ocurriria si no hay el delay_ms(998)?
El reloj se actualizaria o aumentaria en uno cada "segundo" muy rapido; cada ( 30/Frecuencia del Cristal ) y se veria en el display que aumentan
muy rapido los segundos, minutos y horas. Para el ejemplo de cristal de 16MHz seria : ( 30/16000000 ) segundos......... Esto seria muy rapido
Cordiales Saludos