Lo que tenes ahi es un SPI realizado en software, nada mas, por que no usar el SSP y enviar 2 datos de 8 bits ?
Imagino que sacaste la libreria de un Arduino. Lo unico que hace es discriminar bit a bit y ponerlo en una salida. Me explico un poco mas:
si bitOrder es LSBFIRST y el dato es 0001 1010
Entonces va a enviar los datos en este orden: 0, 1, 0 , 1 , 1 , 0 , 0 , 0
Si no es LSBFIRST lo va a hacer al reves: 0, 0, 0, 1, 1, 0, 1, 0
Luego esta el pulso del clock. Si quisiera usar el SPI para comunicarme con el MAX7219, deberia configura el SSP en modo SPI Master y luego cargar los 2 bytes en el registro para que se envien.
Primero el dato y luego el address ( si es que ves el datasheet del MAX7219 )
Como decia lo mejor es usar el SPI, si aun asi lo queres hacer por software, entonces seria algo asi:
SPI_OCHO_BITS:
MOVF DATO, W
MOVWF ENVIAR ; Pongo el dato en un registro aparte
MOVLW 0x07
MOVWF CONTADOR ; Cargo el contador para saber cuantos datos a enviar
LOOP:
RRF ENVIAR, F
BTFSC STATUS, C
GOTO ENVIO_UNO
BCF PIN_DATO
GOTO ENVIO_CLOCK
ENVIO_UNO:
BSF PIN_DATO
ENVIO_CLOCK:
BSF PIN_CLOCK
BCF PIN_CLOCK
DECFSZ CONTADOR,F
GOTO LOOP
RETURN
En DATO tenes el dato a enviar, lo pongo en un registro auxiliar que se llama ENVIAR
CONTADOR hace el trabajo de la variable i en el for, el DECFSZ lo que hace es restar 1 y revisar cuadno es 0 CONTADOR asi salir. Sino repite continuamente.
La diferencia radica en que roto y como el bit que queda se va al flag CARRY aprovecho para revisar si es uno o 0 desde alli. Para cambiar y qeu se envie primero el bit de mayor peso, se deberia cambiar solo el RRF por RLF.