http://blog.vettore.org/building-a-large-led-sign-with-inexpensive-standard-modules...
[Arduino] / HUB12_cascaded / HUB12_cascaded.ino
1
2 /**************************************************************
3 *
4 *  Sample sketch for driving 24x16 LED PANEL (1/4 scan) with
5 *  HUB12 protocol
6 *  Support for multiple cascaded panels
7 *  Get text TO DISPLAY from the serial monitor
8 *
9 *************************************************************/
10  
11 #include <SPI.h>
12 #include <Timer.h>
13 #include "font.h"
14 Timer t;
15 Timer t1;
16  
17 //Pins specific for Mega.See Arduino SPI for a different board.
18 #define A 2 
19 #define B 3 
20 #define OE 4
21 #define R1 51
22 #define CLK 52
23 #define STB 53
24  
25 //number of cascaded panels  
26 #define N_PANELS 4  
27  
28 //row to be shown (1-4 since it is 1/4 scan)
29 byte row=0; 
30  
31 //brightness: increase->more bright
32 int br=400;
33  
34 int incomingByte = 0;
35  
36 //buffer 8 characters for N_PANELS
37  
38  
39  
40 byte stringDisp[8*N_PANELS]={
41   'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','x','y','0','1','2','3','4','5','6','7',
42 };
43  
44  
45  
46 //pixBuffer reserved space for N_PANELS
47 //contains status of every single pixel in our display!
48 byte pixBuffer[8*8*N_PANELS]={
49 };
50  
51  
52  
53 void setup () {
54      Serial.begin(9600);
55      pinMode(A, OUTPUT);
56      pinMode(B, OUTPUT);
57      pinMode(OE, OUTPUT);
58      pinMode(R1, OUTPUT);
59      pinMode(CLK, OUTPUT);
60      pinMode(STB, OUTPUT);
61  
62      SPI.begin();
63  
64      //set timers
65      //first timer is the refresh rate for the 1/4 scan
66      t.every(6,display);
67      //second timer is for change display text IF INPUT AVAILABLE
68      t1.every(1000,checkInput);
69  
70      delay(300); 
71 }    
72  
73  
74 void loop(){
75  
76   t.update();
77   t1.update();
78  
79 }
80  
81  
82 //diplay alternatively the 4 scan lines
83 void display(){
84        showRow(0);
85        showRow(1);
86        showRow(2);
87        showRow(3); 
88 }
89  
90  
91  
92 //Load and show row (1-4) i.e. 1-5-9-13, 2-6-10-14.....
93 void showRow(int row){  
94  
95       int col=0;//is a column of 2 chars
96  
97       for(col=0;col<4*N_PANELS;col++){//show 2 characters every cicle
98         SPI.transfer(~(pixBuffer[row+(col*8)+4+(32*N_PANELS)])); 
99         SPI.transfer(~(pixBuffer[row+(col*8)+(32*N_PANELS)]));
100         SPI.transfer(~(pixBuffer[row+(col*8)+4]));
101         SPI.transfer(~(pixBuffer[row+(col*8)]));
102       }
103  
104       digitalWrite(STB,LOW);
105       digitalWrite(STB,HIGH);
106  
107       scanrow(row);//enable encoder for the line loaded
108  
109       //PWM like. Change br to adjust brightnes
110       digitalWrite(OE,HIGH);
111       delayMicroseconds(br);//PWM per aggiustare luminosità
112       digitalWrite(OE,LOW);
113       delayMicroseconds(900);
114 }
115  
116 //enable encoder for this row in order to show it
117 void scanrow(int r){
118     if(r==0){
119       digitalWrite(A,0);
120       digitalWrite(B,0);
121     }  
122     else if(r==1){
123       digitalWrite(A,1);
124       digitalWrite(B,0);
125     }
126     else if(r==2){
127       digitalWrite(A,0);
128       digitalWrite(B,1);
129     }
130     else if(r==3){
131       digitalWrite(A,1);
132       digitalWrite(B,1);
133     }
134 }
135  
136 //check if input from the serial monitor is available 
137 //and update the display
138 void checkInput(void){
139   int x=0;
140   int y=0;
141   if(Serial.available()){
142         int h;
143         //clean display
144         for(h=0;h<(8*N_PANELS);h++)stringDisp[h]=32;
145   }
146   while (Serial.available() > 0) {
147            // read the incoming byte:
148            incomingByte = Serial.read();//only UP to the efective string length
149            if(x<(8*N_PANELS)) stringDisp[x]=incomingByte;
150            x++; 
151           }
152   loadBuffer();
153 }
154  
155  
156  
157 //load buffer with character pixels of the string
158 //performing a lookup on the FONT table
159 void loadBuffer(void){  
160       int x;
161       int y;
162       for(y=0;y<(8*(N_PANELS));y++){            
163            for(x=0;x<8;x++){
164                pixBuffer[x+8*y]=font[8*stringDisp[y]+x-(31*8)];//char under <=31 not defined
165             }
166       }
167 }
168