8x8 Led Matrix Library 1.0.0
This is a library for the 8x8 Led Matrix by Soldered
Loading...
Searching...
No Matches
MD_MAX72xx.h
Go to the documentation of this file.
1#pragma once
2
8#if defined(__MBED__) && !defined(ARDUINO)
9#include "mbed.h"
10#define delay ThisThread::sleep_for
11#ifndef PROGMEM
12#define PROGMEM
13#endif
14#ifndef boolean
15#define boolean bool
16#endif
17#ifndef bitRead
18#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
19#endif
20#ifndef bitSet
21#define bitSet(value, bit) ((value) |= (1UL << (bit)))
22#endif
23#ifndef bitClear
24#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
25#endif
26#ifndef bitWrite
27#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
28#endif
29#ifndef pgm_read_byte
30#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
31#endif
32#ifndef pgm_read_word
33#define pgm_read_word(addr) (*(const unsigned short *)(addr))
34#endif
35#ifndef pgm_read_dword
36#define pgm_read_dword(addr) (*(const unsigned long *)(addr))
37#endif
38#else
39#include <Arduino.h>
40#endif
41#include <SPI.h>
42
311#ifndef USE_LOCAL_FONT
312#define USE_LOCAL_FONT 1
313#endif
314
315// Display parameter constants
316// Defined values that are used throughout the library to define physical limits
317#define ROW_SIZE 8
318#define COL_SIZE 8
319#define MAX_INTENSITY 0xf
320#define MAX_SCANLIMIT 7
321
326{
327 public:
352
353#if USE_LOCAL_FONT
359 typedef const uint8_t fontType_t;
360#endif
361
369 {
371 SCANLIMIT = 1,
373 INTENSITY = 2,
375 TEST = 3,
376 DECODE = 4,
377 UPDATE = 10,
379 WRAPAROUND = 11
381 };
382
391 {
392 OFF = 0,
393 ON = 1
394 };
395
413
429 MD_MAX72XX(moduleType_t mod, uint8_t dataPin, uint8_t clkPin, uint8_t csPin, uint8_t numDevices = 1);
430
446 MD_MAX72XX(moduleType_t mod, uint8_t csPin, uint8_t numDevices = 1);
447
466 MD_MAX72XX(moduleType_t mod, SPIClass &spi, uint8_t csPin, uint8_t numDevices = 1);
467
478 void begin(void);
479
486 ~MD_MAX72XX();
487
488 //--------------------------------------------------------------
506 bool control(uint8_t dev, controlRequest_t mode, int value);
507
518 inline void control(controlRequest_t mode, int value)
519 {
520 control(0, getDeviceCount() - 1, mode, value);
521 };
522
535 bool control(uint8_t startDev, uint8_t endDev, controlRequest_t mode, int value);
536
542 uint8_t getDeviceCount(void)
543 {
544 return (_maxDevices);
545 };
546
552 uint16_t getColumnCount(void)
553 {
554 return (_maxDevices * COL_SIZE);
555 };
556
567 {
569 };
570
590 void setShiftDataInCallback(uint8_t (*cb)(uint8_t dev, transformType_t t))
591 {
592 _cbShiftDataIn = cb;
593 };
594
614 void setShiftDataOutCallback(void (*cb)(uint8_t dev, transformType_t t, uint8_t colData))
615 {
616 _cbShiftDataOut = cb;
617 };
618
621 //--------------------------------------------------------------
630 inline void clear(void)
631 {
632 clear(0, getDeviceCount() - 1);
633 };
634
644 void clear(uint8_t startDev, uint8_t endDev);
645
659 bool getBuffer(uint16_t col, uint8_t size, uint8_t *pd);
660
673 uint8_t getColumn(uint8_t c)
674 {
675 return getColumn((c / COL_SIZE), c % COL_SIZE);
676 };
677
690 bool getPoint(uint8_t r, uint16_t c);
691
705 bool setBuffer(uint16_t col, uint8_t size, uint8_t *pd);
706
721 bool setColumn(uint16_t c, uint8_t value)
722 {
723 // c = c + 1 > COL_SIZE - 1 ? 0 : c + 1;
724 return setColumn((c / COL_SIZE), c % COL_SIZE, value);
725 };
726
741 bool setPoint(uint8_t r, uint16_t c, bool state);
742
755 inline bool setRow(uint8_t r, uint8_t value)
756 {
757 return setRow(0, getDeviceCount() - 1, r, value);
758 };
759
775 bool setRow(uint8_t startDev, uint8_t endDev, uint8_t r, uint8_t value);
776
787 inline bool transform(transformType_t ttype)
788 {
789 return transform(0, getDeviceCount() - 1, ttype);
790 };
791
805 bool transform(uint8_t startDev, uint8_t endDev, transformType_t ttype);
806
820 {
821 control(UPDATE, mode);
822 };
823
833 void update(void)
834 {
836 };
837
851 {
852 control(WRAPAROUND, mode);
853 };
856 //--------------------------------------------------------------
866 bool clear(uint8_t buf);
867
878 uint8_t getColumn(uint8_t buf, uint8_t c);
879
890 uint8_t getRow(uint8_t buf, uint8_t r);
891
905 bool setColumn(uint8_t buf, uint8_t c, uint8_t value);
906
920 bool setRow(uint8_t buf, uint8_t r, uint8_t value);
921
933 bool transform(uint8_t buf, transformType_t ttype);
934
946 void update(uint8_t buf)
947 {
948 flushBuffer(buf);
949 };
952#if USE_LOCAL_FONT
953 //--------------------------------------------------------------
972 uint8_t getChar(uint16_t c, uint8_t size, uint8_t *buf);
973
987 uint8_t setChar(uint16_t col, uint16_t c);
988
1004 bool setFont(fontType_t *f);
1005
1018 uint8_t getMaxFontWidth(void)
1019 {
1020 return (_fontInfo.widthMax);
1021 };
1022
1034 uint8_t getFontHeight(void)
1035 {
1036 return (_fontInfo.height);
1037 };
1038
1051 {
1052 return (_fontData);
1053 };
1054#endif // USE_LOCAL_FONT
1057 private:
1058 typedef struct
1059 {
1060 uint8_t dig[ROW_SIZE]; // data for each digit of the MAX72xx (DIG0-DIG7)
1061 uint8_t changed; // one bit for each digit changed ('dirty bit')
1062 } deviceInfo_t;
1063
1064 // LED module wiring parameters defined by hardware type
1065 moduleType_t _mod; // The module type from the available list
1066 bool _hwDigRows; // MAX72xx digits are mapped to rows in on the matrix
1067 bool _hwRevCols; // Normal orientation is col 0 on the right. Set to true if reversed
1068 bool _hwRevRows; // Normal orientation is row 0 at the top. Set to true if reversed
1069
1070 uint8_t _dataPin; // DATA is shifted out of this pin ...
1071 uint8_t _clkPin; // ... signaled by a CLOCK on this pin ...
1072 uint8_t _csPin; // ... and LOADed when the chip select pin is driven HIGH to LOW
1073 bool _hardwareSPI; // true if SPI interface is the hardware interface
1074 SPIClass &_spiRef; // reference to the SPI object to use for hardware comms
1075
1076 // Device buffer data
1077 uint8_t _maxDevices; // maximum number of devices in use
1078 deviceInfo_t *_matrix; // the current status of the LED matrix (buffers)
1079 uint8_t *_spiData; // data buffer for writing to SPI interface
1080
1081 // User callback function for shifting operations
1082 uint8_t (*_cbShiftDataIn)(uint8_t dev, transformType_t t);
1083 void (*_cbShiftDataOut)(uint8_t dev, transformType_t t, uint8_t colData);
1084
1085 // Control data for the library
1086 bool _updateEnabled; // update the display when this is true, suspend otherwise
1087 bool _wrapAround; // when shifting, wrap left to right and vice versa (circular buffer)
1088
1089 // SPI interface data
1090#if defined(__MBED__) && !defined(ARDUINO)
1091 SPI _spi; // Mbed SPI object
1092 DigitalOut _cs;
1093#endif
1094
1095#if USE_LOCAL_FONT
1096 // Font properties info structure
1097 typedef struct
1098 {
1099 uint8_t version; // (v1) font definition version number (for compliance)
1100 uint8_t height; // (v1) font height in pixels
1101 uint8_t widthMax; // (v1) font maximum width in pixels (widest character)
1102 uint16_t firstASCII; // (v1,2) the first character code in the font table
1103 uint16_t lastASCII; // (v1,2) the last character code in the font table
1104 uint16_t dataOffset; // (v1) offset from the start of table to first character definition
1105 } fontInfo_t;
1106
1107 // Font related data
1108 fontType_t *_fontData; // pointer to the current font data being used
1109 fontInfo_t _fontInfo; // properties of the current font table
1110
1111 void setFontInfoDefault(void); // set the default parameters for the font info file
1112 void loadFontInfo(void); // load the font info block from the font data
1113 uint8_t getFontWidth(void); // get the maximum font width by inspecting the font table
1114 int32_t getFontCharOffset(uint16_t c); // find the character in the font data. If not there, return -1
1115#endif
1116
1117 // Private functions
1118 void spiSend(void); // do the actual physical communications task
1119 inline void spiClearBuffer(void); // clear the SPI send buffer
1120 void controlHardware(uint8_t dev, controlRequest_t mode, int value); // set hardware control commands
1121 void controlLibrary(controlRequest_t mode, int value); // set internal control commands
1122
1123 void flushBuffer(uint8_t buf); // determine what needs to be sent for one device and transmit
1124 void flushBufferAll(void); // determine what needs to be sent for all devices and transmit
1125
1126 uint8_t bitReverse(uint8_t b); // reverse the order of bits in the byte
1127 bool transformBuffer(uint8_t buf, transformType_t ttype); // internal transform function
1128
1129 bool copyRow(uint8_t buf, uint8_t rSrc, uint8_t rDest); // copy a row from Src to Dest
1130 bool copyColumn(uint8_t buf, uint8_t cSrc, uint8_t cDest); // copy a row from Src to Dest
1131
1132 void setModuleParameters(moduleType_t mod); // setup parameters based on module type
1133
1134 // _hwDigRev switched function for internal use
1135 bool copyC(uint8_t buf, uint8_t cSrc, uint8_t cDest);
1136 bool copyR(uint8_t buf, uint8_t rSrc, uint8_t rDest);
1137 uint8_t getC(uint8_t buf, uint8_t c);
1138 uint8_t getR(uint8_t buf, uint8_t r);
1139 bool setC(uint8_t buf, uint8_t c, uint8_t value);
1140 bool setR(uint8_t buf, uint8_t r, uint8_t value);
1141
1142 void printBinary(uint8_t inByte);
1143};
Definition MD_MAX72xx.h:326
uint8_t _maxDevices
Definition MD_MAX72xx.h:1077
void wraparound(controlValue_t mode)
Definition MD_MAX72xx.h:850
void setFontInfoDefault(void)
Definition MD_MAX72xx_font.cpp:41
bool setPoint(uint8_t r, uint16_t c, bool state)
Definition MD_MAX72xx_pix.cpp:100
bool _wrapAround
Definition MD_MAX72xx.h:1087
void printBinary(uint8_t inByte)
bool setFont(fontType_t *f)
Definition MD_MAX72xx_font.cpp:149
uint8_t _clkPin
Definition MD_MAX72xx.h:1071
void controlHardware(uint8_t dev, controlRequest_t mode, int value)
Definition MD_MAX72xx.cpp:188
bool setBuffer(uint16_t col, uint8_t size, uint8_t *pd)
Definition MD_MAX72xx_pix.cpp:63
uint8_t _csPin
Definition MD_MAX72xx.h:1072
MD_MAX72XX(moduleType_t mod, uint8_t csPin, uint8_t numDevices=1)
int32_t getFontCharOffset(uint16_t c)
Definition MD_MAX72xx_font.cpp:127
void setModuleParameters(moduleType_t mod)
uint16_t getColumnCount(void)
Definition MD_MAX72xx.h:552
bool _hardwareSPI
Definition MD_MAX72xx.h:1073
void update(controlValue_t mode)
Definition MD_MAX72xx.h:819
const uint8_t fontType_t
Definition MD_MAX72xx.h:359
uint8_t getChar(uint16_t c, uint8_t size, uint8_t *buf)
Definition MD_MAX72xx_font.cpp:160
void spiSend(void)
Definition MD_MAX72xx.cpp:383
void update(void)
Definition MD_MAX72xx.h:833
void begin(void)
Definition MD_MAX72xx.cpp:126
uint8_t getR(uint8_t buf, uint8_t r)
Definition MD_MAX72xx_buf.cpp:191
uint8_t getDeviceCount(void)
Definition MD_MAX72xx.h:542
uint8_t getRow(uint8_t buf, uint8_t r)
Definition MD_MAX72xx_buf.cpp:148
void clear(void)
Definition MD_MAX72xx.h:630
bool _hwDigRows
Definition MD_MAX72xx.h:1066
deviceInfo_t * _matrix
Definition MD_MAX72xx.h:1078
void(* _cbShiftDataOut)(uint8_t dev, transformType_t t, uint8_t colData)
Definition MD_MAX72xx.h:1083
fontType_t * getFont(void)
Definition MD_MAX72xx.h:1050
bool setC(uint8_t buf, uint8_t c, uint8_t value)
Definition MD_MAX72xx_buf.cpp:232
moduleType_t _mod
Definition MD_MAX72xx.h:1065
bool setR(uint8_t buf, uint8_t r, uint8_t value)
Definition MD_MAX72xx_buf.cpp:264
MD_MAX72XX(moduleType_t mod, SPIClass &spi, uint8_t csPin, uint8_t numDevices=1)
bool copyColumn(uint8_t buf, uint8_t cSrc, uint8_t cDest)
Definition MD_MAX72xx_buf.cpp:59
uint8_t * _spiData
Definition MD_MAX72xx.h:1079
controlRequest_t
Definition MD_MAX72xx.h:369
@ INTENSITY
Definition MD_MAX72xx.h:373
@ SCANLIMIT
Definition MD_MAX72xx.h:371
@ UPDATE
Definition MD_MAX72xx.h:377
@ DECODE
Set the MAX72XX 7 segment decode mode. Requires ON/OFF value. Library default is OFF.
Definition MD_MAX72xx.h:376
@ WRAPAROUND
Definition MD_MAX72xx.h:379
@ TEST
Set the MAX72XX in test mode. Requires ON/OFF value. Library default is OFF.
Definition MD_MAX72xx.h:375
@ SHUTDOWN
Shut down the MAX72XX. Requires ON/OFF value. Library default is OFF.
Definition MD_MAX72xx.h:370
SPIClass & _spiRef
Definition MD_MAX72xx.h:1074
uint8_t getC(uint8_t buf, uint8_t c)
Definition MD_MAX72xx_buf.cpp:156
void spiClearBuffer(void)
Definition MD_MAX72xx.cpp:377
uint8_t getMaxFontWidth(void)
Definition MD_MAX72xx.h:1018
moduleType_t
Definition MD_MAX72xx.h:337
@ DR1CR1RR1_HW
Structured name equivalent to ICSTATION_HW.
Definition MD_MAX72xx.h:350
@ ICSTATION_HW
Use ICStation style hardware module.
Definition MD_MAX72xx.h:341
@ DR0CR1RR1_HW
Structured name.
Definition MD_MAX72xx.h:346
@ DR1CR0RR0_HW
Structured name equivalent to FC16_HW.
Definition MD_MAX72xx.h:347
@ DR0CR0RR0_HW
Structured name.
Definition MD_MAX72xx.h:343
@ DR1CR0RR1_HW
Structured name.
Definition MD_MAX72xx.h:348
@ DR0CR1RR0_HW
Structured name equivalent to GENERIC_HW.
Definition MD_MAX72xx.h:345
@ FC16_HW
Use FC-16 style hardware module.
Definition MD_MAX72xx.h:339
@ PAROLA_HW
Use the Parola style hardware modules.
Definition MD_MAX72xx.h:340
@ DR0CR0RR1_HW
Structured name.
Definition MD_MAX72xx.h:344
@ DR1CR1RR0_HW
Structured name equivalent to PAROLA_HW.
Definition MD_MAX72xx.h:349
@ GENERIC_HW
Use 'generic' style hardware modules commonly available.
Definition MD_MAX72xx.h:338
bool copyR(uint8_t buf, uint8_t rSrc, uint8_t rDest)
Definition MD_MAX72xx_buf.cpp:112
uint8_t getFontHeight(void)
Definition MD_MAX72xx.h:1034
void setShiftDataInCallback(uint8_t(*cb)(uint8_t dev, transformType_t t))
Definition MD_MAX72xx.h:590
bool setRow(uint8_t r, uint8_t value)
Definition MD_MAX72xx.h:755
void update(uint8_t buf)
Definition MD_MAX72xx.h:946
bool _hwRevRows
Definition MD_MAX72xx.h:1068
bool getPoint(uint8_t r, uint16_t c)
Definition MD_MAX72xx_pix.cpp:81
uint8_t getColumn(uint8_t c)
Definition MD_MAX72xx.h:673
void flushBuffer(uint8_t buf)
Definition MD_MAX72xx.cpp:337
bool control(uint8_t dev, controlRequest_t mode, int value)
Definition MD_MAX72xx.cpp:272
bool transform(transformType_t ttype)
Definition MD_MAX72xx.h:787
controlValue_t
Definition MD_MAX72xx.h:391
@ OFF
General OFF status request.
Definition MD_MAX72xx.h:392
@ ON
General ON status request.
Definition MD_MAX72xx.h:393
bool _updateEnabled
Definition MD_MAX72xx.h:1086
bool setColumn(uint16_t c, uint8_t value)
Definition MD_MAX72xx.h:721
void loadFontInfo(void)
Definition MD_MAX72xx_font.cpp:52
void setModuleType(moduleType_t mod)
Definition MD_MAX72xx.h:566
bool copyRow(uint8_t buf, uint8_t rSrc, uint8_t rDest)
Definition MD_MAX72xx_buf.cpp:67
fontInfo_t _fontInfo
Definition MD_MAX72xx.h:1109
uint8_t _dataPin
Definition MD_MAX72xx.h:1070
transformType_t
Definition MD_MAX72xx.h:403
@ TFLR
Transform Flip Left to Right.
Definition MD_MAX72xx.h:408
@ TINV
Transform INVert (pixels inverted)
Definition MD_MAX72xx.h:411
@ TRC
Transform Rotate Clockwise 90 degrees.
Definition MD_MAX72xx.h:410
@ TSD
Transform Shift Down one pixel element.
Definition MD_MAX72xx.h:407
@ TSU
Transform Shift Up one pixel element.
Definition MD_MAX72xx.h:406
@ TSL
Transform Shift Left one pixel element.
Definition MD_MAX72xx.h:404
@ TFUD
Transform Flip Up to Down.
Definition MD_MAX72xx.h:409
@ TSR
Transform Shift Right one pixel element.
Definition MD_MAX72xx.h:405
uint8_t bitReverse(uint8_t b)
Definition MD_MAX72xx_buf.cpp:48
fontType_t * _fontData
Definition MD_MAX72xx.h:1108
bool transformBuffer(uint8_t buf, transformType_t ttype)
Definition MD_MAX72xx_buf.cpp:304
DigitalOut _cs
Definition MD_MAX72xx.h:1092
bool _hwRevCols
Definition MD_MAX72xx.h:1067
void controlLibrary(controlRequest_t mode, int value)
Definition MD_MAX72xx.cpp:232
void flushBufferAll(void)
Definition MD_MAX72xx.cpp:292
uint8_t setChar(uint16_t col, uint16_t c)
Definition MD_MAX72xx_font.cpp:188
uint8_t(* _cbShiftDataIn)(uint8_t dev, transformType_t t)
Definition MD_MAX72xx.h:1082
MD_MAX72XX(moduleType_t mod, uint8_t dataPin, uint8_t clkPin, uint8_t csPin, uint8_t numDevices=1)
Definition MD_MAX72xx.cpp:39
bool copyC(uint8_t buf, uint8_t cSrc, uint8_t cDest)
Definition MD_MAX72xx_buf.cpp:75
void control(controlRequest_t mode, int value)
Definition MD_MAX72xx.h:518
SPI _spi
Definition MD_MAX72xx.h:1091
void setShiftDataOutCallback(void(*cb)(uint8_t dev, transformType_t t, uint8_t colData))
Definition MD_MAX72xx.h:614
uint8_t getFontWidth(void)
Definition MD_MAX72xx_font.cpp:101
bool getBuffer(uint16_t col, uint8_t size, uint8_t *pd)
Definition MD_MAX72xx_pix.cpp:52
~MD_MAX72XX()
Definition MD_MAX72xx.cpp:177
Definition MD_MAX72xx.h:1059
uint8_t changed
Definition MD_MAX72xx.h:1061
Definition MD_MAX72xx.h:1098
uint16_t firstASCII
Definition MD_MAX72xx.h:1102
uint16_t lastASCII
Definition MD_MAX72xx.h:1103
uint16_t dataOffset
Definition MD_MAX72xx.h:1104
uint8_t height
Definition MD_MAX72xx.h:1100
uint8_t version
Definition MD_MAX72xx.h:1099
uint8_t widthMax
Definition MD_MAX72xx.h:1101