Hi guys, i'm connecting according to http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1267391793/7 , instead i use 595shift register for both rows and column. see my video below for the problem
My matrix are 5x7. i connected rows to 3 shift register and the column into one shift register.
this are my code. Can anyone teach me how to display properly and with some text?
//-- Columns (Negative Cathodes) --
int latchPin1 = 2; //Arduino pin connected to Green 10 RCK of TPIC6C595
int clockPin1 = 3; //Arduino pin connected to Yellow 15 SRCK of TPIC6C595
int dataPin1 = 4; //Arduino pin connected to Blue 2 SER IN of TPIC6C595
//-- Rows (Positive Anodes) --
int latchPin2 = 5; //Arduino pinn connected to Green Latch 12 ST_CP / RCK of 74HC595
int clockPin2 = 6; //Arduino pin connected to Yellow Clock 11 SH_CP / SCK of 74HC595
int dataPin2 = 7; //Arduino pin connected to Blue Data 14 DS / SI of 74HC595
//=== B I T M A P ===
//Bits in this array represents one LED of the matrix
// 8 is # of rows, 7 is # of LED matrix we have
byte bitmap[8][4]; // Change the 7 to however many matrices you want to use.
int numZones = sizeof(bitmap) / 8; // I will refer to each group of 8 columns (represented by one matrix) as a Zone.
int maxZoneIndex = numZones-1;
int numCols = numZones * 8;
//=== F O N T ===
// Font courtesy of aspro648
// http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1203747843/22
// First char is @, next is A, B, etc. Only lower case, no symbols.
// The @ will display as space character.
byte alphabets[][5] = {
{0,0,0,0,0}, //space
{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}, //q
{99, 20, 8, 20, 99}, //x
{96, 16, 15, 16, 96}, //y
{67, 69, 73, 81, 97}, //z
{62, 69, 73, 81, 62}, //0 - zero
{0, 33, 127, 1, 0}, //1
{49, 67, 69, 73, 49}, //2
{34, 65, 73, 73, 54}, //3
{24, 104, 8, 127, 8}, //4
{114, 73, 73, 73, 70}, //5
{62, 73, 73, 73, 38}, //6
{64, 64, 71, 72, 112}, //7
{54, 73, 73, 73, 54}, //8
{50, 73, 73, 73, 62}, //9
};
//=== S E T U P ===
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;
}
}
}
//=== F U N C T I O N S ===
// This routine takes whatever we've setup in the bitmap array and display it on the matrix
void RefreshDisplay()
{
for (int row = 0; row < 8; row++) {
int rowbit = 1 << row;
digitalWrite(latchPin2, LOW); //Hold latchPin LOW for as long as we're transmitting data
shiftOut(dataPin2, clockPin2, MSBFIRST, rowbit); //Transmit data
//-- Start sending column bytes --
digitalWrite(latchPin1, LOW); //Hold latchPin LOW for as long as we're transmitting data
//-- Shift out to each matrix (zone is 8 columns represented by one matrix)
for (int zone = maxZoneIndex; zone >= 0; zone--) {
shiftOut(dataPin1, clockPin1, MSBFIRST, bitmap[row][zone]);
}
//-- Done sending Column bytes, flip both latches at once to eliminate flicker
digitalWrite(latchPin1, HIGH); //Return the latch pin high to signal chip that it no longer needs to listen for information
digitalWrite(latchPin2, HIGH); //Return the latch pin high to signal chip that it no longer needs to listen for information
//-- Wait a little bit to let humans see what we've pushed out onto the matrix --
delayMicroseconds(500);
}
}
// Converts row and colum to actual bitmap bit and turn it off/on
void Plot(int col, int row, bool isOn)
{
int zone = col / 8;
int colBitIndex = col % 8;
byte colBit = 1 << colBitIndex;
if (isOn)
bitmap[row][zone] = bitmap[row][zone] | colBit;
else
bitmap[row][zone] = bitmap[row][zone] & (~colBit);
}
// Plot each character of the message one column at a time, updated the display, shift bitmap left.
void AlphabetSoup()
{
char msg[] = "LED MATRIX 1234 ";
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 only 5 columns wide, but I 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); // We ALWAYS draw on the rightmost column, the shift loop below will scroll it leftward.
}
//-- The more times you repeat this loop, the slower we would scroll --
for (int refreshCount=0; refreshCount < 10; 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;
// Roll 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));
}
}
}
}
}
//=== L O O P ===
void loop() {
AlphabetSoup();
}
Moderator edit: [code] ... [/code] tags added. (Nick Gammon)