Hola,
Quizas sea mas conveniente que uses interrupciones, y que las demoras no sean simples loop que absorben toda la atencion del pic, sino que tus pausas sean loops que esperan el cambio de un flag controlado en la interrupcion. Por otro lado, tambien haces que la interrupcion administre los tiempos que le dedica a cada tarea.
Por ejemplo, cuando envias un caracter al LCD, en lugar de entrar a una rutina cerrada de la cual el pic no sale hasta terminar de poner el caracter en el LCD, con el uso de interrupciones logras que simultaneamente (mientras se ejecuta la rutina del LCD) se hagan cambios en el PWM, controle un teclado, etc.
El Pic siempre ejecuta una sola instruccion a la vez, pero de esta forma "ES COMO SI" realizara ambas cosas simultaneamente (de hecho puede correr varias rutinas "simultaneamente").
Saludos