Advertisement
WolfLarsen33

matrix test header

Mar 15th, 2021
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  *
  3.  * mxctrl.class.h
  4.  * Largement inspiré de LedControl par Eberhard Fahle
  5.  * simplification des méthodes pour ne garder que l'essentiel pour manipuler des 'pixels' et les max72xx
  6.  *
  7. */
  8.  
  9. #ifndef MxCtrl_h
  10. #define MxCtrl_h
  11.  
  12. #define OP_NOOP   0
  13. #define OP_DIGIT0 1
  14. #define OP_DIGIT1 2
  15. #define OP_DIGIT2 3
  16. #define OP_DIGIT3 4
  17. #define OP_DIGIT4 5
  18. #define OP_DIGIT5 6
  19. #define OP_DIGIT6 7
  20. #define OP_DIGIT7 8
  21. #define OP_DECODEMODE  9
  22. #define OP_INTENSITY   10
  23. #define OP_SCANLIMIT   11
  24. #define OP_SHUTDOWN    12
  25. #define OP_DISPLAYTEST 15
  26. #define byte uint8_t
  27. class MxCtrl {
  28.  private :
  29.     byte spidata[16];
  30.     byte status[64];
  31.     int LEDCONTROL_SPI_MOSI;
  32.     int LEDCONTROL_SPI_CLK;
  33.     int LEDCONTROL_SPI_CS;
  34.     int maxDevices;
  35.    
  36. //  envoi des couples registre-op/donnée
  37.     void spiTransfer(int addr, volatile byte opcode, volatile byte data) {
  38.         int offset=addr*2;
  39.         int maxbytes=maxDevices*2;
  40.         for(int i=0;i<maxbytes;i++) {
  41.             spidata[i]=(byte)0;
  42.         }
  43.         spidata[offset+1]=opcode;
  44.         spidata[offset]=data;
  45.         digitalWrite(LEDCONTROL_SPI_CS,LOW);
  46.         for(int i=maxbytes;i>0;i--) {
  47.             shiftOut(LEDCONTROL_SPI_MOSI,LEDCONTROL_SPI_CLK,MSBFIRST,spidata[i-1]);
  48.         }
  49.         digitalWrite(LEDCONTROL_SPI_CS,HIGH);
  50.     }    
  51.  public:
  52.     // constructeur
  53.     MxCtrl(int dataPin, int clkPin, int csPin, int numDevices) {
  54.         LEDCONTROL_SPI_MOSI=dataPin;
  55.         LEDCONTROL_SPI_CLK=clkPin;
  56.         LEDCONTROL_SPI_CS=csPin;
  57.         if(numDevices<=0 || numDevices>8 ) {
  58.             numDevices=1;
  59.         }
  60.         maxDevices=numDevices;
  61.         pinMode(LEDCONTROL_SPI_MOSI,OUTPUT);
  62.         pinMode(LEDCONTROL_SPI_CLK,OUTPUT);
  63.         pinMode(LEDCONTROL_SPI_CS,OUTPUT);
  64.         digitalWrite(LEDCONTROL_SPI_CS,HIGH);
  65.         LEDCONTROL_SPI_MOSI=dataPin;
  66.         for(int i=0;i<64;i++) {
  67.             status[i]=0x00;
  68.         }
  69.         for(int i=0;i<maxDevices;i++) {
  70.             spiTransfer(i,OP_DISPLAYTEST,0);
  71.             //setScanLimit(i,7);
  72.             spiTransfer(i,OP_DECODEMODE,0);
  73.             clearDisplay(i);
  74.             shutdown(i,true);
  75.         }
  76.     }
  77.  
  78.     void shutdown(int addr, bool b) {
  79.         if(addr<0 || addr>=maxDevices) {
  80.             return;
  81.         }
  82.         if(b) {
  83.             spiTransfer(addr, OP_SHUTDOWN,0);
  84.         }
  85.         else {
  86.             spiTransfer(addr, OP_SHUTDOWN,1);
  87.         }
  88.     }
  89.        
  90.     void setScanLimit(int addr, int limit) {
  91.         if(addr<0 || addr>=maxDevices) {
  92.             return;
  93.         }
  94.         if(limit>=0 || limit<8) {
  95.             spiTransfer(addr, OP_SCANLIMIT,limit);
  96.         }
  97.     }
  98.  
  99. //  intensité des LEDs (joue sur le PWM mais c'est pas bien concluant...)
  100.     void setIntensity(int addr, int intensity) {
  101.         if(addr<0 || addr>=maxDevices) {
  102.             return;
  103.         }
  104.         if(intensity>=0 || intensity<16) {
  105.             spiTransfer(addr, OP_INTENSITY,intensity);
  106.         }
  107.     }
  108.  
  109.     void clearDisplay(int addr) {
  110.         int offset;
  111.  
  112.         if(addr<0 || addr>=maxDevices) {
  113.             return;
  114.         }
  115.         offset=addr*8;
  116.         for(int i=0;i<8;i++) {
  117.             status[offset+i]=0;
  118.             spiTransfer(addr, i+1,status[offset+i]);
  119.         }
  120.     }
  121.  
  122.     void clearAll() {
  123.        for (int i=0;i<maxDevices;i++) {
  124.            clearDisplay(i);
  125.        }
  126.     }
  127.  
  128. //  allumage/extinction d'une seule led
  129.     void setLed(int addr, int row, int column, boolean state) {
  130.         int offset;
  131.         byte val=0x00;
  132.  
  133.         if(addr<0 || addr>=maxDevices) {
  134.             return;
  135.         }
  136.         if(row<0 || row>7 || column<0 || column>7) {
  137.             return;
  138.         }
  139.         offset=addr*8;
  140.         val=B10000000 >> column;
  141.         if(state) {
  142.             status[offset+row]=status[offset+row]|val;
  143.         }
  144.         else {
  145.             val=~val;
  146.             status[offset+row]=status[offset+row]&val;
  147.         }
  148.         spiTransfer(addr, row+1,status[offset+row]);
  149.     }
  150.        
  151. //  envoi d'une rangée entière
  152.     void setRow(int addr, int row, byte value) {
  153.         int offset;
  154.         if(addr<0 || addr>=maxDevices) {
  155.             return;
  156.         }
  157.         if(row<0 || row>7) {
  158.             return;
  159.         }
  160.         offset=addr*8;
  161.         status[offset+row]=value;
  162.         spiTransfer(addr, row+1,status[offset+row]);
  163.     }
  164.        
  165. //  envoi d'une colonne entière
  166.     void setColumn(int addr, int col, byte value) {
  167.         byte val;
  168.  
  169.         if(addr<0 || addr>=maxDevices) {
  170.             return;
  171.         }
  172.         if(col<0 || col>7) {
  173.             return;
  174.         }
  175.         for(int row=0;row<8;row++) {
  176.             val=value >> (7-row);
  177.             val=val & 0x01;
  178.             setLed(addr,row,col,val);
  179.         }
  180.     }
  181. };
  182. #endif  //MxCtrl.h
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement