Академический Документы
Профессиональный Документы
Культура Документы
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
#include "LedControl.h"
//the opcodes for the MAX7221 and MAX7219
#define OP_NOOP 0
#define OP_DIGIT0 1
#define OP_DIGIT1 2
#define OP_DIGIT2 3
#define OP_DIGIT3 4
#define OP_DIGIT4 5
#define OP_DIGIT5 6
#define OP_DIGIT6 7
#define OP_DIGIT7 8
#define OP_DECODEMODE 9
#define OP_INTENSITY 10
#define OP_SCANLIMIT 11
#define OP_SHUTDOWN
12
#define OP_DISPLAYTEST 15
LedControl::LedControl(int dataPin, int clkPin, int csPin, int numDevices) {
SPI_MOSI=dataPin;
SPI_CLK=clkPin;
SPI_CS=csPin;
if(numDevices<=0 || numDevices>8 )
numDevices=8;
maxDevices=numDevices;
pinMode(SPI_MOSI,OUTPUT);
pinMode(SPI_CLK,OUTPUT);
pinMode(SPI_CS,OUTPUT);
digitalWrite(SPI_CS,HIGH);
SPI_MOSI=dataPin;
for(int i=0;i<64;i++)
status[i]=0x00;
for(int i=0;i<maxDevices;i++) {
spiTransfer(i,OP_DISPLAYTEST,0);
//scanlimit is set to max on startup
setScanLimit(i,7);
//decode is done in source
spiTransfer(i,OP_DECODEMODE,0);
clearDisplay(i);
//we go into shutdown-mode on startup
shutdown(i,true);
}
}
int LedControl::getDeviceCount() {
return maxDevices;
}
void LedControl::shutdown(int addr, bool b) {
if(addr<0 || addr>=maxDevices)
return;
if(b)
spiTransfer(addr, OP_SHUTDOWN,0);
else
spiTransfer(addr, OP_SHUTDOWN,1);
}
void LedControl::setScanLimit(int addr, int limit) {
if(addr<0 || addr>=maxDevices)
return;
if(limit>=0 || limit<8)
spiTransfer(addr, OP_SCANLIMIT,limit);
}
void LedControl::setIntensity(int addr, int intensity) {
if(addr<0 || addr>=maxDevices)
return;
if(intensity>=0 || intensity<16)
spiTransfer(addr, OP_INTENSITY,intensity);
}
void LedControl::clearDisplay(int addr) {
int offset;
if(addr<0 || addr>=maxDevices)
return;
offset=addr*8;
for(int i=0;i<8;i++) {
status[offset+i]=0;
spiTransfer(addr, i+1,status[offset+i]);
}
}
void LedControl::setLed(int addr, int row, int column, boolean state) {
int offset;
byte val=0x00;
if(addr<0 || addr>=maxDevices)
return;
if(row<0 || row>7 || column<0 || column>7)
return;
offset=addr*8;
offset=addr*8;
index=(byte)value;
if(index >127) {
//nothing define we use the space char
value=32;
}
v=charTable[index];
if(dp)
v|=B10000000;
status[offset+digit]=v;
spiTransfer(addr, digit+1,v);
}
void LedControl::spiTransfer(int addr, volatile byte opcode, volatile byte data)
{
//Create an array with the data to shift out
int offset=addr*2;
int maxbytes=maxDevices*2;
for(int i=0;i<maxbytes;i++)
spidata[i]=(byte)0;
//put our device data into the array
spidata[offset+1]=opcode;
spidata[offset]=data;
//enable the line
digitalWrite(SPI_CS,LOW);
//Now shift out the data
for(int i=maxbytes;i>0;i--)
shiftOut(SPI_MOSI,SPI_CLK,MSBFIRST,spidata[i-1]);
//latch the data onto the display
digitalWrite(SPI_CS,HIGH);
}
//a partir daqui, editado por Yuri Crisostomo Bernardo
void LedControl::printChar(int addr, int pos, char c){
byte sRow[7], i=0;
sRow[0] = 0x00;
sRow[6] = 0x00;
switch (c){
case ' ':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x00;
0x00;
0x00;
0x00;
case '!':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x00;
0x2f;
0x00;
0x00;
case '"':
sRow[1] = 0x00;
sRow[2] = 0x07;
sRow[3] = 0x00;
sRow[4] = 0x07;
sRow[5] = 0x00;
break;
case '#':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x14;
0x7f;
0x14;
0x7f;
0x14;
case '$':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x24;
0x2a;
0x7f;
0x2a;
0x12;
case '%':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x62;
0x64;
0x08;
0x13;
0x23;
case '&':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x36;
0x49;
0x55;
0x22;
0x50;
case '(':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x1c;
0x22;
0x41;
0x00;
case ')':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x41;
0x22;
0x1c;
0x00;
case '*':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x14;
0x08;
0x3E;
0x08;
0x14;
case '+':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x08;
0x08;
0x3E;
0x08;
0x08;
case ',':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0xA0;
0x60;
0x00;
0x00;
case '-':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x08;
0x08;
0x08;
0x08;
0x08;
case '.':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x60;
0x60;
0x00;
0x00;
case '/':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x20;
0x10;
0x08;
0x04;
0x02;
case '0':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x3E;
0x51;
0x49;
0x45;
0x3E;
case '1':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x42;
0x7F;
0x40;
0x00;
case '2':
sRow[1] = 0x42;
sRow[2] = 0x61;
sRow[3] = 0x51;
sRow[4] = 0x49;
sRow[5] = 0x46;
break;
case '3':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x21;
0x41;
0x45;
0x4B;
0x31;
case '4':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x18;
0x14;
0x12;
0x7F;
0x10;
case '5':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x27;
0x45;
0x45;
0x45;
0x39;
case '6':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x3C;
0x4A;
0x49;
0x49;
0x30;
case '7':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x01;
0x71;
0x09;
0x05;
0x03;
case '8':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x36;
0x49;
0x49;
0x49;
0x36;
case '9':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x06;
0x49;
0x49;
0x29;
0x1E;
case ':':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x36;
0x36;
0x00;
0x00;
case ';':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x56;
0x36;
0x00;
0x00;
case '<':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x08;
0x14;
0x22;
0x41;
0x00;
case '=':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x14;
0x14;
0x14;
0x14;
0x14;
case '>':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x41;
0x22;
0x14;
0x08;
case '?':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x02;
0x01;
0x51;
0x09;
0x06;
case '@':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x32;
0x49;
0x59;
0x51;
0x3E;
case 'A':
sRow[1] = 0x7C;
sRow[2] = 0x12;
sRow[3] = 0x11;
sRow[4] = 0x12;
sRow[5] = 0x7C;
break;
case 'B':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x49;
0x49;
0x49;
0x36;
case 'C':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x3E;
0x41;
0x41;
0x41;
0x22;
case 'D':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x41;
0x41;
0x22;
0x1C;
case 'E':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x49;
0x49;
0x49;
0x41;
case 'F':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x09;
0x09;
0x09;
0x01;
case 'G':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x3E;
0x41;
0x49;
0x49;
0x7A;
case 'H':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x08;
0x08;
0x08;
0x7F;
case 'I':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x41;
0x7F;
0x41;
0x00;
case 'J':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x20;
0x40;
0x41;
0x3F;
0x01;
case 'K':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x08;
0x14;
0x22;
0x41;
case 'L':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x40;
0x40;
0x40;
0x40;
case 'M':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x02;
0x0C;
0x02;
0x7F;
case 'N':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x04;
0x08;
0x10;
0x7F;
case 'O':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x3E;
0x41;
0x41;
0x41;
0x3E;
case 'P':
sRow[1] = 0x7F;
sRow[2] = 0x09;
sRow[3] = 0x09;
sRow[4] = 0x09;
sRow[5] = 0x06;
break;
case 'Q':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x3E;
0x41;
0x51;
0x21;
0x5E;
case 'R':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x09;
0x19;
0x29;
0x46;
case 'S':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x46;
0x49;
0x49;
0x49;
0x31;
case 'T':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x01;
0x01;
0x7F;
0x01;
0x01;
case 'U':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x3F;
0x40;
0x40;
0x40;
0x3F;
case 'V':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x1F;
0x20;
0x40;
0x20;
0x1F;
case 'W':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x3F;
0x40;
0x38;
0x40;
0x3F;
case 'X':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x63;
0x14;
0x08;
0x14;
0x63;
case 'Y':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x07;
0x08;
0x70;
0x08;
0x07;
case 'Z':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x61;
0x51;
0x49;
0x45;
0x43;
case '[':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x7F;
0x41;
0x41;
0x00;
case '\\':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x55;
0xAA;
0x55;
0xAA;
0x55;
case ']':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x41;
0x41;
0x7F;
0x00;
case '^':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x04;
0x02;
0x01;
0x02;
0x04;
case '_':
sRow[1] = 0x40;
sRow[2] = 0x40;
sRow[3] = 0x40;
sRow[4] = 0x40;
sRow[5] = 0x40;
break;
case '`':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x03;
0x05;
0x00;
0x00;
case 'a':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x20;
0x54;
0x54;
0x54;
0x78;
case 'b':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x48;
0x44;
0x44;
0x38;
case 'c':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x38;
0x44;
0x44;
0x44;
0x20;
case 'd':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x38;
0x44;
0x44;
0x48;
0x7F;
case 'e':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x38;
0x54;
0x54;
0x54;
0x18;
case 'f':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x08;
0x7E;
0x09;
0x01;
0x02;
case 'g':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x18;
0xA4;
0xA4;
0xA4;
0x7C;
case 'h':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x08;
0x04;
0x04;
0x78;
case 'i':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x44;
0x7D;
0x40;
0x00;
case 'j':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x40;
0x80;
0x84;
0x7D;
0x00;
case 'k':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7F;
0x10;
0x28;
0x44;
0x00;
case 'l':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x41;
0x7F;
0x40;
0x00;
case 'm':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7C;
0x04;
0x18;
0x04;
0x78;
case 'n':
sRow[1] = 0x7C;
sRow[2] = 0x08;
sRow[3] = 0x04;
sRow[4] = 0x04;
sRow[5] = 0x78;
break;
case 'o':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x38;
0x44;
0x44;
0x44;
0x38;
case 'p':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0xFC;
0x24;
0x24;
0x24;
0x18;
case 'q':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x18;
0x24;
0x24;
0x18;
0xFC;
case 'r':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x7C;
0x08;
0x04;
0x04;
0x08;
case 's':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x48;
0x54;
0x54;
0x54;
0x20;
case 't':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x04;
0x3F;
0x44;
0x40;
0x20;
case 'u':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x3C;
0x40;
0x40;
0x20;
0x7C;
case 'v':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x1C;
0x20;
0x40;
0x20;
0x1C;
case 'w':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x3C;
0x40;
0x30;
0x40;
0x3C;
case 'x':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x44;
0x28;
0x10;
0x28;
0x44;
case 'y':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x1C;
0xA0;
0xA0;
0xA0;
0x7C;
case 'z':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x44;
0x64;
0x54;
0x4C;
0x44;
case '{':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x10;
0x7C;
0x82;
0x00;
case '|':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x00;
0xFF;
0x00;
0x00;
case '}':
sRow[1] = 0x00;
sRow[2] = 0x82;
sRow[3] = 0x7C;
sRow[4] = 0x10;
sRow[5] = 0x00;
break;
case '?':
sRow[1]
sRow[2]
sRow[3]
sRow[4]
sRow[5]
break;
=
=
=
=
=
0x00;
0x06;
0x09;
0x09;
0x06;
}
for (i=0; i<7; i++){
LedControl::setRow(addr, pos+i, sRow[i]);
}
}
void LedControl::printString(int addr, int pos, char string[]){
int i=0;
while (string[i] != '\0'){
printChar(addr, 6*i+pos, string[i]);
i++;
}
}
void LedControl::printStringScroll(int addr, int pos, char string[], int tDelay,
char sentido){
int i=0, c=0;
while (string[c] != '\0'){
c++;
}
if (sentido == '<'){
for (i=0; i<((c*6)+1); i++){
printString(addr, -i+pos, string);
delay(tDelay);
}
}else if (sentido == '>'){
for (i=0; i<((c*6)+1); i++){
printString(addr, (-(c*6)+i)+pos, string);
delay(tDelay);
}
}
}