я обычно делаю вульгарщину если тактовая позволяет там машинное время гробить:
WORD counter;
void tim1_int() // прерывание с каким-то периодом, например, 1 мс
{
counter++;
if (counter%20 == 0)
{ // 20 мс
...
}
if (counter%1000 == 0)
{ // 1 с
...
}
if (counter > 50000) counter = 0;
}