/*////////////////////////////////////////////////////////////////////////////////
* Arduino code to display scrolling characters on 6 or more 8x8 LED matrix. *
* The no: of matrices can be increased with a small change in code. *
* Comments are given in each statement for editing. *
* Circuit designed and program coded by Prasanth K S *
* Contact : Prasanthksubash@gmail.com *
/*////////////////////////////////////////////////////////////////////////////////
char msg[] ="WELCOME WIZ";//Change the text here.
int scrollspeed=5;//Set the scroll speed ( lower=faster)
int x;
int y;
//Columns
int clockPin1 = 2; //Arduino pin connected to Clock Pin 11 of 74HC595
int latchPin1 = 3; //Arduino pin connected to Latch Pin 12 of 74HC595
int dataPin1 = 4; //Arduino pin connected to Data Pin 14 of 74HC595
//Rows
int clockPin2 = 5; //Arduino pin connected to Clock Pin 11 of 74HC595
int latchPin2 = 6; //Arduino pin connected to Latch Pin 12 of 74HC595
int dataPin2 = 7; //Arduino pin connected to Data Pin 14 of 74HC595
//BITMAP
//Bits in this array represents one LED of the matrix
// 8 is # of rows, 6 is # of LED matrices
byte bitmap[8][7];
int numZones = sizeof(bitmap) / 8; // One Zone refers to one 8 x 8 Matrix ( Group of 8 columns)
int maxZoneIndex = numZones-1;
int numCols = numZones * 8;
//FONT DEFENITION
byte alphabets[][8] = {
{0,0,0,0,0},//@ as SPACE
//{8,28,54,99,65},//<<
{31, 36, 68, 36, 31},//A
{127, 73, 73, 73, 54},//B
{62, 65, 65, 65, 34},//C
{127, 65, 65, 34, 28},//D
{127, 73, 73, 65, 65},//E
{127, 72, 72, 72, 64},//F
{62, 65, 65, 69, 38},//G
{127, 8, 8, 8, 127},//H
{0, 65, 127, 65, 0},//I
{2, 1, 1, 1, 126},//J
{127, 8, 20, 34, 65},//K
{127, 1, 1, 1, 1},//L
{127, 32, 16, 32, 127},//M
{127, 32, 16, 8, 127},//N
{62, 65, 65, 65, 62},//O
{127, 72, 72, 72, 48},//P
{62, 65, 69, 66, 61},//Q
{127, 72, 76, 74, 49},//R
{50, 73, 73, 73, 38},//S
{64, 64, 127, 64, 64},//T
{126, 1, 1, 1, 126},//U
{124, 2, 1, 2, 124},//V
{126, 1, 6, 1, 126},//W
{99, 20, 8, 20, 99},//X
{96, 16, 15, 16, 96},//Y
{67, 69, 73, 81, 97},//Z
};
void setup() {
pinMode(latchPin1, OUTPUT);
pinMode(clockPin1, OUTPUT);
pinMode(dataPin1, OUTPUT);
pinMode(latchPin2, OUTPUT);
pinMode(clockPin2, OUTPUT);
pinMode(dataPin2, OUTPUT);
//Clear bitmap
for (int row = 0; row < 8; row++) {
for (int zone = 0; zone <= maxZoneIndex; zone++) {
bitmap[row][zone] = 0;
}
}
}
//FUNCTIONS
// Displays bitmap array in the matrix
void RefreshDisplay()
{
for (int row = 0; row < 8; row++) {
int rowbit = 1 << row;
digitalWrite(latchPin2, LOW);//Hold latchPin LOW for transmitting data
shiftOut(dataPin2, clockPin2, MSBFIRST, rowbit); //Transmit data
//Start sending column bytes
digitalWrite(latchPin1, LOW);//Hold latchPin LOW for transmitting data
//Shift out to each matrix
for (int zone = maxZoneIndex; zone >= 0; zone--)
{
shiftOut(dataPin1, clockPin1, MSBFIRST, bitmap[row][zone]);
}
//flip both latches at once to eliminate flicker
digitalWrite(latchPin1, HIGH);//Return the latch pin 1 high to signal chip
digitalWrite(latchPin2, HIGH);//Return the latch pin 2 high to signal chip
//Wait
delayMicroseconds(300);
}
}
// Converts row and colum to bitmap bit and turn it off/on
void Plot(int col, int row, bool isOn)
{
int zone = col / 8;
int colBitIndex = x % 8;
byte colBit = 1 << colBitIndex;
if (isOn)
bitmap[row][zone] = bitmap[y][zone] | colBit;
else
bitmap[row][zone] = bitmap[y][zone] & (~colBit);
}
// Plot each character of the message one column at a time, updated the display, shift bitmap left.
void XProcess()
{
for (int charIndex=0; charIndex < (sizeof(msg)-1); charIndex++)
{
int alphabetIndex = msg[charIndex] - '@';
if (alphabetIndex < 0) alphabetIndex=0;
//Draw one character of the message
// Each character is 5 columns wide, loop two more times to create 2 pixel space betwen characters
for (int col = 0; col < 7; col++)
{
for (int row = 0; row < 8; row++)
{
// Set the pixel to what the alphabet say for columns 0 thru 4, but always leave columns 5 and 6 blank.
bool isOn = 0;
if (col<5) isOn = bitRead( alphabets[alphabetIndex][col], 7-row ) == 1;
Plot( numCols-1, row, isOn); //Draw on the rightmost column, the shift loop below will scroll it leftward.
}
for (int refreshCount=0; refreshCount < scrollspeed; refreshCount++)
RefreshDisplay();
//Shift the bitmap one column to left
for (int row=0; row<8; row++)
{
for (int zone=0; zone < numZones; zone++)
{
//This right shift would show as a left scroll on display because leftmost column is represented by least significant bit of the byte.
bitmap[row][zone] = bitmap[row][zone] >> 1;
// Shift over lowest bit from the next zone as highest bit of this zone.
if (zone < maxZoneIndex) bitWrite(bitmap[row][zone], 7, bitRead(bitmap[row][zone+1],0));
}
}
}
}
}
void loop() {
XProcess();
}
Hello,
so i have stumbled across this code that can display a scroling text on an led matrix matrix controled by a bunch of 74hc595 for rows and colums.
the problem is that there are no explaination of this code ,none. people that are using it on youtube also don't explain it . all they do is build the display and them give a link to the code , which apperas to be this one code all the time . I really hate coping so i wanted to undestand how thisone works so i could write my own code for the LED matrix .
now , only knowing a bit of c language i know that its going to be hard taking on arduino programing with out training ,but with all the research i've done , i know how to send data to the 74hc595 chips, i undestood the code until the part where it converts rows and columns into a bitmap . i'm completly lost there .
one of my probelms is that i can't figure out what are values of x and y in the code. i know that they have been defined in the begining of the code so they must have a purpose.
although this is not my only question i think that i can start from there and them ask more quetions.
ps: i am from Mali and studying electronics in china in chinese(first year ), this project is not a homework of any sorts , i'm not in a hurry .
any helps would be apreciated.
I'll also attach a picture of the schematic .