5x5 LED Matrix Limited to 5 characters
how can enable string_map handle more 5 characters. ultimate goal put in complete sentence spaces. appreciated.
//5x5 scrolling led matrix
//16 jun 2013
//font matrix @ http://arduino.cc/forum/index.php/topic,7384.0.html
int cola = 7;
int colb = 6;
int colc = 5;
int cold = 4;
int cole = 3;
int row1 = 12;
int row2 = 11;
int row3 = 10;
int row4 = 9;
int row5 = 8;
//int row6 = 2;
//int row7 = 1;
//int row8 = 0;
int cols[5] = {cola, colb, colc, cold, cole};
int rows[5] = {row1, row2, row3, row4, row5};
//character fonts 5x5
byte a[5] = {0x04, 0x0a, 0x11, 0x1f, 0x11};
byte b[5] = {0x1e, 0x11, 0x1e, 0x11, 0x1e};
byte c[5] = {0x1e, 0x11, 0x10, 0x11, 0x1e};
byte d[5] = {0x1e, 0x11, 0x11, 0x11, 0x1e};
byte e[5] = {0x1f, 0x10, 0x1e, 0x10, 0x1f};
byte f[5] = {0x1f, 0x10, 0x1f, 0x10, 0x10};
byte h[5] = {0x11, 0x11, 0x1f, 0x11, 0x11};
byte i[5] = {0x1f, 0x04, 0x04, 0x04, 0x1f};
byte j[5] = {0x1f, 0x04, 0x04, 0x14, 0x1c};
byte k[5] = {0x11, 0x12, 0x1c, 0x12, 0x11};
byte l[5] = {0x10, 0x10, 0x10, 0x10, 0x1f};
byte m[5] = {0x1b, 0x15, 0x15, 0x11, 0x11};
byte n[5] = {0x11, 0x19, 0x15, 0x13, 0x11};
byte o[5] = {0x0e, 0x11, 0x11, 0x11, 0x0e};
byte p[5] = {0x1f, 0x11, 0x1f, 0x10, 0x10};
byte q[5] = {0x0e, 0x11, 0x15, 0x12, 0x0d};
byte r[5] = {0x1e, 0x11, 0x1e, 0x11, 0x11};
byte s[5] = {0x0f, 0x10, 0x0e, 0x01, 0x1e};
byte t[5] = {0x1f, 0x04, 0x04, 0x04, 0x04};
byte u[5] = {0x11, 0x11, 0x11, 0x11, 0x0e};
byte v[5] = {0x11, 0x11, 0x11, 0x0a, 0x04};
byte y[5] = {0x11, 0x0a, 0x04, 0x04, 0x04};
byte space[5] = {0x00, 0x00, 0x00, 0x00, 0x00};
boolean frame_buffer_new[5][5];
boolean string_map[5][5*6];
unsigned long string_map_max_col;
unsigned int tcnt2;
unsigned int timer_counter = 0;
unsigned long current_col = 0;
void setup()
{
pinmode(cola, output); pinmode(colb, output); pinmode(colc, output); pinmode(cold, output); pinmode(cole, output);
pinmode(row1, output); pinmode(row2, output); pinmode(row3, output); pinmode(row4, output); pinmode(row5, output); //pinmode(row6, output); pinmode(row7, output); pinmode(row8, output);
//set timer stuff
timsk2 &= ~(1<<toie2);
tccr2a &= ~(1<<wgm21) | (1<<wgm20);
tccr2b &= ~(1<<wgm22);
assr &= ~(1<<as2);
timsk2 &= ~(1<<ocie2a);
tccr2b |= (1<<cs22) | (1<<cs20);
tccr2b &= ~(1<<cs21);
tcnt2 = 6;
tcnt2 = tcnt2;
timsk2 |= (1<<toie2);
serial.begin(9600);
serial.println("isr initialized");
string_map_max_col = 5 * 6;
create_string_map("robyn");
//update frame_buffer_new first frame
for(int j=0;j<5;j++)
{
frame_buffer_new[0][j] = string_map[0][j];
frame_buffer_new[1][j] = string_map[1][j];
frame_buffer_new[2][j] = string_map[2][j];
frame_buffer_new[3][j] = string_map[3][j];
frame_buffer_new[4][j] = string_map[4][j];
}
display_off();
serial.println("string map + first frame created ...");
//print string_map
for(int i=0;i<5;i++)
{
for(int j=0;j<string_map_max_col;j++)
{
serial.print(string_map[j]);
serial.print(".");
}
serial.println();
}
}
//install isr
isr(timer2_ovf_vect)
{
timer_counter++;
if(timer_counter==110) //500 = 1 sec
{
//reset timer_counter
timer_counter=0;
//disable timer
timsk2 |= (0<<toie2);
//update frame
serial.println("frame update event ...");
current_col++;
for(int j=0;j<5;j++)
{
frame_buffer_new[0][j] = string_map[0][(current_col+j)%string_map_max_col];
frame_buffer_new[1][j] = string_map[1][(current_col+j)%string_map_max_col];
frame_buffer_new[2][j] = string_map[2][(current_col+j)%string_map_max_col];
frame_buffer_new[3][j] = string_map[3][(current_col+j)%string_map_max_col];
frame_buffer_new[4][j] = string_map[4][(current_col+j)%string_map_max_col];
}
display_and_hold_frame();
serial.println(current_col%string_map_max_col);
/*serial.println("updated frame buffer");
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
serial.print(frame_buffer_new[j]);
serial.print(".");
}
serial.println();
}*/
}
else
{
display_and_hold_frame();
}
tcnt2 = tcnt2;
//enable timer
timsk2 |= (1<<toie2);
}
void loop()
{
//do nothing .. isr take care of it
}
void display_off()
{
for(int i=0;i<5;i++){digitalwrite(rows, low);digitalwrite(cols, high);}
}
void display_and_hold_frame()
{
for(int i=0;i<5;i++){set_col(i);display_off();}
}
void set_col(int i)
{
//set col on => low
digitalwrite(cols, low);
if(frame_buffer_new[0]) {digitalwrite(rows[0],high);}
if(frame_buffer_new[1]) {digitalwrite(rows[1],high);}
if(frame_buffer_new[2]) {digitalwrite(rows[2],high);}
if(frame_buffer_new[3]) {digitalwrite(rows[3],high);}
if(frame_buffer_new[4]) {digitalwrite(rows[4],high);}
}
void create_string_map(string str)
{
byte *current_letter;
int length = str.length();
for(int counter=0;counter<length;counter++)
{
switch(str.charat(counter))
{
case 'a': current_letter = a; break; case 'b': current_letter = b; break;
case 'c': current_letter = c; break; case 'd': current_letter = d; break;
case 'e': current_letter = e; break; case 'f': current_letter = f; break;
case 'h': current_letter = h; break; case 'i': current_letter = i; break;
case 'j': current_letter = j; break; case 'k': current_letter = k; break;
case 'l': current_letter = l; break; case 'm': current_letter = m; break;
case 'n': current_letter = n; break; case 'o': current_letter = o; break;
case 'p': current_letter = p; break; case 'q': current_letter = q; break;
case 'r': current_letter = r; break; case 's': current_letter = s; break;
case 't': current_letter = t; break; case 'u': current_letter = u; break;
case 'v': current_letter = v; break; case 'y': current_letter = y; break;
}
for(int j=0;j<5;j++)
{
string_map[j][(counter*6)+0] = (current_letter[j]&bit(4))?true:false;
string_map[j][(counter*6)+1] = (current_letter[j]&bit(3))?true:false;
string_map[j][(counter*6)+2] = (current_letter[j]&bit(2))?true:false;
string_map[j][(counter*6)+3] = (current_letter[j]&bit(1))?true:false;
string_map[j][(counter*6)+4] = (current_letter[j]&bit(0))?true:false;
string_map[j][(counter*6)+5] = false; //filler column
}
}
}
//5x5 scrolling led matrix
//16 jun 2013
//font matrix @ http://arduino.cc/forum/index.php/topic,7384.0.html
int cola = 7;
int colb = 6;
int colc = 5;
int cold = 4;
int cole = 3;
int row1 = 12;
int row2 = 11;
int row3 = 10;
int row4 = 9;
int row5 = 8;
//int row6 = 2;
//int row7 = 1;
//int row8 = 0;
int cols[5] = {cola, colb, colc, cold, cole};
int rows[5] = {row1, row2, row3, row4, row5};
//character fonts 5x5
byte a[5] = {0x04, 0x0a, 0x11, 0x1f, 0x11};
byte b[5] = {0x1e, 0x11, 0x1e, 0x11, 0x1e};
byte c[5] = {0x1e, 0x11, 0x10, 0x11, 0x1e};
byte d[5] = {0x1e, 0x11, 0x11, 0x11, 0x1e};
byte e[5] = {0x1f, 0x10, 0x1e, 0x10, 0x1f};
byte f[5] = {0x1f, 0x10, 0x1f, 0x10, 0x10};
byte h[5] = {0x11, 0x11, 0x1f, 0x11, 0x11};
byte i[5] = {0x1f, 0x04, 0x04, 0x04, 0x1f};
byte j[5] = {0x1f, 0x04, 0x04, 0x14, 0x1c};
byte k[5] = {0x11, 0x12, 0x1c, 0x12, 0x11};
byte l[5] = {0x10, 0x10, 0x10, 0x10, 0x1f};
byte m[5] = {0x1b, 0x15, 0x15, 0x11, 0x11};
byte n[5] = {0x11, 0x19, 0x15, 0x13, 0x11};
byte o[5] = {0x0e, 0x11, 0x11, 0x11, 0x0e};
byte p[5] = {0x1f, 0x11, 0x1f, 0x10, 0x10};
byte q[5] = {0x0e, 0x11, 0x15, 0x12, 0x0d};
byte r[5] = {0x1e, 0x11, 0x1e, 0x11, 0x11};
byte s[5] = {0x0f, 0x10, 0x0e, 0x01, 0x1e};
byte t[5] = {0x1f, 0x04, 0x04, 0x04, 0x04};
byte u[5] = {0x11, 0x11, 0x11, 0x11, 0x0e};
byte v[5] = {0x11, 0x11, 0x11, 0x0a, 0x04};
byte y[5] = {0x11, 0x0a, 0x04, 0x04, 0x04};
byte space[5] = {0x00, 0x00, 0x00, 0x00, 0x00};
boolean frame_buffer_new[5][5];
boolean string_map[5][5*6];
unsigned long string_map_max_col;
unsigned int tcnt2;
unsigned int timer_counter = 0;
unsigned long current_col = 0;
void setup()
{
pinmode(cola, output); pinmode(colb, output); pinmode(colc, output); pinmode(cold, output); pinmode(cole, output);
pinmode(row1, output); pinmode(row2, output); pinmode(row3, output); pinmode(row4, output); pinmode(row5, output); //pinmode(row6, output); pinmode(row7, output); pinmode(row8, output);
//set timer stuff
timsk2 &= ~(1<<toie2);
tccr2a &= ~(1<<wgm21) | (1<<wgm20);
tccr2b &= ~(1<<wgm22);
assr &= ~(1<<as2);
timsk2 &= ~(1<<ocie2a);
tccr2b |= (1<<cs22) | (1<<cs20);
tccr2b &= ~(1<<cs21);
tcnt2 = 6;
tcnt2 = tcnt2;
timsk2 |= (1<<toie2);
serial.begin(9600);
serial.println("isr initialized");
string_map_max_col = 5 * 6;
create_string_map("robyn");
//update frame_buffer_new first frame
for(int j=0;j<5;j++)
{
frame_buffer_new[0][j] = string_map[0][j];
frame_buffer_new[1][j] = string_map[1][j];
frame_buffer_new[2][j] = string_map[2][j];
frame_buffer_new[3][j] = string_map[3][j];
frame_buffer_new[4][j] = string_map[4][j];
}
display_off();
serial.println("string map + first frame created ...");
//print string_map
for(int i=0;i<5;i++)
{
for(int j=0;j<string_map_max_col;j++)
{
serial.print(string_map[j]);
serial.print(".");
}
serial.println();
}
}
//install isr
isr(timer2_ovf_vect)
{
timer_counter++;
if(timer_counter==110) //500 = 1 sec
{
//reset timer_counter
timer_counter=0;
//disable timer
timsk2 |= (0<<toie2);
//update frame
serial.println("frame update event ...");
current_col++;
for(int j=0;j<5;j++)
{
frame_buffer_new[0][j] = string_map[0][(current_col+j)%string_map_max_col];
frame_buffer_new[1][j] = string_map[1][(current_col+j)%string_map_max_col];
frame_buffer_new[2][j] = string_map[2][(current_col+j)%string_map_max_col];
frame_buffer_new[3][j] = string_map[3][(current_col+j)%string_map_max_col];
frame_buffer_new[4][j] = string_map[4][(current_col+j)%string_map_max_col];
}
display_and_hold_frame();
serial.println(current_col%string_map_max_col);
/*serial.println("updated frame buffer");
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
serial.print(frame_buffer_new[j]);
serial.print(".");
}
serial.println();
}*/
}
else
{
display_and_hold_frame();
}
tcnt2 = tcnt2;
//enable timer
timsk2 |= (1<<toie2);
}
void loop()
{
//do nothing .. isr take care of it
}
void display_off()
{
for(int i=0;i<5;i++){digitalwrite(rows, low);digitalwrite(cols, high);}
}
void display_and_hold_frame()
{
for(int i=0;i<5;i++){set_col(i);display_off();}
}
void set_col(int i)
{
//set col on => low
digitalwrite(cols, low);
if(frame_buffer_new[0]) {digitalwrite(rows[0],high);}
if(frame_buffer_new[1]) {digitalwrite(rows[1],high);}
if(frame_buffer_new[2]) {digitalwrite(rows[2],high);}
if(frame_buffer_new[3]) {digitalwrite(rows[3],high);}
if(frame_buffer_new[4]) {digitalwrite(rows[4],high);}
}
void create_string_map(string str)
{
byte *current_letter;
int length = str.length();
for(int counter=0;counter<length;counter++)
{
switch(str.charat(counter))
{
case 'a': current_letter = a; break; case 'b': current_letter = b; break;
case 'c': current_letter = c; break; case 'd': current_letter = d; break;
case 'e': current_letter = e; break; case 'f': current_letter = f; break;
case 'h': current_letter = h; break; case 'i': current_letter = i; break;
case 'j': current_letter = j; break; case 'k': current_letter = k; break;
case 'l': current_letter = l; break; case 'm': current_letter = m; break;
case 'n': current_letter = n; break; case 'o': current_letter = o; break;
case 'p': current_letter = p; break; case 'q': current_letter = q; break;
case 'r': current_letter = r; break; case 's': current_letter = s; break;
case 't': current_letter = t; break; case 'u': current_letter = u; break;
case 'v': current_letter = v; break; case 'y': current_letter = y; break;
}
for(int j=0;j<5;j++)
{
string_map[j][(counter*6)+0] = (current_letter[j]&bit(4))?true:false;
string_map[j][(counter*6)+1] = (current_letter[j]&bit(3))?true:false;
string_map[j][(counter*6)+2] = (current_letter[j]&bit(2))?true:false;
string_map[j][(counter*6)+3] = (current_letter[j]&bit(1))?true:false;
string_map[j][(counter*6)+4] = (current_letter[j]&bit(0))?true:false;
string_map[j][(counter*6)+5] = false; //filler column
}
}
}
try this:
code: [select]
//5x5 scrolling led matrix
//16 jun 2013
//font matrix @ http://arduino.cc/forum/index.php/topic,7384.0.html
const char message[] = "robyn";
const int charactercount = sizeof message - 1; // don't count terminating null
int cola = 7;
int colb = 6;
int colc = 5;
int cold = 4;
int cole = 3;
int row1 = 12;
int row2 = 11;
int row3 = 10;
int row4 = 9;
int row5 = 8;
//int row6 = 2;
//int row7 = 1;
//int row8 = 0;
int cols[5] = {cola, colb, colc, cold, cole};
int rows[5] = {row1, row2, row3, row4, row5};
//character fonts 5x5
byte a[5] = {0x04, 0x0a, 0x11, 0x1f, 0x11};
byte b[5] = {0x1e, 0x11, 0x1e, 0x11, 0x1e};
byte c[5] = {0x1e, 0x11, 0x10, 0x11, 0x1e};
byte d[5] = {0x1e, 0x11, 0x11, 0x11, 0x1e};
byte e[5] = {0x1f, 0x10, 0x1e, 0x10, 0x1f};
byte f[5] = {0x1f, 0x10, 0x1f, 0x10, 0x10};
byte h[5] = {0x11, 0x11, 0x1f, 0x11, 0x11};
byte i[5] = {0x1f, 0x04, 0x04, 0x04, 0x1f};
byte j[5] = {0x1f, 0x04, 0x04, 0x14, 0x1c};
byte k[5] = {0x11, 0x12, 0x1c, 0x12, 0x11};
byte l[5] = {0x10, 0x10, 0x10, 0x10, 0x1f};
byte m[5] = {0x1b, 0x15, 0x15, 0x11, 0x11};
byte n[5] = {0x11, 0x19, 0x15, 0x13, 0x11};
byte o[5] = {0x0e, 0x11, 0x11, 0x11, 0x0e};
byte p[5] = {0x1f, 0x11, 0x1f, 0x10, 0x10};
byte q[5] = {0x0e, 0x11, 0x15, 0x12, 0x0d};
byte r[5] = {0x1e, 0x11, 0x1e, 0x11, 0x11};
byte s[5] = {0x0f, 0x10, 0x0e, 0x01, 0x1e};
byte t[5] = {0x1f, 0x04, 0x04, 0x04, 0x04};
byte u[5] = {0x11, 0x11, 0x11, 0x11, 0x0e};
byte v[5] = {0x11, 0x11, 0x11, 0x0a, 0x04};
byte y[5] = {0x11, 0x0a, 0x04, 0x04, 0x04};
byte space[5] = {0x00, 0x00, 0x00, 0x00, 0x00};
boolean frame_buffer_new[5][5];
boolean string_map[5][5*charactercount];
unsigned long string_map_max_col;
unsigned int tcnt2;
unsigned int timer_counter = 0;
unsigned long current_col = 0;
void setup()
{
pinmode(cola, output); pinmode(colb, output); pinmode(colc, output); pinmode(cold, output); pinmode(cole, output);
pinmode(row1, output); pinmode(row2, output); pinmode(row3, output); pinmode(row4, output); pinmode(row5, output); //pinmode(row6, output); pinmode(row7, output); pinmode(row8, output);
//set timer stuff
timsk2 &= ~(1<<toie2);
tccr2a &= ~(1<<wgm21) | (1<<wgm20);
tccr2b &= ~(1<<wgm22);
assr &= ~(1<<as2);
timsk2 &= ~(1<<ocie2a);
tccr2b |= (1<<cs22) | (1<<cs20);
tccr2b &= ~(1<<cs21);
tcnt2 = 6;
tcnt2 = tcnt2;
timsk2 |= (1<<toie2);
serial.begin(9600);
serial.println("isr initialized");
string_map_max_col = 5 * charactercount;
create_string_map(message);
//update frame_buffer_new first frame
for(int j=0;j<5;j++)
{
frame_buffer_new[0][j] = string_map[0][j];
frame_buffer_new[1][j] = string_map[1][j];
frame_buffer_new[2][j] = string_map[2][j];
frame_buffer_new[3][j] = string_map[3][j];
frame_buffer_new[4][j] = string_map[4][j];
}
display_off();
serial.println("string map + first frame created ...");
//print string_map
for(int i=0;i<5;i++)
{
for(int j=0;j<string_map_max_col;j++)
{
serial.print(string_map[i][j]);
serial.print(".");
}
serial.println();
}
}
//install isr
isr(timer2_ovf_vect)
{
timer_counter++;
if(timer_counter==110) //500 = 1 sec
{
//reset timer_counter
timer_counter=0;
//disable timer
timsk2 |= (0<<toie2);
//update frame
serial.println("frame update event ...");
current_col++;
for(int j=0;j<5;j++)
{
frame_buffer_new[0][j] = string_map[0][(current_col+j)%string_map_max_col];
frame_buffer_new[1][j] = string_map[1][(current_col+j)%string_map_max_col];
frame_buffer_new[2][j] = string_map[2][(current_col+j)%string_map_max_col];
frame_buffer_new[3][j] = string_map[3][(current_col+j)%string_map_max_col];
frame_buffer_new[4][j] = string_map[4][(current_col+j)%string_map_max_col];
}
display_and_hold_frame();
serial.println(current_col%string_map_max_col);
/*serial.println("updated frame buffer");
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
serial.print(frame_buffer_new[i][j]);
serial.print(".");
}
serial.println();
}*/
}
else
{
display_and_hold_frame();
}
tcnt2 = tcnt2;
//enable timer
timsk2 |= (1<<toie2);
}
void loop()
{
//do nothing .. isr take care of it
}
void display_off()
{
for(int i=0;i<5;i++){digitalwrite(rows[i], low);digitalwrite(cols[i], high);}
}
void display_and_hold_frame()
{
for(int i=0;i<5;i++){set_col(i);display_off();}
}
void set_col(int i)
{
//set col on => low
digitalwrite(cols[i], low);
if(frame_buffer_new[0][i]) {digitalwrite(rows[0],high);}
if(frame_buffer_new[1][i]) {digitalwrite(rows[1],high);}
if(frame_buffer_new[2][i]) {digitalwrite(rows[2],high);}
if(frame_buffer_new[3][i]) {digitalwrite(rows[3],high);}
if(frame_buffer_new[4][i]) {digitalwrite(rows[4],high);}
}
void create_string_map(string str)
{
byte *current_letter;
int length = str.length();
for(int counter=0;counter<length;counter++)
{
switch(str.charat(counter))
{
case 'a': current_letter = a; break; case 'b': current_letter = b; break;
case 'c': current_letter = c; break; case 'd': current_letter = d; break;
case 'e': current_letter = e; break; case 'f': current_letter = f; break;
case 'h': current_letter = h; break; case 'i': current_letter = i; break;
case 'j': current_letter = j; break; case 'k': current_letter = k; break;
case 'l': current_letter = l; break; case 'm': current_letter = m; break;
case 'n': current_letter = n; break; case 'o': current_letter = o; break;
case 'p': current_letter = p; break; case 'q': current_letter = q; break;
case 'r': current_letter = r; break; case 's': current_letter = s; break;
case 't': current_letter = t; break; case 'u': current_letter = u; break;
case 'v': current_letter = v; break; case 'y': current_letter = y; break;
}
for(int j=0;j<5;j++)
{
string_map[j][(counter*6)+0] = (current_letter[j]&bit(4))?true:false;
string_map[j][(counter*6)+1] = (current_letter[j]&bit(3))?true:false;
string_map[j][(counter*6)+2] = (current_letter[j]&bit(2))?true:false;
string_map[j][(counter*6)+3] = (current_letter[j]&bit(1))?true:false;
string_map[j][(counter*6)+4] = (current_letter[j]&bit(0))?true:false;
string_map[j][(counter*6)+5] = false; //filler column
}
}
}
Arduino Forum > Using Arduino > LEDs and Multiplexing > 5x5 LED Matrix Limited to 5 characters
arduino
Comments
Post a Comment