23
23
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24
24
* OTHER DEALINGS IN THE SOFTWARE.
25
25
*/
26
-
26
+
27
27
28
28
#include " LedControl.h"
29
29
@@ -48,24 +48,24 @@ LedControl::LedControl(int dataPin, int clkPin, int csPin, int numDevices) {
48
48
SPI_CLK=clkPin;
49
49
SPI_CS=csPin;
50
50
if (numDevices<=0 || numDevices>8 )
51
- numDevices=8 ;
51
+ numDevices=8 ;
52
52
maxDevices=numDevices;
53
53
pinMode (SPI_MOSI,OUTPUT);
54
54
pinMode (SPI_CLK,OUTPUT);
55
55
pinMode (SPI_CS,OUTPUT);
56
56
digitalWrite (SPI_CS,HIGH);
57
57
SPI_MOSI=dataPin;
58
58
for (int i=0 ;i<64 ;i++)
59
- status[i]=0x00 ;
59
+ status[i]=0x00 ;
60
60
for (int i=0 ;i<maxDevices;i++) {
61
- spiTransfer (i,OP_DISPLAYTEST,0 );
62
- // scanlimit is set to max on startup
63
- setScanLimit (i,7 );
64
- // decode is done in source
65
- spiTransfer (i,OP_DECODEMODE,0 );
66
- clearDisplay (i);
67
- // we go into shutdown-mode on startup
68
- shutdown (i,true );
61
+ spiTransfer (i,OP_DISPLAYTEST,0 );
62
+ // scanlimit is set to max on startup
63
+ setScanLimit (i,7 );
64
+ // decode is done in source
65
+ spiTransfer (i,OP_DECODEMODE,0 );
66
+ clearDisplay (i);
67
+ // we go into shutdown-mode on startup
68
+ shutdown (i,true );
69
69
}
70
70
}
71
71
@@ -75,37 +75,36 @@ int LedControl::getDeviceCount() {
75
75
76
76
void LedControl::shutdown (int addr, bool b) {
77
77
if (addr<0 || addr>=maxDevices)
78
- return ;
78
+ return ;
79
79
if (b)
80
- spiTransfer (addr, OP_SHUTDOWN,0 );
80
+ spiTransfer (addr, OP_SHUTDOWN,0 );
81
81
else
82
- spiTransfer (addr, OP_SHUTDOWN,1 );
82
+ spiTransfer (addr, OP_SHUTDOWN,1 );
83
83
}
84
-
84
+
85
85
void LedControl::setScanLimit (int addr, int limit) {
86
86
if (addr<0 || addr>=maxDevices)
87
- return ;
88
- if (limit>=0 || limit<8 )
89
- spiTransfer (addr, OP_SCANLIMIT,limit);
87
+ return ;
88
+ if (limit>=0 && limit<8 )
89
+ spiTransfer (addr, OP_SCANLIMIT,limit);
90
90
}
91
91
92
92
void LedControl::setIntensity (int addr, int intensity) {
93
93
if (addr<0 || addr>=maxDevices)
94
- return ;
95
- if (intensity>=0 || intensity<16 )
96
- spiTransfer (addr, OP_INTENSITY,intensity);
97
-
94
+ return ;
95
+ if (intensity>=0 && intensity<16 )
96
+ spiTransfer (addr, OP_INTENSITY,intensity);
98
97
}
99
98
100
99
void LedControl::clearDisplay (int addr) {
101
100
int offset;
102
101
103
102
if (addr<0 || addr>=maxDevices)
104
- return ;
103
+ return ;
105
104
offset=addr*8 ;
106
105
for (int i=0 ;i<8 ;i++) {
107
- status[offset+i]=0 ;
108
- spiTransfer (addr, i+1 ,status[offset+i]);
106
+ status[offset+i]=0 ;
107
+ spiTransfer (addr, i+1 ,status[offset+i]);
109
108
}
110
109
}
111
110
@@ -114,42 +113,42 @@ void LedControl::setLed(int addr, int row, int column, boolean state) {
114
113
byte val=0x00 ;
115
114
116
115
if (addr<0 || addr>=maxDevices)
117
- return ;
116
+ return ;
118
117
if (row<0 || row>7 || column<0 || column>7 )
119
- return ;
118
+ return ;
120
119
offset=addr*8 ;
121
120
val=B10000000 >> column;
122
121
if (state)
123
- status[offset+row]=status[offset+row]|val;
122
+ status[offset+row]=status[offset+row]|val;
124
123
else {
125
- val=~val;
126
- status[offset+row]=status[offset+row]&val;
124
+ val=~val;
125
+ status[offset+row]=status[offset+row]&val;
127
126
}
128
127
spiTransfer (addr, row+1 ,status[offset+row]);
129
128
}
130
-
129
+
131
130
void LedControl::setRow (int addr, int row, byte value) {
132
131
int offset;
133
132
if (addr<0 || addr>=maxDevices)
134
- return ;
133
+ return ;
135
134
if (row<0 || row>7 )
136
- return ;
135
+ return ;
137
136
offset=addr*8 ;
138
137
status[offset+row]=value;
139
138
spiTransfer (addr, row+1 ,status[offset+row]);
140
139
}
141
-
140
+
142
141
void LedControl::setColumn (int addr, int col, byte value) {
143
142
byte val;
144
143
145
144
if (addr<0 || addr>=maxDevices)
146
- return ;
145
+ return ;
147
146
if (col<0 || col>7 )
148
- return ;
147
+ return ;
149
148
for (int row=0 ;row<8 ;row++) {
150
- val=value >> (7 -row);
151
- val=val & 0x01 ;
152
- setLed (addr,row,col,val);
149
+ val=value >> (7 -row);
150
+ val=val & 0x01 ;
151
+ setLed (addr,row,col,val);
153
152
}
154
153
}
155
154
@@ -158,35 +157,34 @@ void LedControl::setDigit(int addr, int digit, byte value, boolean dp) {
158
157
byte v;
159
158
160
159
if (addr<0 || addr>=maxDevices)
161
- return ;
160
+ return ;
162
161
if (digit<0 || digit>7 || value>15 )
163
- return ;
162
+ return ;
164
163
offset=addr*8 ;
165
164
v=charTable[value];
166
165
if (dp)
167
- v|=B10000000;
166
+ v|=B10000000;
168
167
status[offset+digit]=v;
169
168
spiTransfer (addr, digit+1 ,v);
170
-
171
169
}
172
170
173
171
void LedControl::setChar (int addr, int digit, char value, boolean dp) {
174
172
int offset;
175
173
byte index,v;
176
174
177
175
if (addr<0 || addr>=maxDevices)
178
- return ;
176
+ return ;
179
177
if (digit<0 || digit>7 )
180
- return ;
178
+ return ;
181
179
offset=addr*8 ;
182
180
index=(byte)value;
183
181
if (index >127 ) {
184
- // no defined beyond index 127, so we use the space char
185
- index=32 ;
182
+ // no defined beyond index 127, so we use the space char
183
+ index=32 ;
186
184
}
187
185
v=charTable[index];
188
186
if (dp)
189
- v|=B10000000;
187
+ v|=B10000000;
190
188
status[offset+digit]=v;
191
189
spiTransfer (addr, digit+1 ,v);
192
190
}
@@ -197,15 +195,15 @@ void LedControl::spiTransfer(int addr, volatile byte opcode, volatile byte data)
197
195
int maxbytes=maxDevices*2 ;
198
196
199
197
for (int i=0 ;i<maxbytes;i++)
200
- spidata[i]=(byte)0 ;
198
+ spidata[i]=(byte)0 ;
201
199
// put our device data into the array
202
200
spidata[offset+1 ]=opcode;
203
201
spidata[offset]=data;
204
202
// enable the line
205
203
digitalWrite (SPI_CS,LOW);
206
204
// Now shift out the data
207
205
for (int i=maxbytes;i>0 ;i--)
208
- shiftOut (SPI_MOSI,SPI_CLK,MSBFIRST,spidata[i-1 ]);
206
+ shiftOut (SPI_MOSI,SPI_CLK,MSBFIRST,spidata[i-1 ]);
209
207
// latch the data onto the display
210
208
digitalWrite (SPI_CS,HIGH);
211
209
}
0 commit comments