Paso 7: dibujar un marco
los datos se almacenan en matrices de caracteres sin signo, que son números de 8 bits. PROGMEM las fuerzas de los datos a ser almacenados en la memoria de programa, en lugar permitiendo que el avr copiar todos los datos a la ram. el propósito aquí es reducir el número de pasos necesarios y a maximizar la cantidad de información que puede ser almacenado y obtenido rápidamente.unsigned char green_vals[][8] PROGMEM = { { 0x01, 0xff, 0x80, 0xff, etc...unsigned char red_vals[][8] PROGMEM = { { 0x01, 0x02, 0x03, 0x04, etc...
Recuerde que la matriz es sólo de 8 LED ' s en todo, lo que significa que cada entrada en las matrices corresponde a una descripción completa de una fila completa. tan crear bucles en 8 de ellos en la sucesión es un marco...
for (i=0; i<8; i++){ set_frame( red_vals[ 0 ][ i ], green_vals[ 0 ][ i ], (1<<i) ); show_frame( TIME_TO_SHOW_LINE );}
excepto que no funciona, debido a PROGMEM ahí arriba... solo llamada pgm_read_byte() red_vals y green_vals para arreglarlo.
set_frame( pgm_read_byte( &red_vals[ 0 ][ i ] ), pgm_read_byte( &green_vals[ 0 ][ i ] ), (1<<i) );
la función de set_frame() es bastante simple:
/* send frame line data to shift registers and set appropriate grounder pin */void set_frame ( unsigned char red, unsigned char green, unsigned char gnd ){ /* just a loop variable */ unsigned char i = 0; /* set up red, loop through all 8 bits */ for (i=0; i<8; i++) { if ( red & (1<<i) ) PORTB |= red_ser; // if it's a one then serial pin hi else PORTB &= ~red_ser; // otherwise make sure it's low if ( green & (1<<i) ) PORTB |= green_ser; // if it's a one then pin hi else PORTB &= ~green_ser; // otherwise make sure it's low PORTB |= ser_sck; // clock up PORTB &= ~ser_sck; // clock down } PORTB &= ~red_ser; // be sure to leave red's ser line low PORTB &= ~green_ser; // leave green serial pin low /* set the grounder pin for this frame line to low */ PORTD = ~gnd; // upsidedown logic... }