//----------header--------------
template<unsigned int m_devices>
class MAX7219
{
int m_cs,m_clk,m_data;
char dataset[8 * m_devices];
void setupDevices();
void writeCmd(uint8_t cmd_byte, uint8_t data_byte);
void SPI_send(uint8_t data);
public:
MAX7219(int cs_pin,int clk_pin,int data_pin);
void setIntensity(uint8_t intensity);
void transferData();
void setMatrix(int device, char data[8]);
void setRow(int device, int row, char data);
void setLed(int x,int y,bool b);
};
// ----------~~CPP FILE~~----------------
//#include "MAX7219.h"
template<unsigned int m_devices>
void MAX7219<m_devices>::SPI_send(uint8_t data)
{
uint8_t i;
for(i=0; i<8; i++)
{
digitalWrite(m_clk, LOW); //CLK low pulse
//----------------------------------------------------------
if(data & 0x80) digitalWrite(m_data, HIGH); //o/p high if MSB = 1
else digitalWrite(m_data, LOW); //o/p low if MSB = 0
//----------------------------------------------------------
digitalWrite(m_clk, HIGH); //CLK high pulse
data = data << 1; //shift data left one bit
}
}
template <unsigned int m_devices>
void MAX7219<m_devices>::writeCmd(uint8_t cmd_byte,uint8_t data_byte)
{
digitalWrite(m_cs, LOW); //CS low pulse to enable MAX7219
//---------------------------------------------------------
SPI_send(cmd_byte); //send command byte to MAX7219
SPI_send(data_byte); //send data byte to MAX7219
//----------------------------------------------------------
digitalWrite(m_cs, HIGH); //CS high pulse to disable MAX7219
}
template <unsigned int m_devices>
void MAX7219<m_devices>::setupDevices()
{
/* for(int i = m_devices-1 ; i>=0; i--)
{
for(int j = 0; j<8;j++)
{
digitalWrite(m_clk, LOW);//decode
SPI_send(0x09);
SPI_send(0xFF);
for(int k = 0;k<(m_devices-i-1)*2;k++)SPI_send(0); //selects a device
digitalWrite(m_clk, HIGH);
digitalWrite(m_clk, LOW);//intensity
SPI_send(0x0A);
SPI_send(0x0F);
for(int k = 0;k<(m_devices-i-1)*2;k++)SPI_send(0); //selects a device
digitalWrite(m_clk, HIGH);
digitalWrite(m_clk, LOW);//refresh
SPI_send(0x0B);
SPI_send(0x07);
for(int k = 0;k<(m_devices-i-1)*2;k++)SPI_send(0); //selects a device
digitalWrite(m_clk, HIGH);
digitalWrite(m_clk, LOW);//turn off test
SPI_send(0x0F);
SPI_send(0x00);
for(int k = 0;k<(m_devices-i-1)*2;k++)SPI_send(0); //selects a device
digitalWrite(m_clk, HIGH);
}
}*/
writeCmd(0x09, 0); //decoding mode OFF
writeCmd(0x0A, 0x07); //light intensity (0-15)
writeCmd(0x0B, 7); //scan limit: all digits ON
writeCmd(0x0C, 1); //turn ON MAX7219
}
template <unsigned int m_devices>
MAX7219<m_devices>::MAX7219(int cs_pin,int clk_pin,int data_pin)
{
m_cs = cs_pin;
m_clk = clk_pin;
m_data = data_pin;
pinMode(m_cs, OUTPUT);
pinMode(m_clk, OUTPUT);
pinMode(m_data, OUTPUT);
digitalWrite(m_cs, HIGH);
digitalWrite(m_clk, LOW);
memset(dataset,0x00,8*m_devices);
setupDevices();
}
template <unsigned int m_devices>
void MAX7219<m_devices>::setIntensity(uint8_t intensity)
{
digitalWrite(m_clk, LOW);
SPI_send(0x0A);
SPI_send(intensity);
digitalWrite(m_clk, HIGH);
}
template <unsigned int m_devices>
void MAX7219<m_devices>::transferData()
{
for(int i = m_devices-1 ; i>=0; i--)
{
for(int j = 0; j<8;j++)
{
digitalWrite(m_cs, LOW);
SPI_send(j+1);//address
SPI_send(dataset[i*8 + j]);//data
for(int k = 0;k<(m_devices-i-1)*2;k++)SPI_send(0); //selects a device
digitalWrite(m_cs, HIGH);
}
}
}
template <unsigned int m_devices>
void MAX7219<m_devices>::setMatrix(int device, char data[8])
{
memcpy(dataset + (device * 8), data, 8);
}
template <unsigned int m_devices>
void MAX7219<m_devices>::setRow(int device, int row, char data)
{
dataset[(device*8) + row] = data;
}
template <unsigned int m_devices>
void MAX7219<m_devices>::setLed(int x,int y,bool b)
{
if(b)
dataset[y+((x/8)*8)] |= b<<((x%8)+1);
else
dataset[y+((x/8)*8)] &= ~(b<<((x%8)+1));
}
//----------------------.ino----------------------
#define CS_PIN 10
#define CLK_PIN 11
#define DATA_PIN 12
MAX7219<2> m(CS_PIN,CLK_PIN,DATA_PIN);
void setup() {
Serial.begin(9600);
m.setIntensity(0x03);
}
void test_1()
{
char data[8];
memset(data,0xff,8);
char data2[] = {0x0f, 0xf0, 0xaa, 0xbb, 0xcc, 0xdd, 0x01, 0x03};
m.setMatrix(0, data);
m.setMatrix(1, data2);
m.setMatrix(2, data);
m.setMatrix(3, data);
m.setMatrix(4, data);
m.setMatrix(5, data);
m.setMatrix(6, data2);
m.setMatrix(7, data);
m.transferData();
}
void test_2()
{
m.setLed(7,0,1);
m.setLed(8,0,1);
m.transferData();
}
void test_3()
{
static int i = 1;
static bool negative = false;
m.setLed(i,0,1);
m.setLed(i-1,0,0);
if(negative)i--;
else i++;
if(i == 31 || i == 0)negative=!negative;
delay(100);
m.transferData();
}
void test_4()
{
static int i = 1;
static bool negative = false;
m.setRow(i/8,0,1<<(i%8));
i++;
delay(100);
m.transferData();
}
void test_5()
{
static char c1[] = {0xff,0xc3,0xa5,0x99,0x99,0xa5,0xc3,0xff};
//static char c2[] = {0x66,0x66,0x66,0x7e,0x7e,0x66,0x66,0x66};//2424243c04040404
//static char c3[] = {0x04,0x04,0x04,0x04,0x3c,0x00,0x00,0x00};//040404043c000000
//
static char e[8];
memset(e,0x0,8);
m.setMatrix(0,c1);
m.transferData();
delay(1000);
m.setMatrix(0,e);
//m.setMatrix(1,c2);
//m.setMatrix(2,c3);
m.transferData();
delay(1000);
}
void loop() {
//test_1();
//test_2();
//test_3();
test_4();
//test_5();
}