Hi everyone,
I have created a 16x8 led matrix and I’m driving it with two MAX7219 drivers. I have it fully working thanks to Tomas123’s code example:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1290449670
I had to modify it to accommodate my extra driver and the text scrolls slowly now. I’ve checked there are no delays involved. I think its a matter for code optimization.
I’m not sure but maybe i should be changing to lc.setRow instead. I’m just unsure how to implement it in my code when the font is all in columns (I had to create all of the lowercase by hand - a lot of time).
If anyone can see any obviously unnecessary or inefficient lines I’d appreciate it.
Thanks!
Dan
program.pde:
//We always have to include the library
#include "LedControl.h"
#include "font.h"
#include <avr/pgmspace.h>
/*
Now we need a LedControl to work with.
pin 12 is connected to the DataIn
pin 11 is connected to the CLK
pin 10 is connected to LOAD
We have 2 MAX72XX.
*/
char message_00[] PROGMEM = ("This is a test "); // Message to be displayed
LedControl lc = LedControl(2,4,3,2); // Initialise LEDControl Library
PROGMEM const char *messages[] = {message_00};
uint8_t screen_mem[16]; // screen memory - number of columns on screen
uint8_t active_row=1; // active row
uint8_t message_ptr = 0; // points to the active char in the message
uint8_t active_char = 0; // stores the active char
uint8_t message_length = 0; // stores the length of the active message
uint8_t char_ptr = 0; // points to the active col in the char
uint8_t char_length = 0; // stores the length of the active char
void setup() {
int devices=lc.getDeviceCount();
//we have to init all devices in a loop
for(int address=0;address<devices;address++) {
/*The MAX72XX is in power-saving mode on startup*/
lc.shutdown(address,false);
/* Set the brightness to a medium values */
lc.setIntensity(address,8);
/* and clear the display */
lc.clearDisplay(address);
}
}
/*
* copy screen_mem[] to LED Matrix 8x8
*/
void UpdateMatrix() {
/* here is the data for the characters */
int i;
for (i=0; i<8; i++){
lc.setColumn(0,i,screen_mem[i+7]);
lc.setColumn(1,i,screen_mem[i]);
}
}
/*
* show_char
* Displays the actual message.
* Scrolls the screen to the left and draws new pixels on the right.
* char stop bit is bit.7
*/
void show_char(const prog_uint8_t string[]) {
uint8_t i;
uint8_t b;
// shift the screen to the left
for (i = 0; i < 15; i++) {
screen_mem[i] = screen_mem[i+1];
}
// advance a char if needed
if (char_length == 0x80) {
//reset stop bit
char_length =0;
//read next char from progmem
memcpy_P(&active_char,&string[message_ptr],1);
//this is an alternativ PROGMEM access:
//active_char = pgm_read_byte_near(string + message_ptr);
message_ptr++;
//string stop byte 0x00
if (active_char == 0) {
message_ptr = 0;
char_length = 0x80; // immediately read next char
}
active_char -= CHAR_OFFSET;
char_ptr = 0;
// this makes the space between two chars
screen_mem[15]=0;
return;
}
// read pixels for current column of char
b = pgm_read_byte(&font[active_char * 5 + char_ptr]);
char_ptr++;
//char_length= (b & 0x01);
//b = (b >> 1);
char_length= (b & 0x80);
b = (b & 0x7F);
// write pixels into screen memory
screen_mem[15] =b;
}
void loop() {
show_char((uint8_t*)pgm_read_word(&(messages[0])));
UpdateMatrix();
}
font.h:
#include <avr/io.h>
#include <avr/pgmspace.h>
#ifndef FONT_H_
#define FONT_H_
#define CHAR_OFFSET 0x20
const uint8_t font[] PROGMEM = {
// 5 chars bitmap,stop bit is bit.7
0x00,0x00,0x80,0x80,0x80, // 0x20,32,space
0x00,0x30,0x7D,0x30,0x80, // 0x21,33,!
0x70,0x60,0x00,0x70,0xE0, // 0x22,34,"
0x12,0x3F,0x12,0x3F,0x92, // 0x23,35,#
0x12,0x6A,0x2B,0xA4,0x80, // 0x24,36,$
0x63,0x64,0x08,0x13,0xE3, // 0x25,37,%
0x36,0x49,0x35,0x02,0x85, // 0x26,38,&
0x00,0x70,0x60,0x80,0x80, // 0x27,39,'
0x00,0x3E,0x41,0x80,0x80, // 0x28,40,(
0x00,0x41,0x3E,0x80,0x80, // 0x29,41,)
0x08,0x3E,0x1C,0x3E,0x88, // 0x2A,42,*
0x08,0x08,0x3E,0x08,0x88, // 0x2B,43,+
0x00,0x02,0x03,0x80,0x80, // 0x2C,44,,
0x08,0x08,0x08,0x08,0x88, // 0x2D,45,-
0x00,0x03,0x03,0x80,0x80, // 0x2E,46,.
0x02,0x04,0x08,0x10,0xA0, // 0x2F,47,/
0x3E,0x45,0x49,0x51,0xBE, // 0x30,48,0
0x00,0x21,0x7F,0x81,0x80, // 0x31,49,1
0x23,0x45,0x49,0x49,0xB1, // 0x32,50,2
0x22,0x49,0x49,0x49,0xB6, // 0x33,51,3
0xC,0x14,0x24,0x7F,0x84, // 0x34,52,4
0x7A,0x49,0x49,0x49,0xC6, // 0x35,53,5
0x1E,0x29,0x49,0x49,0x86, // 0x36,54,6
0x40,0x47,0x48,0x50,0xE0, // 0x37,55,7
0x36,0x49,0x49,0x49,0xB6, // 0x38,56,8
0x30,0x49,0x49,0x4A,0xBC, // 0x39,57,9
0x00,0x1B,0x1B,0x80,0x80, // 0x3A,58,:
0x00,0x1B,0x1B,0x80,0x80, // 0x3B,59,;
0x08,0x14,0x22,0xC1,0x80, // 0x3C,60,<
0x12,0x12,0x12,0x12,0x92, // 0x3D,61,=
0x00,0x41,0x22,0x14,0x88, // 0x3E,62,>
0x20,0x40,0x4D,0x48,0xB0, // 0x3F,63,?
0x3E,0x41,0x5D,0x55,0xBC, // 0x40,64,@
0x3F,0x44,0x44,0x44,0xBF, // 0x41,65,A
0x7F,0x49,0x49,0x49,0xB6, // 0x42,66,B
0x3E,0x41,0x41,0x41,0xA2, // 0x43,67,C
0x7F,0x41,0x41,0x41,0xBE, // 0x44,68,D
0x7F,0x49,0x49,0x49,0xC1, // 0x45,69,E
0x7F,0x48,0x48,0x48,0xC0, // 0x46,70,F
0x3E,0x41,0x49,0x49,0xAF, // 0x47,71,G
0x7F,0x08,0x08,0x08,0xFF, // 0x48,72,H
0x41,0x7F,0xC1,0x80,0x80, // 0x49,73,I
0x06,0x01,0x01,0x01,0xFE, // 0x4A,74,J
0x7F,0x08,0x14,0x22,0xC1, // 0x4B,75,K
0x7F,0x01,0x01,0x01,0x81, // 0x4C,76,L
0x7F,0x20,0x10,0x20,0xFF, // 0x4D,77,M
0x7F,0x20,0x10,0x08,0xFF, // 0x4E,78,N
0x3E,0x41,0x41,0x41,0xBE, // 0x4F,79,O
0x7F,0x48,0x48,0x48,0xB0, // 0x50,80,P
0x3E,0x41,0x45,0x42,0xBD, // 0x51,81,Q
0x7F,0x48,0x48,0x4C,0xB3, // 0x52,82,R
0x32,0x49,0x49,0x49,0xA6, // 0x53,83,S
0x40,0x40,0x7F,0x40,0xC0, // 0x54,84,T
0x7E,0x01,0x01,0x01,0xFE, // 0x55,85,U
0x7C,0x02,0x01,0x02,0xFC, // 0x56,86,V
0x7E,0x01,0x1E,0x01,0xFE, // 0x57,87,W
0x63,0x14,0x08,0x14,0xE3, // 0x58,88,X
0x70,0x08,0x07,0x08,0xF0, // 0x59,89,Y
0x47,0x49,0x51,0xE1,0x80, // 0x5A,90,Z
0x7F,0x41,0xC1,0x80,0x80, // [
0x20,0x10,0x08,0x04,0x82, // '\'
0x41,0x41,0x7F,0x80,0x80, // ]
0x10,0x20,0x40,0x20,0x90, // ^
0x01,0x01,0x01,0x01,0x81, // _
0x40,0x20,0x10,0x80,0x80, // `
0x02,0x15,0x15,0x15,0x8F, // 0x61,97,a
0x7F,0x09,0x11,0x11,0x8E, // 0x62,98,b
0x0E,0x11,0x11,0x11,0x82, // 0x63,99,c
0x0E,0x11,0x11,0x09,0xFF, // 0x64,100,d
0x0E,0x15,0x15,0x15,0x8C, // 0x65,101,e
0x08,0x3F,0x48,0x40,0xA0, // 0x66,102,f
0x08,0x15,0x15,0x15,0x9E, // 0x67,103,g
0x7F,0x08,0x10,0x10,0x8F, // 0x68,104,h
0x11,0x5F,0x81,0x80,0x80, // 0x69,105,i
0x02,0x01,0x11,0xDE,0x80, // 0x6A,106,j
0x7F,0x04,0x0A,0x91,0x80, // 0x6B,107,k
0x41,0x7F,0x81,0x80,0x80, // 0x6C,108,l
0x1F,0x10,0x0C,0x10,0x8F, // 0x6D,109,m
0x1F,0x08,0x10,0x10,0x8F, // 0x6E,110,n
0x0E,0x11,0x11,0x11,0x8E, // 0x6F,111,o
0x1F,0x14,0x14,0x14,0x88, // 0x70,112,p
0x08,0x14,0x14,0x12,0x9F, // 0x71,113,q
0x1F,0x08,0x10,0x10,0x88, // 0x72,114,r
0x09,0x15,0x15,0x15,0x82, // 0x73,115,s
0x10,0x7E,0x11,0x01,0x82, // 0x74,116,t
0x1E,0x01,0x01,0x02,0x9F, // 0x75,117,u
0x1C,0x02,0x01,0x02,0x9C, // 0x76,118,v
0x1E,0x01,0x06,0x01,0x9E, // 0x77,119,w
0x11,0x0A,0x04,0x0A,0x91, // 0x78,120,x
0x18,0x05,0x05,0x05,0x9E, // 0x79,121,y
0x11,0x13,0x15,0x19,0x91, // 0x7A,122,z
};
#endif /*FONT_H_*/