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