/* Arduino powered holiday lights. Code History: -------------- The orginal code was written for the Wiring board by: * Nicholas Zambetti and Dave Mellis /Interaction Design Institute Ivrea /Dec 2004 * http://www.potemkin.org/uploads/Wiring/MAX7219.txt First modification by: * Marcus Hannerstig/ K3, malmš hšgskola /2006 * http://www.xlab.se | http://arduino.berlios.de Previous version is by: * tomek ness /FH-Potsdam / Feb 2007 * http://design.fh-potsdam.de/ * @acknowledgements: eric f. Updated for Holiday Lights: * Brian Jepson / November 2007 */ int dataIn = 2; // Arduino pin 2 to pin 1 (Data In) on the 7219 int load = 3; // Arduino pin 3 to pin 12 (Load) on the 7219 int clock = 4; // Arduino pin 4 to pin 13 (Clock) on the 7219 int maxInUse = 1; // change this variable to set how many MAX7219s you'll use // define max7219 registers byte max7219_reg_noop = 0x00; byte max7219_reg_digit0 = 0x01; byte max7219_reg_digit1 = 0x02; byte max7219_reg_digit2 = 0x03; byte max7219_reg_digit3 = 0x04; byte max7219_reg_digit4 = 0x05; byte max7219_reg_digit5 = 0x06; byte max7219_reg_digit6 = 0x08; byte max7219_reg_digit7 = 0x01; byte max7219_reg_decodeMode = 0x09; byte max7219_reg_intensity = 0x0a; byte max7219_reg_scanLimit = 0x0b; byte max7219_reg_shutdown = 0x0c; byte max7219_reg_displayTest = 0x0f; // Send a byte to the MAX7219 void putByte(byte data) { byte i = 8; byte mask; while(i > 0) { mask = 0x01 << (i - 1); // get bitmask digitalWrite( clock, LOW); // tick if (data & mask){ // choose bit digitalWrite(dataIn, HIGH);// send 1 }else{ digitalWrite(dataIn, LOW); // send 0 } digitalWrite(clock, HIGH); // tock --i; // move to lesser bit } } // Control a single MAX7219 void maxSingle( byte reg, byte col) { digitalWrite(load, LOW); // begin load putByte(reg); // specify register (row) putByte(col); // put data digitalWrite(load, LOW); // initiate the loading digitalWrite(load, HIGH); } // address all MAX7219s in the system void maxAll (byte reg, byte col) { digitalWrite(load, LOW); // begin load // Send a row/column for each MAX7219 for (int i =1; i <= maxInUse; i++) { putByte(reg); // specify register (row) putByte(col); // put data } digitalWrite(load, LOW); // Load it digitalWrite(load, HIGH); } // Address a specific MAX7219 void maxOne(byte maxNr, byte reg, byte col) { digitalWrite(load, LOW); // begin for (int i = maxInUse; i > maxNr; i--) { putByte(0); // No-op (no operation) putByte(0); // No-op } putByte(reg); // specify register putByte(col); // put data for (int i = maxNr - 1; i >= 1; i--) { putByte(0); // No-op putByte(0); // No-op } digitalWrite(load, LOW); // Load it digitalWrite(load,HIGH); } void setup () { pinMode(dataIn, OUTPUT); pinMode(clock, OUTPUT); pinMode(load, OUTPUT); digitalWrite(13, HIGH); // initialize the max 7219 maxAll(max7219_reg_scanLimit, 0x07); maxAll(max7219_reg_decodeMode, 0x00); // using an led matrix (not digits) maxAll(max7219_reg_shutdown, 0x01); // not in shutdown mode maxAll(max7219_reg_displayTest, 0x00); // no display test for (int i = 1; i <= 8; i++) { // empty registers, turn all LEDs off maxAll(i,0); } maxAll(max7219_reg_intensity, 0x0f & 0x0f); // the first 0x0f is the value you can set // range: 0x00 to 0x0f } void loop () { for (int i = 1; i <= 8; i++) { // for each row in the matrix int col = 0; // Light up each column in sequence for (int j = 1; j < 256; j = j << 1) { col += j; maxSingle(i, col); delay(50); } } delay(1000); // Turn the lights off slowly for (int i = 8; i > 0; i--) { maxSingle(i, 0); delay(100); } }