Hi,
best HW driven solution, which i use for years, is that you use SPI internal hw,
you can make SPI2NRZ circuit with few external parts, digital way (74xxx) or
analog https://hackaday.com/2014/02/04/ws28...-and-passives/
like this, i had to tune resistors, for better voltage variation tolerance, but work like this to.

so, when you have hardware helper, and internal hardware, then you can paly in interrupt later.

for first step you have to initialise MSSP hardvare on 800kbs with propper flags and registers
based on your clock and device datasheet. (yes you have to read it few time until get proper setings)
i actualy deal with 2 mssp paralell in interrupt, so i have time in main loop to play with other things.


Code:
for WS_CNT = 0 to number_of_ws
    SSP2BUF = R1[WS_CNT]
    SSP1BUF = R2[WS_CNT]
    SSP1IF  = 0
' something litle can feet here if interrupt... i have serial receive routine..
  WHILE SSP1IF = 0 : WEND
    SSP2BUF = G1[WS_CNT]
    SSP1BUF = G2[WS_CNT]
    SSP1IF  = 0
' something litle can feet here if interrupt... i have serial receive routine..
  WHILE SSP1IF = 0 : WEND
    SSP2BUF = B1[WS_CNT]
    SSP1BUF = B2[WS_CNT]
    SSP1IF  = 0
' something litle can feet here if interrupt... i have serial receive routine..
  WHILE SSP1IF = 0 : WEND
next WS_CNT
pauseus 60 ' for latch....
i hope you will understund directions, i have large code which i optimise for my work, so i
don't want to share it, but trust me this part i shared is core, all other is playing with it...

acrually , on slower pic, you can expirience for/next too slow, you can use goto instead, and
of course, today pic speed is 32mhz+ with internal rc osc+pll, already on .5$ parts, so forget
old 16f84 parts for this, use kind of 18f46k22 or 16f1827 or part like this....