Hola, el sistema tal como lo planteas es muy bueno, faltaría saber con qué lenguaje vas a implementarlo: C,Basic o ensamblador.
Sea cual sea el lenguaje el enlace es de solo un canal, por lo tanto la comunicación solo podrá ser asincrona, tal como en rs-232, donde lo unico que deben compartir el tx y el rx es la velocidad o a niveles practicos de programación: el "tiempo de bit".
Si por ejemplo hablamos de una comunicación a 1200bps el tiempo de bit es de 1/1200 = 834uS
En la norma rs-232 se establece el primer bit como de "arranque" o el que sincroniza la comunicación, ya que cuando recibis este bit podes calcular que tiempo hay que esperar para recibir el proximo y el siguiente y asi con una cantidad especifica de bits (suelen ser 8: un byte).
Entonces tenes: 1bit de arranque + 8 bits de datos y si queres podes agregar un bit de paridad para saber si se produjo un (solo) error en la transmisión.
Tambien debes tener en cuenta un tiempo minimo de stop o tiempo minimo entre paquetes de al menos un bit, de esta forma el receptor puede prepararce para esperar un nuevo bit de arranque.
Despues de la explicación vamos a la practica:
En tu caso solo tendrias que implementar las rutinas para el 16f84a, ya que el f877 incorpora un modulo usart donde solo tienes que programar la velocidad y habilitar la recepción.
En el f84 tendrías que hacer una rutina de transmisión:
-Subrutina para bit de arranque
-Subrrutina de envio de un bit (0 o 1)
-Subrrutina de envio de un byte
y asi con todo lo que consideres necesario.
Si tenes que hacerlo en ensamblador creo tener algunos ejemplos guardados, solo pedilo y lo "levanto" al foro.