Displayansteuerung mit einzelansteuerung der Module mit 1, 2, 3, 4

Dependencies:   mbed

Revision:
0:5dc28ed27b01
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Dec 12 12:33:43 2017 +0000
@@ -0,0 +1,465 @@
+#include "mbed.h"
+#include <string>
+#include <stdio.h>      /* printf, scanf, puts, NULL */
+#include <stdlib.h>     /* srand, rand */
+#include <time.h>       /* time */
+using std::string;
+// p5: DIN, p7: CLK, p8: LOAD/CS
+SPI max72_spi(PA_7, PA_6, PA_5);
+DigitalOut load(D2);
+Serial pc(SERIAL_TX, SERIAL_RX);
+InterruptIn mybutton(USER_BUTTON);
+int maxInUse = 4;    //Anzahl der Benutzen MAX7219 
+
+// define max7219 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
+
+void maxSingle( int reg, int col) {
+//maxSingle is the "easy"  function to use for a
+//single max7219
+    load = LOW;            // begin
+    max72_spi.write(reg);  // specify register
+    max72_spi.write(col);  // put data
+    load = HIGH;           // make sure data is loaded (on rising edge of LOAD/CS)
+}
+
+void maxAll (int reg, 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(int maxNr, int reg, 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, 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 e=1; e<=8; e++) {    // empty registers, turn all LEDs off
+        maxAll(e,0);
+    }
+    maxAll(max7219_reg_intensity, 0x01 & 0x0f);    // the first 0x0f is the value you can set
+    // range: 0x00 to 0x0f
+}
+
+
+
+int getBitValue(int bit)
+{
+    pc.printf("bit = %d\n\r", bit);
+    switch(bit)
+    {
+        case 0: return 1;
+        case 1: return 2;
+        case 2: return 4;
+        case 3: return 8;
+        case 4: return 16;
+        case 5: return 32;
+        case 6: return 64;
+        case 7: return 128;
+    }
+    return 0;
+}
+void interpret(string data, int maxId, int rowId)
+{
+    int value = 0;
+    for(int c=0;c<8;c++)
+    {
+        if(data.substr(c,1) == "+")
+        {
+             value += getBitValue(c);
+              pc.printf("value = %d\n\r",value);
+        }
+    }
+    pc.printf("value = %d\n\r",value);
+    maxOne(maxId, rowId ,value);
+}
+
+int _GameMode1 = 1;
+int _GameMode2 = 2;
+int _GameMode3 = 3;
+int _GameMode4 = 4;
+int _Step1 = 0;
+int _MaxStep1 = 1;
+int _Step2 = 0;
+int _MaxStep2 = 1;
+int _Step3 = 0;
+int _MaxStep3 = 1;
+int _Step4 = 0;
+int _MaxStep4 = 1;
+int _Step5 = 0;
+int _MaxStep5 = 1;
+int _LastGameMode1 = 0;
+int _LastGameMode2 = 0;
+int _LastGameMode3 = 0;
+int _LastGameMode4 = 0;
+
+void Mode1(int index)
+{
+    switch(index)
+    {
+        case 1:
+            if(_LastGameMode1 != 1)
+            {
+                _Step1 = 0;
+                _MaxStep1 = 9;
+                _LastGameMode1 = _GameMode1;
+            }
+            break;
+        case 2:
+            if(_LastGameMode2 != 1)
+            {
+                _Step1 = 0;
+                _MaxStep1 = 9;
+                _LastGameMode2 = _GameMode2;
+            }
+            break;
+        case 3:
+            if(_LastGameMode3 != 1)
+            {
+                _Step1 = 0;
+                _MaxStep1 = 9;
+                _LastGameMode3 = _GameMode3;
+            }
+            break;
+        case 4:
+            if(_LastGameMode4 != 1)
+            {
+                _Step1 = 0;
+                _MaxStep1 = 9;
+                _LastGameMode4 = _GameMode4;
+            }
+            break;
+    }
+    switch(_Step1)
+    {
+        while (_Step1 ==1) {
+        case 0:
+            interpret("--------",index,1);
+            interpret("----+---",index,2);
+            interpret("----+---",index,3);
+            interpret("----+---",index,4);
+            interpret("----+---",index,5);
+            interpret("----+---",index,6);
+            interpret("--------",index,7);
+            interpret("--------",index,8);
+            break;
+        case 1:
+            interpret("--------",index,1);
+            interpret("--------",index,2);
+            interpret("--------",index,3);
+            interpret("--------",index,4);
+            interpret("--------",index,5);
+            interpret("--------",index,6);
+            interpret("--------",index,7);
+            interpret("--------",index,8);
+            break;
+                     
+        }
+    }
+    wait_ms(20);
+}
+void Mode2(int index)
+{
+    switch(index)
+    {
+        case 1:
+            if(_LastGameMode1 != 2)
+            {
+                _Step2 = 0;
+                _MaxStep2 = 9;
+                _LastGameMode1 = _GameMode1;
+            }
+            break;
+        case 2:
+            if(_LastGameMode2 != 2)
+            {
+                _Step2 = 0;
+                _MaxStep2 = 9;
+                _LastGameMode2 = _GameMode2;
+            }
+            break;
+        case 3:
+            if(_LastGameMode3 != 2)
+            {
+                _Step2 = 0;
+                _MaxStep2 = 9;
+                _LastGameMode3 = _GameMode3;
+            }
+            break;
+        case 4:
+            if(_LastGameMode4 != 2)
+            {
+                _Step2 = 0;
+                _MaxStep2 = 9;
+                _LastGameMode4 = _GameMode4;
+            }
+            break;
+    }
+    
+     switch(_Step2)
+    {
+        case 0:
+            interpret("--------",index,1);
+            interpret("-++++++-",index,2);
+            interpret("-+-----",index,3);
+            interpret("-++++++-",index,4);
+            interpret("------+-",index,5);
+            interpret("-++++++-",index,6);
+            interpret("--------",index,7);
+            interpret("--------",index,8);
+            break;
+        case 1:
+            interpret("--------",index,1);
+            interpret("--------",index,2);
+            interpret("--------",index,3);
+            interpret("--------",index,4);
+            interpret("--------",index,5);
+            interpret("--------",index,6);
+            interpret("--------",index,7);
+            interpret("--------",index,8);
+            break;            
+        
+    }
+    wait_ms(5);
+}
+void Mode3(int index)
+{
+    switch(index)
+    {
+        case 1:
+            if(_LastGameMode1 != 3)
+            {
+                _Step3 = 0;
+                _MaxStep3 = 9;
+                _LastGameMode1 = _GameMode1;
+            }
+            break;
+        case 2:
+            if(_LastGameMode2 != 3)
+            {
+                _Step3 = 0;
+                _MaxStep3 = 9;
+                _LastGameMode2 = _GameMode2;
+            }
+            break;
+        case 3:
+            if(_LastGameMode3 != 3)
+            {
+                _Step3 = 0;
+                _MaxStep3 = 9;
+                _LastGameMode3 = _GameMode3;
+            }
+            break;
+        case 4:
+            if(_LastGameMode4 != 3)
+            {
+                _Step3 = 0;
+                _MaxStep3 = 9;
+                _LastGameMode4 = _GameMode4;
+            }
+            break;
+    }
+    
+     switch(_Step3)
+    {
+        case 0:
+            interpret("--------",index,1);
+            interpret("-++++++-",index,2);
+            interpret("------+-",index,3);
+            interpret("-++++++-",index,4);
+            interpret("------+-",index,5);
+            interpret("-++++++-",index,6);
+            interpret("--------",index,7);
+            interpret("--------",index,8);
+            break;
+        case 1:
+            interpret("--------",index,1);
+            interpret("--------",index,2);
+            interpret("--------",index,3);
+            interpret("--------",index,4);
+            interpret("--------",index,5);
+            interpret("--------",index,6);
+            interpret("--------",index,7);
+            interpret("--------",index,8);
+            break;            
+        
+    }
+    wait_ms(5);
+}
+void Mode4(int index)
+{
+    switch(index)
+    {
+        case 1:
+            if(_LastGameMode1 != 4)
+            {
+                _Step4 = 0;
+                _MaxStep4 = 9;
+                _LastGameMode1 = _GameMode1;
+            }
+            break;
+        case 2:
+            if(_LastGameMode2 != 4)
+            {
+                _Step4 = 0;
+                _MaxStep4 = 9;
+                _LastGameMode2 = _GameMode2;
+            }
+            break;
+        case 3:
+            if(_LastGameMode3 != 4)
+            {
+                _Step4 = 0;
+                _MaxStep4 = 9;
+                _LastGameMode3 = _GameMode3;
+            }
+            break;
+        case 4:
+            if(_LastGameMode4 != 4)
+            {
+                _Step4 = 0;
+                _MaxStep4 = 9;
+                _LastGameMode4 = _GameMode4;
+            }
+            break;
+    }
+    switch(_Step4)
+    {
+        case 0:
+            interpret("--------",index,1);
+            interpret("------+-",index,2);
+            interpret("------+-",index,3);
+            interpret("-++++++-",index,4);
+            interpret("-+----+-",index,5);
+            interpret("-+----+-",index,6);
+            interpret("--------",index,7);
+            interpret("--------",index,8);
+            
+            break;
+        
+        case 1:
+            interpret("--------",index,1);
+            interpret("--------",index,2);
+            interpret("--------",index,3);
+            interpret("--------",index,4);
+            interpret("--------",index,5);
+            interpret("--------",index,6);
+            interpret("--------",index,7);
+            interpret("--------",index,8);
+            break;            
+      
+    }
+    wait_ms(5);
+}
+
+
+int MAX_MODE = 4;
+void pressed()
+{
+    _GameMode1++;
+    if(_GameMode1 > MAX_MODE) _GameMode1 = 1;
+    _GameMode2++;
+    if(_GameMode2 > MAX_MODE) _GameMode2 = 1;
+    _GameMode3++;
+    if(_GameMode3 > MAX_MODE) _GameMode3 = 1;
+    _GameMode4++;
+    if(_GameMode4 > MAX_MODE) _GameMode4 = 1;
+}
+
+void DisplayGameMode()
+{
+    switch(_GameMode1)
+    {
+        case 1: Mode1(1); break;
+        case 2: Mode2(1); break;
+        case 3: Mode3(1); break;
+        case 4: Mode4(1); break;
+    }
+    switch(_GameMode2)
+    {
+        case 1: Mode1(2); break;
+        case 2: Mode2(2); break;
+        case 3: Mode3(2); break;
+        case 4: Mode4(2); break;
+    }
+    switch(_GameMode3)
+    {
+        case 1: Mode1(3); break;
+        case 2: Mode2(3); break;
+        case 3: Mode3(3); break;
+        case 4: Mode4(3); break;
+    }
+    switch(_GameMode4)
+    {
+        case 1: Mode1(4); break;
+        case 2: Mode2(4); break;
+        case 3: Mode3(4); break;
+        case 4: Mode4(4); break;
+    }
+    _Step1++;
+    if(_Step1 > _MaxStep1)_Step1 = 0;
+    _Step2++;
+    if(_Step2 > _MaxStep2)_Step2 = 0;
+    _Step3++;
+    if(_Step3 > _MaxStep3)_Step3 = 0;
+    _Step4++;
+    if(_Step4 > _MaxStep4)_Step4 = 0;
+    
+
+}
+int main() {
+    mybutton.fall(&pressed);
+    srand (time(NULL));
+    setup ();
+    while(true){DisplayGameMode();}
+}
\ No newline at end of file