Die einfachste Lösung wäre es die Teile als Zustandsautomat abzubilden. Für die Haltedauer würde man dann einfach beim "Programm 1 Automat" die Zustandsübergänge unterbinden.
Alternativ könntest Du auch die durchlaufenden Sachen per Interrupt treiben und "Programm 1" im Loop lassen. Den Loop könnte man mit einer unterbrechbaren Interruptroutine stoppen und wieder starten. Diese Lösung ist allerdings nicht ohne Nebenwirkungen. In der Regel schiessen sich Anfänger mit sowas ins Knie.
Die dritte Lösung wäre um jede Zeile von Programm 1 ein If zu packen. also so:
int16_t line = 1;
void loop() {
if (line == 1) {
// Zeile 1
line = 2;
}
if (line == 2) {
// Zeile 2
line = 3;
}
...
if (line == 4711) {
// letzte Zeile
line = 1;
}
}
Wenn der Code aussetzen soll würde ich dann einfach
line = -line;
setzen und zum starten ebenfalls
line = -line;
Genaugenommen ist das ein Zustandsautomat wie ich ihn oben beschrieben habe.