Hola.
Como se usa una variable(Inicio) para facilitar las rotaciones, y siendo que el primer bit que envíes de una tanda de refresco a los registros de desplazamiento va a ser el que termine probablemente en la última columna, entonces:
1) Se envía desde el la que sería la última fila hasta la 1era;
2) Al desplazarse el Inicio y quedando transformado en un buffer cíclico, la rutina de refresco puede plantearse como 2 bucles for separados.
Para verlo mejor, qué mejor que un ejemplo?
Supongamos que en un punto X, la variable Inicio = 3;
Entonces, mirando al cartel, la información que debería mostrar el cartel debería estar ordenada así:
Mensaje[3] Mensaje[4] Mensaje[5] Mensaje[...] Mensaje[COLUMNAS-2] Mensaje[COLUMNAS - 1] Mensaje[0] Mensaje[1] Mensaje[2]
Ahora, aplicando 1) en el algorítmo, hay que enviar en orden inverso, quedando:
Mensaje[2] Mensaje[1] Mensaje[0] Mensaje[COLUMNAS-1] Mensaje[COLUMNAS-2] Mensaje[...] Mensaje[Inicio+2] Mensaje[Inicio+1] Mensaje[Inicio]
De esta manera, la primer columna enviada, es en realidad, la última. Esto se debe a que los registros de desplazamiento van desplazando bit a bit la información enviada. El primer bit enviado será el que más lejos llegue en la cascada de registros, debido a que será el que más veces ha sido desplazado por ellos.
Si ahora reemplazo los valores con los del Inicio, verás que queda:
//Mensaje[2] Mensaje[1] Mensaje[0] Mensaje[COLUMNAS-1] Mensaje[COLUMNAS-2] Mensaje[...] Mensaje[Inicio+2] Mensaje[Inicio+1] Mensaje[Inicio]
Mensaje[Inicio-1] Mensaje[Inicio-2] Mensaje[Inicio-3] Mensaje[COLUMNAS-1] Mensaje[COLUMNAS-2] Mensaje[...] Mensaje[Inicio+2] Mensaje[Inicio+1] Mensaje[Inicio]
Y como podrás observar, ocurre un salto del valor del índice brusco(excepto uses 256 COLUMNAS...). El salto aparece, en este caso, del elemento Mensaje[Inicio-3]. Aqui el índice sería 0, y en el próximo elemento(Mensaje[COLUMNAS-1]) el índice será mucho mayor a cero probablemente(sería 79 para 80 COLUMAS).
Ese salto, hace que algunos opten por dividir a la rutina en 2 partes. El 255 de la condición del primer bucle es por el desbordamiento(underflow) de la variable i al querer restarle 1 más cuando ya vale 0. Si mirás el valor inicial de la variable i en el segundo for, verás que comienza precisament, valiendo COLUMNAS - 1.
Te muestro la rutina de refresco que hice para la
Librería Matríz de LEDs Universal[compilador CCS]//ENVIO DE COLUMNAS A ENCENDER
if(!BufferInicio) j = COLUMNAS - 1; else j = BufferInicio - 1;
for(i =0; i < COLUMNAS; i++)
{
if(buffer[j] & mascara) output_high(SHIFT_DATA); else output_low(SHIFT_DATA); //enviar cada columna en alto o bajo segun corresponda con logica invertida
output_high(SHIFT_CLK);
output_low(SHIFT_CLK);
if(!j) j = COLUMNAS - 1; else j--; //j==0?
}
en la que los dos bucles están combinados en uno solo.
Suerte.