Ci siamo quasi.
Però quella suddivisione in blocchi ti fa l'effetto che descrivi quando fra giri e giripreced salti da un blocco all'altro in salita o discesa.
Meglio se fai un unico ciclo for a salire o a scendere in base al confronto giri - giripreced (si potrebbe anche farne uno solo che contempla salita o discesa ma meglio se evitiamo).
Ti suggerisco un approccio gradualmente complicato.
Crea una funzione che ti disegna il rettangolino i-esimo, una
void tracciarettangolo (byte n)
per adesso falli tutti dello stesso colore, poi lo sistemeremo dopo.
Fai un unico for da giriprec+1 a giri
for (int i = giriprec+1; i <= giri; i++)
{
tracciarettangolo(i);
}
fai per adesso (poi la elimineremo e la includeremo nell'altra) un'altra funzione
void cancellarettangolo(byte n)
che cancella il rettangolo disegnandolo nero e mettilo nell'altro for, quello che richiami quando i giri diminuiscono
for (int i = giriprec; i > giri; i--)
{
cancellarettangolo(i);
}
Se riesci a creare queste due funzioni che poi a parte il colore sono uguali hai praticamente fatto tutto.
Mettere il colore che cambia sarà immediato.