Ceci est une ancienne révision du document !


#include <TimerOne.h>
 
unsigned char col[8]={2,3,4,5,6,7,8,9}; // pins for columns
unsigned char row[8]={10,11,12,13,14,15,16,17}; // pins for rows
unsigned char refreshRow=0; // set index
unsigned char lastRefreshRow=7; // for the refresh
unsigned int scrollIndex=0; // render starting column in bigMatrix
bool matrix [8] [8]; // image of the screen
bool bigMatrix [112] [8]; // image of complete message
 
// character set
unsigned char carSp[8]={0,0,0,0,0,0,0,0}; // Space
unsigned char carEx[8]={24,24,24,24,24,0,24,0}; // !
unsigned char carH[8]={102,102,102,126,102,102,102,0}; // H
unsigned char care[8]={0,0,60,102,126,96,60,0}; // e
unsigned char carl[8]={56,24,24,24,24,24,60,0}; // l
unsigned char caro[8]={0,0,60,102,102,102,60,0}; // o
unsigned char carw[8]={0,0,198,214,214,254,108,0}; // w
unsigned char carr[8]={0,0,216,108,96,96,240,0}; // r
unsigned char card[8]={28,12,124,204,204,204,118,0}; // d
unsigned char carF[8]={254,98,104,120,104,96,120,0}; // F
unsigned char cara[8]={0,0,120,12,124,204,118,0}; // a
unsigned char carb[8]={224,224,124,102,102,102,188,0}; // b
unsigned char car5[8]={126,98,96,60,12,108,60,0}; // 5
 
// fablab_web_5
 
 
void setup() {
Timer1.initialize(2500); // initialize the timer to refresh the screen (in microsecond)
test_matrix(10); // do a matrix led test
 
// write message " Hello world !" in BigMatrix table
char2BigMatrix(carSp,0); // [Space]
char2BigMatrix(carF,8); // F
char2BigMatrix(cara,16); // a
char2BigMatrix(carb,24); // b
char2BigMatrix(carl,32); // l
char2BigMatrix(cara,40); // a
char2BigMatrix(carb,48); //b
char2BigMatrix(carSp,56); // [Space]
char2BigMatrix(carw,64); // w
char2BigMatrix(care,72); // e
char2BigMatrix(carb,80); // b
char2BigMatrix(carSp,88); // [Space]
char2BigMatrix(car5,96); // 5
char2BigMatrix(carEx,104); // !(
Timer1.attachInterrupt(refresh_matrix); // rely interruption to refresh_matrix function and start the timer
 
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
bigMatrice2matrice(scrollIndex); // take 8 columns of bigMatrix and send them to matrix
scrollIndex+=1; // shift one column for next call
if(scrollIndex>111){ // if end of big matrix reached
  scrollIndex=0; // return to start
}
delay(100); // delay in ms between one column scrolling
}
 
void init_matrix(){ // set power for each rows and columns
  for (int i=0;i<8;i++){
  pinMode(col[i],OUTPUT);
  digitalWrite(col[i],HIGH);
  pinMode(row[i],OUTPUT);
  digitalWrite(row[i],LOW);
}
}
 
void test_matrix(int lasting){ // light up each led alternatively
    init_matrix();
    for (int y=0;y<8;y++){
  digitalWrite(row[y],HIGH);
  for (int x=0;x<8;x++){
    digitalWrite(col[x],LOW);
    delay(lasting);
    digitalWrite(col[x],HIGH);
  }
  digitalWrite(row[y],LOW);
  }
}
 
void char2BigMatrix(unsigned char character[8],unsigned char colInsert){ // insert a character in specified column of bigMatrix
  for(int x=colInsert;x<colInsert+8;x++){
    for(int y=0;y<8;y++){
      bigMatrix[x][y]=!(bitRead(character[y],7-(x-colInsert)));
    }
  }
}
 
void refresh_matrix(){ // draw matrix state on physical leds
  digitalWrite(row[lastRefreshRow],LOW);
  for (int i=0;i<8;i++){
    digitalWrite(col[i],matrix[i][refreshRow]);
  }
  digitalWrite(row[refreshRow],HIGH);
 refreshRow++;
 if (refreshRow>7){
 refreshRow=0;
 lastRefreshRow=7; 
 }else{
  lastRefreshRow=refreshRow-1;
 }
}
 
void bigMatrice2matrice(unsigned int colStart){ // copy part of bigMatrix to matrix
  for(int x=0;x<8;x++){
    for(int y=0;y<8;y++){
      if (x+colStart>111){
        colStart=-x;
      }
      matrix[x][y]=bigMatrix[x+colStart][y];
    }
  }
}

lien : http://www.blogule.net/index.php/2016/01/30/scrolling-sur-matrice-a-led/