Primero lo que puso QIQE, eso o asignarle un valor como PORTB = 0000000 ( deberia estar incluidos los registros en el pic16f877.h pero veo que los definiste).
Tambien deberias poner el PORTA.0 como digital con el registro ADCON1, no se si el standar_io() maneja el TRIS solo o tambien el registro ese. ( lo digo por que lo vi como salida )
Otra de las cosas es que estas haciendo esto:
PORTB -> 0
PORTC -> 0
while
PORTB -> 1111 1111 ( 0xFF )
PORTB -> 0000 0001 ( 0x01 )
PORTB -> 0000 0000 ( 0x00 )
PORTB -> 0000 0001 ( 0x01 )
Con eso va a salir bastante cuadrada xD. De todas formas si quisieras que sea mas simetrica, deberias de tener al menos todos los delays iguales. Como lo estas planteando vos, a 50 Hz son 20ms cada ciclo. Dividido 4 ( que son cada uno de los pasos de la señal antes de comenzar de nuevo ) serian 5ms.
Esto sirve para una sola señal.. Al menos de la forma que lo haces.
PORTB -> 1111 1111 ( 0xFF )
5ms
PORTB -> 0000 0001 ( 0x01 )
5ms
PORTB -> 0000 0000 ( 0x00 )
5ms
PORTB -> 0000 0001 ( 0x01 )
5ms
Ahora si quisieras agregar una señal mas con tu sistema, dependeria del desfazaje y esos 5ms se repartirian, solo un ejemplo:
PORTB -> 1111 1111 ( 0xFF )
2ms
PORTC -> 0xFF
3ms
PORTB -> 0000 0001 ( 0x01 )
2ms
PORTC -> 0x01
3ms
PORTB -> 0000 0000 ( 0x00 )
2ms
PORTC -> 0x00
3ms
PORTB -> 0000 0001 ( 0x01 )
2ms
PORTC -> 0x00
3ms
Si quisieras que fuera MAS parecida a una senoidal utilizas mas valores desde 0x00 a 0xFF , si no los queres calcular, haces una tabla ( un array ) con los valores y que vaya tomando desde alli cada x tiempo y solo maneja los indices