Grzegorz Kaczmarek / Mbed 2 deprecated Max7221

Dependencies:   mbed

Fork of Max7221 by Dwayne Dilbeck

Revision:
0:cb8e1d05a4a7
Child:
1:d8589d1f368c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Aug 05 18:08:30 2013 +0000
@@ -0,0 +1,170 @@
+ #include "mbed.h"
+
+// p5: DIN, p7: CLK, p8: LOAD/CS
+SPI max72_spi(p5, NC, p7);
+DigitalOut load(p8);
+
+int maxInUse = 1;    //change this variable to set how many MAX7219's you'll use
+
+// define max7219/max7221 registers
+#define max7219_reg_noop         0x00
+#define max7219_reg_digit0       0x01
+#define max7219_reg_digit1       0x02
+#define max7219_reg_digit2       0x03
+#define max7219_reg_digit3       0x04
+#define max7219_reg_digit4       0x05
+#define max7219_reg_digit5       0x06
+#define max7219_reg_digit6       0x07
+#define max7219_reg_digit7       0x08
+#define max7219_reg_decodeMode   0x09
+#define max7219_reg_intensity    0x0a
+#define max7219_reg_scanLimit    0x0b
+#define max7219_reg_shutdown     0x0c
+#define max7219_reg_displayTest  0x0f
+
+#define LOW 0
+#define HIGH 1
+#define MHZ 1000000
+unsigned int count;
+
+void maxSingle( unsigned int reg, unsigned int col) {
+//maxSingle is the "easy"  function to use for a
+//single max7219
+
+    load = LOW;            // begin
+
+#ifdef SPI16
+    unsigned int temp;
+    temp=(reg<<8)||col;
+    max72_spi.format(16, 0);
+    max72_spi.write(temp); 
+    max72_spi.format(8, 0);
+#else
+    max72_spi.write(reg);
+    max72_spi.write(col);  // put data
+#endif
+    load = HIGH;           // make sure data is loaded (on rising edge of LOAD/CS)
+}
+
+void maxAll (unsigned int reg, unsigned int col) {    // initialize  all  MAX7219's in the system
+    load = LOW;                    // begin
+    for ( int c=1; c<= maxInUse; c++) {
+        max72_spi.write(reg);  // specify register
+        max72_spi.write(col);  // put data
+    }
+    load = HIGH;
+}
+
+void maxOne(unsigned int maxNr, unsigned int reg, unsigned int col) {
+//maxOne is for adressing different MAX7219's,
+//while having a couple of them cascaded
+    int c = 0;
+    load = LOW;
+
+    for ( c = maxInUse; c > maxNr; c--) {
+        max72_spi.write(0);  // no-op
+        max72_spi.write(0);  // no-op
+    }
+
+    max72_spi.write(reg);  // specify register
+    max72_spi.write(col);  // put data
+
+    for ( c=maxNr-1; c >= 1; c--) {
+        max72_spi.write(0);  // no-op
+        max72_spi.write(0);  // no-op
+    }
+    load = HIGH;
+}
+
+
+void setup () {
+    // initiation of the max 7219
+    // SPI setup: 8 bits, mode 0
+    max72_spi.format(8, 0);
+    
+    // going by the datasheet, min clk is 100ns so theoretically 10MHz should work...
+     max72_spi.frequency(10*MHZ);
+    
+    maxAll(max7219_reg_scanLimit, 0x07);
+    maxAll(max7219_reg_decodeMode, 0xff);  // 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 e=1; e<=8; e++) {    // empty registers, turn all LEDs off
+        maxAll(e,0xf);
+    }
+    maxAll(max7219_reg_intensity, 0x01 & 0x0f);    // the first 0x0f is the value you can set
+    // range: 0x00 to 0x0f
+}
+
+void loop () {
+  
+  
+    //if you use just one MAX7219 it should look like this
+     
+  for (int i=1;i<=8;i++) {
+     if (i<=count && i !=0) 
+        maxSingle(i,i);
+     else 
+       maxSingle(i,0xf);
+   }
+  
+   if (count <8)
+      count=count++;
+   else 
+     count=0;
+      
+     /*
+     maxSingle(1,255);                       //  + - - - - - - -
+     maxSingle(2,255);                       //  - + - - - - - -
+     maxSingle(3,255);                       //  - - + - - - - -
+     maxSingle(4,255);                       //  - - - + - - - -
+     maxSingle(5,255);                      //  - - - - + - - -
+     maxSingle(6,255);                      //  - - - - - + - -
+     maxSingle(7,0);                      //  - - - - - - + -
+     maxSingle(8,0);                     //  - - - - - - - +
+    */
+    //if you use more than one MAX7219, it should look like this
+
+    /*
+    maxAll(1,1);                       //  + - - - - - - -
+    maxAll(2,3);                       //  + + - - - - - -
+    maxAll(3,7);                       //  + + + - - - - -
+    maxAll(4,15);                      //  + + + + - - - -
+    maxAll(5,31);                      //  + + + + + - - -
+    maxAll(6,63);                      //  + + + + + + - -
+    maxAll(7,127);                     //  + + + + + + + -
+    maxAll(8,255);                     //  + + + + + + + +
+    */
+
+    //
+
+    //if you use more then one max7219 the second one should look like this
+
+
+    /*
+    maxOne(2,1,1);                       //  + - - - - - - -
+    maxOne(2,2,2);                       //  - + - - - - - -
+    maxOne(2,3,4);                       //  - - + - - - - -
+    maxOne(2,4,8);                       //  - - - + - - - -
+    maxOne(2,5,16);                      //  - - - - + - - -
+    maxOne(2,6,32);                      //  - - - - - + - -
+    maxOne(2,7,64);                      //  - - - - - - + -
+    maxOne(2,8,128);                     //  - - - - - - - +
+
+    */
+    
+    //
+    
+
+}
+
+int main() {
+    count=1;
+    setup ();
+    while (1) {
+    loop ();
+    wait_ms(1000);
+    }
+    
+    return 0;
+}
\ No newline at end of file