Skip to content

Commit 5a4ba48

Browse files
committed
Fixed eroor in tests for scanlimits and intensity. Issue #4
1 parent f21769a commit 5a4ba48

File tree

1 file changed

+48
-50
lines changed

1 file changed

+48
-50
lines changed

LedControl/LedControl.cpp

Lines changed: 48 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2424
* OTHER DEALINGS IN THE SOFTWARE.
2525
*/
26-
26+
2727

2828
#include "LedControl.h"
2929

@@ -48,24 +48,24 @@ LedControl::LedControl(int dataPin, int clkPin, int csPin, int numDevices) {
4848
SPI_CLK=clkPin;
4949
SPI_CS=csPin;
5050
if(numDevices<=0 || numDevices>8 )
51-
numDevices=8;
51+
numDevices=8;
5252
maxDevices=numDevices;
5353
pinMode(SPI_MOSI,OUTPUT);
5454
pinMode(SPI_CLK,OUTPUT);
5555
pinMode(SPI_CS,OUTPUT);
5656
digitalWrite(SPI_CS,HIGH);
5757
SPI_MOSI=dataPin;
5858
for(int i=0;i<64;i++)
59-
status[i]=0x00;
59+
status[i]=0x00;
6060
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);
6969
}
7070
}
7171

@@ -75,37 +75,36 @@ int LedControl::getDeviceCount() {
7575

7676
void LedControl::shutdown(int addr, bool b) {
7777
if(addr<0 || addr>=maxDevices)
78-
return;
78+
return;
7979
if(b)
80-
spiTransfer(addr, OP_SHUTDOWN,0);
80+
spiTransfer(addr, OP_SHUTDOWN,0);
8181
else
82-
spiTransfer(addr, OP_SHUTDOWN,1);
82+
spiTransfer(addr, OP_SHUTDOWN,1);
8383
}
84-
84+
8585
void LedControl::setScanLimit(int addr, int limit) {
8686
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);
9090
}
9191

9292
void LedControl::setIntensity(int addr, int intensity) {
9393
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);
9897
}
9998

10099
void LedControl::clearDisplay(int addr) {
101100
int offset;
102101

103102
if(addr<0 || addr>=maxDevices)
104-
return;
103+
return;
105104
offset=addr*8;
106105
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]);
109108
}
110109
}
111110

@@ -114,42 +113,42 @@ void LedControl::setLed(int addr, int row, int column, boolean state) {
114113
byte val=0x00;
115114

116115
if(addr<0 || addr>=maxDevices)
117-
return;
116+
return;
118117
if(row<0 || row>7 || column<0 || column>7)
119-
return;
118+
return;
120119
offset=addr*8;
121120
val=B10000000 >> column;
122121
if(state)
123-
status[offset+row]=status[offset+row]|val;
122+
status[offset+row]=status[offset+row]|val;
124123
else {
125-
val=~val;
126-
status[offset+row]=status[offset+row]&val;
124+
val=~val;
125+
status[offset+row]=status[offset+row]&val;
127126
}
128127
spiTransfer(addr, row+1,status[offset+row]);
129128
}
130-
129+
131130
void LedControl::setRow(int addr, int row, byte value) {
132131
int offset;
133132
if(addr<0 || addr>=maxDevices)
134-
return;
133+
return;
135134
if(row<0 || row>7)
136-
return;
135+
return;
137136
offset=addr*8;
138137
status[offset+row]=value;
139138
spiTransfer(addr, row+1,status[offset+row]);
140139
}
141-
140+
142141
void LedControl::setColumn(int addr, int col, byte value) {
143142
byte val;
144143

145144
if(addr<0 || addr>=maxDevices)
146-
return;
145+
return;
147146
if(col<0 || col>7)
148-
return;
147+
return;
149148
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);
153152
}
154153
}
155154

@@ -158,35 +157,34 @@ void LedControl::setDigit(int addr, int digit, byte value, boolean dp) {
158157
byte v;
159158

160159
if(addr<0 || addr>=maxDevices)
161-
return;
160+
return;
162161
if(digit<0 || digit>7 || value>15)
163-
return;
162+
return;
164163
offset=addr*8;
165164
v=charTable[value];
166165
if(dp)
167-
v|=B10000000;
166+
v|=B10000000;
168167
status[offset+digit]=v;
169168
spiTransfer(addr, digit+1,v);
170-
171169
}
172170

173171
void LedControl::setChar(int addr, int digit, char value, boolean dp) {
174172
int offset;
175173
byte index,v;
176174

177175
if(addr<0 || addr>=maxDevices)
178-
return;
176+
return;
179177
if(digit<0 || digit>7)
180-
return;
178+
return;
181179
offset=addr*8;
182180
index=(byte)value;
183181
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;
186184
}
187185
v=charTable[index];
188186
if(dp)
189-
v|=B10000000;
187+
v|=B10000000;
190188
status[offset+digit]=v;
191189
spiTransfer(addr, digit+1,v);
192190
}
@@ -197,15 +195,15 @@ void LedControl::spiTransfer(int addr, volatile byte opcode, volatile byte data)
197195
int maxbytes=maxDevices*2;
198196

199197
for(int i=0;i<maxbytes;i++)
200-
spidata[i]=(byte)0;
198+
spidata[i]=(byte)0;
201199
//put our device data into the array
202200
spidata[offset+1]=opcode;
203201
spidata[offset]=data;
204202
//enable the line
205203
digitalWrite(SPI_CS,LOW);
206204
//Now shift out the data
207205
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]);
209207
//latch the data onto the display
210208
digitalWrite(SPI_CS,HIGH);
211209
}

0 commit comments

Comments
 (0)