Performing different actions on the same timer
I would put the LED code in an interrupt routine and use a timer, if you want an accurate timing with minimal disturbance to the main code.
I don't know anything about the micro you are using, but I assume it has a couple of timers, so use one of these to trigger the interrupt to increment the LED. You can either put the whole code in the routine, or set a flag bit in the interrupt routine that triggers an LED increment function in the main code, which then clears the flag (generally you want to keep your interrupt code as short as possible)

You could also use an interrupt for the UART receive also, so you don't have to continuously poll for a keyboard Rx.

Alternatively, if you want to use the same timer but have different timings, you can have two loops, one fast outer loop and an inner loop that checks for, say, every 4th loop to divide the timing by 4 (then you could have your outer loop running at 250ms, and your inner loop running at 1 second intervals)  

Your code check could use the modulus symbol e.g. if(i % 4 == 0), then you can just leave i incrementing with no need to reset it.