Moderators: stojke369, pedja089, trax, InTheStillOfTheNight
// send "data matrix" array to all MAXes
void max72xx_send_matrix()
{
uint8_t max_id, j, max_addr;
// since MAXes and LEDs are arranged in a funky way, we need to "transform" the data_matrix array before sending it to MAXes
uint8_t display_matrix_new[MAX72XX_COUNT][8];
// copy and do some transformations because LED matrices are soldered in a funky way onto the MAX chips :)
// MAX7219 RE-MAPPING CODE:
for(max_id=0; max_id<MAX72XX_COUNT; max_id++) // for each MAX chip
{
for(j=0; j<8; j++) // and each MAX accepts 8 bytes
{
// MAX1 and MAX4 are soldered in the same fashion
if(max_id==0 || max_id==3)
{
uint8_t old_byte = display_matrix[max_id][j];
// now rearrange the bits into a new byte
uint8_t new_byte = 0;
new_byte |= (old_byte & 0b00000001) <<6;
new_byte |= (old_byte & 0b00000010) ;
new_byte |= (old_byte & 0b00000100)<<3;
new_byte |= (old_byte & 0b00001000) >>3;
new_byte |= (old_byte & 0b00010000) ;
new_byte |= (old_byte & 0b00100000) >>3;
new_byte |= (old_byte & 0b01000000) <<1;
new_byte |= (old_byte & 0b10000000) >>4;
// now rearrange the indexes
uint8_t new_index = 0; // =0 because of compiler warning
switch (j)
{
/*case 0: new_index=0; break;
case 1: new_index=4; break;
case 2: new_index=6; break;
case 3: new_index=2; break;
case 4: new_index=3; break;
case 5: new_index=7; break;
case 6: new_index=5; break;
case 7: new_index=1; break;*/
case 0: new_index=1; break;
case 1: new_index=5; break;
case 2: new_index=7; break;
case 3: new_index=3; break;
case 4: new_index=2; break;
case 5: new_index=6; break;
case 6: new_index=4; break;
case 7: new_index=0; break;
}
display_matrix_new[max_id][new_index] = new_byte;
}
// and MAX2 and MAX3 are soldered in the same fashion
else
{
uint8_t old_byte = display_matrix[max_id][j];
// now rearrange the bits into a new byte
uint8_t new_byte = 0;
new_byte |= (old_byte & 0b00000001)<<3;
new_byte |= (old_byte & 0b00000010)<<6;
new_byte |= (old_byte & 0b00000100);
new_byte |= (old_byte & 0b00001000)<<1;
new_byte |= (old_byte & 0b00010000)>>4;
new_byte |= (old_byte & 0b00100000);
new_byte |= (old_byte & 0b01000000)>>5;
new_byte |= (old_byte & 0b10000000)>>1;
// now rearrange the indexes
uint8_t new_index = 0; // =0 because of compiler warning
switch (j)
{
/*case 0: new_index=1; break; // ili je 5 ili je 1
case 1: new_index=5; break; // ili je 1 ili je 5
case 2: new_index=7; break;
case 3: new_index=3; break;
case 4: new_index=2; break;
case 5: new_index=6; break;
case 6: new_index=4; break;
case 7: new_index=0; break;*/
case 0: new_index=0; break; // ili je 5 ili je 1
case 1: new_index=4; break; // ili je 1 ili je 5
case 2: new_index=0; break;
case 3: new_index=4; break;
case 4: new_index=6; break;
case 5: new_index=2; break;
case 6: new_index=3; break;
case 7: new_index=7; break;
}
display_matrix_new[max_id][new_index] = new_byte;
}
}
}
// finally send the new display matrix to all MAXes
for(max_id=1; max_id<=MAX72XX_COUNT; max_id++)
{
for(j=0, max_addr=0x01; j<8; j++, max_addr++)
{
max72xx_write(max_id, max_addr, display_matrix_new[max_id-1][j]); // send appropriate data to appropriate MAX :)
}
}
return;
}
hitch wrote:The project page gives some good arguments for using glass instead of plexiglass and says that the front and back were glued to each other. I really like the sleek front of your clock, putting magnets in the plexiglass would change that (a bit) so I'm having some doubts about that. So what disadvantages have you seen in your current design?
Return to Mikrokontroleri - AVR
Users browsing this forum: No registered users and 0 guests