Ich habe da folgende Vorgehensweise:

Code:
typedef unsigned int TTimeValue;   // ich nehme 16 Bit Werte für die Millisekunden Zeiten */

typedef volatile struct         // in dieser Struktur werden alle Zeitwerte verwaltet
{
  TTimeValue Led1BlinkTime;
  TTimeValue Led2BlinkTime;
  TTimeValue KeyTime;
 
  /* hier kann man beliebig erweitern */
} TimerStruct;

volatile TimerStruct Timers;   // das ist die gesamte Timerstruktur (die Instanz)

//----------------------------------------------------------------
// der 1 Millisekunden Timer Interrupt:
// hier wird jeder Zeitwert, solange er noch nicht 0 ist, um eins erniedrigt

void TIMER0_IRQHandler (void)
{ int i;
  TTimeValue *p = (TTimeValue*) &Timers;     /* initialize p to startaddress of the structure */

  for (i=0; i< (sizeof(Timers) / sizeof(TTimeValue)); i++)
  {
    if (*p)     /* if current addressed counter value is greater zero then */
      --*p;     /* decrement the counter value by one */
    p++;        /* p points now to the next counter value */
  }
}
//----------------------------------------------------------------
// Jetzt kommen diverse Funktionen die ausgeführt werden sollen:

void DoLed1(void)
{ static char BlinkPhase;

  if (Timers.Led1BlinkTime) return; // es gibt noch nichts zu tun, Zähler noch nicht 0
  if (BlinkPhase)
  {
//     Led1On();
   Timers.Led1BlinkTime = 250;  // 250 ms ein
  } else 
  {
//    Led1Off();
    Timers.Led1BlinkTime = 100;  // 100 ms aus
  }
  BlinkPhase = ! BlinkPhase;  // BlinkPhase umdrehen
}


void DoLed2(void)
{ static char BlinkPhase;

  if (Timers.Led2BlinkTime) return; // es gibt noch nichts zu tun, Zähler noch nicht 0
  if (BlinkPhase)
  {
// Led2On();
   Timers.Led1BlinkTime = 500;  // 500 ms ein
  } else 
  {
//  Led2Off();
    Timers.Led1BlinkTime = 250;  // 250 ms aus
  }
  BlinkPhase = ! BlinkPhase;  // BlinkPhase umdrehen
}

void DoKeys(void)
{ 
  if (Timers.KeyTime) return;  // noch nix zu tun
  Timers.KeyTime = 20;         // nächste Abfrage in 20ms

  //  Tastenstatus auswerten usw.....
}

void main(void)   // Hauptprogramm:
{
  while (1)
  {
    DoLed1();
    DoLed2();
    DoKeys();
    // ....usw....
  }
}
aber viele Wege führen zum Ziel, da hat sicher jeder eine andere Lösung...

Siro