Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- *
- * mxctrl.class.h
- * Largement inspiré de LedControl par Eberhard Fahle
- * simplification des méthodes pour ne garder que l'essentiel pour manipuler des 'pixels' et les max72xx
- *
- */
- #ifndef MxCtrl_h
- #define MxCtrl_h
- #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
- #define byte uint8_t
- class MxCtrl {
- private :
- byte spidata[16];
- byte status[64];
- int LEDCONTROL_SPI_MOSI;
- int LEDCONTROL_SPI_CLK;
- int LEDCONTROL_SPI_CS;
- int maxDevices;
- // envoi des couples registre-op/donnée
- void spiTransfer(int addr, volatile byte opcode, volatile byte data) {
- int offset=addr*2;
- int maxbytes=maxDevices*2;
- for(int i=0;i<maxbytes;i++) {
- spidata[i]=(byte)0;
- }
- spidata[offset+1]=opcode;
- spidata[offset]=data;
- digitalWrite(LEDCONTROL_SPI_CS,LOW);
- for(int i=maxbytes;i>0;i--) {
- shiftOut(LEDCONTROL_SPI_MOSI,LEDCONTROL_SPI_CLK,MSBFIRST,spidata[i-1]);
- }
- digitalWrite(LEDCONTROL_SPI_CS,HIGH);
- }
- public:
- // constructeur
- MxCtrl(int dataPin, int clkPin, int csPin, int numDevices) {
- LEDCONTROL_SPI_MOSI=dataPin;
- LEDCONTROL_SPI_CLK=clkPin;
- LEDCONTROL_SPI_CS=csPin;
- if(numDevices<=0 || numDevices>8 ) {
- numDevices=1;
- }
- maxDevices=numDevices;
- pinMode(LEDCONTROL_SPI_MOSI,OUTPUT);
- pinMode(LEDCONTROL_SPI_CLK,OUTPUT);
- pinMode(LEDCONTROL_SPI_CS,OUTPUT);
- digitalWrite(LEDCONTROL_SPI_CS,HIGH);
- LEDCONTROL_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);
- //setScanLimit(i,7);
- spiTransfer(i,OP_DECODEMODE,0);
- clearDisplay(i);
- shutdown(i,true);
- }
- }
- void 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 setScanLimit(int addr, int limit) {
- if(addr<0 || addr>=maxDevices) {
- return;
- }
- if(limit>=0 || limit<8) {
- spiTransfer(addr, OP_SCANLIMIT,limit);
- }
- }
- // intensité des LEDs (joue sur le PWM mais c'est pas bien concluant...)
- void setIntensity(int addr, int intensity) {
- if(addr<0 || addr>=maxDevices) {
- return;
- }
- if(intensity>=0 || intensity<16) {
- spiTransfer(addr, OP_INTENSITY,intensity);
- }
- }
- void 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 clearAll() {
- for (int i=0;i<maxDevices;i++) {
- clearDisplay(i);
- }
- }
- // allumage/extinction d'une seule led
- void 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;
- val=B10000000 >> column;
- if(state) {
- status[offset+row]=status[offset+row]|val;
- }
- else {
- val=~val;
- status[offset+row]=status[offset+row]&val;
- }
- spiTransfer(addr, row+1,status[offset+row]);
- }
- // envoi d'une rangée entière
- void setRow(int addr, int row, byte value) {
- int offset;
- if(addr<0 || addr>=maxDevices) {
- return;
- }
- if(row<0 || row>7) {
- return;
- }
- offset=addr*8;
- status[offset+row]=value;
- spiTransfer(addr, row+1,status[offset+row]);
- }
- // envoi d'une colonne entière
- void setColumn(int addr, int col, byte value) {
- byte val;
- if(addr<0 || addr>=maxDevices) {
- return;
- }
- if(col<0 || col>7) {
- return;
- }
- for(int row=0;row<8;row++) {
- val=value >> (7-row);
- val=val & 0x01;
- setLed(addr,row,col,val);
- }
- }
- };
- #endif //MxCtrl.h
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement