Tu problema es exactamente ese, lo complicado que hiciste el driver en hardware que ahora para realizarlo en software se vuelve un caos.
El grafico que me hiciste es de 1 solo panel. Los demas paneles se conectan a la salida del registro de desplazamiento 4 ? ( Voy a suponer que es asi )
Creo que lo conveniente es que se envie 8 bits, asi no tener que crear los 16 bits dentro del micro.
Veamos... Siguiendo las secuencias a enviar si es que fuera un array tenemos que:
Datos a enviar:
0,1,2,3,4,5 //Esto si : Fila 1
6...11 // Esto no : Fila 2
12...17 // Esto no : Fila 3
18...23 // Esto no : Fila 4
24,25,26,27,28,29 // Esto si : Fila 1
30....35 // Esto no : Fila 2
En orden como debe ser enviado (segun el conexionado de los 74hc595):
29,5,28,4,27,3,26,2,25,1,24,0Resumen despues de analizar el primer envio, siempre van a estar separados por 24, vas a comenzar con el mas alto y luego de alli alternando hacia el mas bajo.
//Filas
for(j=0;j<4;j++)
{
for(i=0; i<6 ;i++)
{
Enviar_SPI( Display[(6*j)+29-i])
Enviar_SPI( Display[(6*j)+5-i])
}
// Aca latch y activo comunes, es donde deberias esperar antes de enviar lo de la otra fila
}
Probemos esto.. Primer fila, i desde 0 a 5
Valores de indice de array:
i -> Indice
0 -> 0 + 29 - 0 = 29
0 -> 0 + 5 - 0 = 5
1 -> 0 + 29 - 1 = 28
1 -> 0 + 5 - 1 = 4
2 -> 0 + 29 - 2 = 27
2 -> 0 + 5 - 2 = 3
3 -> 0 + 29 - 3 = 26
3 -> 0 + 5 - 3 = 2
4 -> 0 + 29 - 4 = 25
4 -> 0 + 5 - 4 = 1
5 -> 0 + 29 - 5 = 24
5 -> 0 + 5 - 5 = 0
Los valores dan correctamente. La formulas asi tambien los loops se pueden mejorar un poco pero lo dejo ya a tu voluntad.
Sigamos el ejemplo con la 2da fila (j=1), esta ves debemos enviar:
35,11,34,10,33,9,32,8,31,7,30,6
i -> Indice
0 -> 6 + 29 - 0 = 35
0 -> 6 + 5 - 0 = 11
1 -> 6 + 29 - 1 = 34
1 -> 6 + 5 - 1 = 10
2 -> 6 + 29 - 2 = 33
2 -> 6 + 5 - 2 = 9
3 -> 6 + 29 - 3 = 32
3 -> 6 + 5 - 3 = 8
4 -> 6 + 29 - 4 = 31
4 -> 6 + 5 - 4 = 7
5 -> 6 + 29 - 5 = 30
5 -> 6 + 5 - 5 = 6
Lo cual es correcto. Ahi tenes tu envio
PD:
Tome el formato del array con que lo hiciste ( display_ram[48] )