// Program to exercise the MD_MAX72XX library // // Uses most of the functions in the library #include //#include // Turn on debug statements to the serial output #define DEBUG 1 #if DEBUG #define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); } #define PRINTS(x) Serial.print(F(x)) #define PRINTD(x) Serial.println(x, DEC) #else #define PRINT(s, x) #define PRINTS(x) #define PRINTD(x) #endif // Define the number of devices we have in the chain and the hardware interface // NOTE: These pin numbers will probably not work with your hardware and may // need to be adapted #define HARDWARE_TYPE MD_MAX72XX::FC16_HW #define MAX_DEVICES 4 #define CS_PIN 6 // or SS // SPI hardware interface MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); // Arbitrary pins //MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); // We always wait a bit between updates of the display #define DELAYTIME 300 // in milliseconds void scrollText(const char *p) { uint8_t charWidth; uint8_t cBuf[8]; // this should be ok for all built-in fonts PRINTS("\nScrolling text"); mx.clear(); while (*p != '\0') { charWidth = mx.getChar(*p++, sizeof(cBuf) / sizeof(cBuf[0]), cBuf); for (uint8_t i=0; i<=charWidth; i++) // allow space between characters { mx.transform(MD_MAX72XX::TSL); if (i < charWidth) mx.setColumn(0, cBuf[i]); delay(DELAYTIME); } } } void zeroPointSet() // Demonstrates the use of setPoint and // show where the zero point is in the display { PRINTS("\nZero point highlight"); mx.clear(); if (MAX_DEVICES > 1) mx.setChar((2*COL_SIZE)-1, '0'); for (uint8_t i=0; i7"); mx.clear(); for (uint8_t row=0; row 1) idx = 0; } delay(10 * DELAYTIME); } } void columns() // Demonstrates the use of setColumn() { PRINTS("\nCols 0->max"); mx.clear(); for (uint8_t col=0; col=0; i--) { for (uint8_t j=0; j rmin) && (cmax > cmin)) { // do row for (int i=cmin; i<=cmax; i++) { mx.setPoint(rmin, i, true); delay(DELAYTIME/MAX_DEVICES); } rmin++; // do column for (uint8_t i=rmin; i<=rmax; i++) { mx.setPoint(i, cmax, true); delay(DELAYTIME/MAX_DEVICES); } cmax--; // do row for (int i=cmax; i>=cmin; i--) { mx.setPoint(rmax, i, true); delay(DELAYTIME/MAX_DEVICES); } rmax--; // do column for (uint8_t i=rmax; i>=rmin; i--) { mx.setPoint(i, cmin, true); delay(DELAYTIME/MAX_DEVICES); } cmin++; } } void bounce() // Animation of a bouncing ball { const int minC = 0; const int maxC = mx.getColumnCount()-1; const int minR = 0; const int maxR = ROW_SIZE-1; int nCounter = 0; int r = 0, c = 2; int8_t dR = 1, dC = 1; // delta row and column PRINTS("\nBouncing ball"); mx.clear(); while (nCounter++ < 200) { mx.setPoint(r, c, false); r += dR; c += dC; mx.setPoint(r, c, true); delay(DELAYTIME/2); if ((r == minR) || (r == maxR)) dR = -dR; if ((c == minC) || (c == maxC)) dC = -dC; } } void intensity() // Demonstrates the control of display intensity (brightness) across // the full range. { uint8_t row; PRINTS("\nVary intensity "); mx.clear(); // Grow and get brighter row = 0; for (int8_t i=0; i<=MAX_INTENSITY; i++) { mx.control(MD_MAX72XX::INTENSITY, i); if (i%2 == 0) mx.setRow(row++, 0xff); delay(DELAYTIME*3); } mx.control(MD_MAX72XX::INTENSITY, 8); } void blinking() // Uses the test function of the MAX72xx to blink the display on and off. { int nDelay = 1000; PRINTS("\nBlinking"); mx.clear(); while (nDelay > 0) { mx.control(MD_MAX72XX::TEST, MD_MAX72XX::ON); delay(nDelay); mx.control(MD_MAX72XX::TEST, MD_MAX72XX::OFF); delay(nDelay); nDelay -= DELAYTIME; } } void scanLimit(void) // Uses scan limit function to restrict the number of rows displayed. { PRINTS("\nScan Limit"); mx.clear(); mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::OFF); for (uint8_t row=0; row=0; s--) { mx.control(MD_MAX72XX::SCANLIMIT, s); delay(DELAYTIME*5); } mx.control(MD_MAX72XX::SCANLIMIT, MAX_SCANLIMIT); } void transformation1() // Demonstrates the use of transform() to move bitmaps on the display // In this case a user defined bitmap is created and animated. { uint8_t arrow[COL_SIZE] = { 0b00001000, 0b00011100, 0b00111110, 0b01111111, 0b00011100, 0b00011100, 0b00111110, 0b00000000 }; MD_MAX72XX::transformType_t t[] = { MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TFLR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TSR, MD_MAX72XX::TRC, MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TSD, MD_MAX72XX::TFUD, MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TSU, MD_MAX72XX::TINV, MD_MAX72XX::TRC, MD_MAX72XX::TRC, MD_MAX72XX::TRC, MD_MAX72XX::TRC, MD_MAX72XX::TINV }; PRINTS("\nTransformation1"); mx.clear(); // use the arrow bitmap mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::OFF); for (uint8_t j=0; j= 3) { char hex[3]; sprintf(hex, "%02X", i); mx.clear(1); mx.setChar((2*COL_SIZE)-1,hex[1]); mx.clear(2); mx.setChar((3*COL_SIZE)-1,hex[0]); } mx.update(); delay(DELAYTIME*2); } mx.update(MD_MAX72XX::ON); } void setup() { mx.begin(); #if DEBUG Serial.begin(57600); #endif PRINTS("\n[MD_MAX72XX Test & Demo]"); // scrollText("MD_MAX72xx Test "); } void loop() { #if 1 scrollText("Graphics"); zeroPointSet(); rows(); columns(); cross(); stripe(); checkboard(); bullseye(); bounce(); spiral(); #endif #if 1 scrollText("Control"); intensity(); scanLimit(); blinking(); #endif #if 1 scrollText("Transform"); transformation1(); transformation2(); #endif #if 1 scrollText("Charset"); wrapText(); showCharset(); #endif }