Hola,
una matriz monocromática puede ser fácilmente asociada como 1 led = 1 bit. Si la matriz es de 10x40, entonces tenemos 400 bits de memoria para la "pantalla". El tema es que si pensás dotarla de desplazamiento de derecha a izquierda, lo más sencillo sería hacer un arreglo de 16 x 40 bits, o bien uno de 8 x 80 bits, aunque la cosa se puede complicar un poco utilizando 8 x80. Te recomendaría de 16 x 40. No programé nunca PICs en BASIC, pero en C eso equivaldría a hacer un arreglo de 40 elementos de 16 bits cada uno:
unsigned int16 screenBuffer[40];
Por supuesto que hay desperdicio en este caso. Sólo se utilizarían 10 de los 16 bits de cada elemento (por ser tu matriz de 10 filas).
Allí ya tienes la memoria lista para procesar los gráficos y enviarlos periódicamente.
Para enviar los datos a las filas y columnas, se recurre a un contador de fila actual, y a una máscara asociada.
unsigned int8 filaActual = 0;
unsigned int8 filaActualMask = 1;
unsigned int8 newFrame = 0; //util para saber cuando se ha cumplido un cuadro completo de refresco
Vas a necesitar generar una rutina de interrupción para generar el refresco de cada fila. Si todavía no compraste los 74LS164, te recomiendo que no lo hagas. Comprá 74HC595 o al menos CD4094 o simil. Son mejores.
en la subrutina de refesco:
unsigned int8 aux;
for(aux = 39; aux != 255 ; aux--)
{
DATAS = 0;
if(screenBuffer[aux] & filaActualMask) DATAS = 1;
CLOCKS = 1;
delay_cycles(2);
CLOCKS = 0;
}
APAGAR_TODAS_LAS_FILAS();
STROBES = 1; //grabar datos en registros de desplazamiento
delay_cycles(5);
STROBES = 0;
ENCENDER_FILA_ACTUAL(filaActual);
INCREMENTAR filaActual
SI filaActual > 9 ENTONCES filaActual = 0; filaActualMask = 1; newFrame = TRUE; SINO filaActualMask = filaActualMask * 2;
Ya con ese pseudo-código podés probar llenar la memoria con valores y probar si se visualiza correctamente. El timer que invoca la subrutina de interr. debería interrumpir cada:
1 / HertzDeseadosRefresco / cantidadFilasMatriz (s) = tiempoInterrTimerRefresco
digamos que si deseamos 100 Hertz para una matriz de 10 filas,
1 / 100 / 10 = 0.001 s = 1ms.
Primero, asegurate que eso funcione bien. Podés por ejemplo al inicio del programa imprimir un patrón en el buffer:
for(aux = 0; aux < 40; aux++)
screenBuffer[aux] = aux;
y ver que se muestren correctamente los valores binarios en la pantalla. Luego podés proceder a pensar cómo generar el mensaje de texto y rotarlo. Pero primero lo primero, necesitás lograr este primer paso, que es asociar íntimamente cada LED a un bit de tu buffer, de esa manera, sólo te preocupás por inyectar los datos correctos al buffer, y se verá automáticamente asociado en los LEDs de la matriz.
algo más de info:
http://www.todopic.com.ar/foros/index.php?topic=30658.0P.D. Tené en cuenta que con 10 filas, el tiempo de encendido máximo de cada led es de la décima parte. Esto hace que el LED brille 10 veces menos de lo normal. Lo más común es necesitar agregar ULN2803 o ULN2003 después de los registros de desplazamiento, y comandar las filas mediante otros ULN2803 o simil y luego transistores PNP. Si necesitás los esquemas te los facilito.
Saludos!