HAPO WS22 / Mbed 2 deprecated HAPO_WS22_Labor2_reicht_jetzt

Dependencies:   mbed

Revision:
1:ff198413587f
Parent:
0:94f9242d336c
Child:
2:aa141c404210
--- a/main.cpp	Wed Nov 16 18:49:31 2022 +0000
+++ b/main.cpp	Sun Nov 20 13:31:04 2022 +0000
@@ -26,6 +26,7 @@
 DigitalOut  pinSdo(PA_9);
 DigitalOut  pinSck(PA_8);
 DigitalOut  pinLoad(PB_5);
+DigitalOut  pinBeep(PB_3);
 
 /* ISR */
 Ticker      stTimer;
@@ -87,89 +88,62 @@
 * Description : Timer für Taste S3
 */
 
+byte bDisplayState; /*
+* Description : 
+*/
+const byte enWaitForStart=0x00;
+const byte enRunClock = 0x01;
+const byte enShowResult = 0x02;
+const byte enShowError = 0x03;
+const byte enWaitForRun = 0x04;
+
+
+byte bState; /*
+* Description : 
+*/
+
+byte bTimerDot; /*
+* Description : Zähler für Dots
+*/
+
+byte bHotKey; /*
+* Description : Auswahl der Taste
+*/
+
+byte bDisplayDot; /*
+* Description : 
+*/
+
+byte bMainState; /*
+* Description : Hauptzustand
+*/
+
+byte bBeepTime; /*
+* Description : Tondauer 
+*/
+
+
 word wSerial; /*
 * Description : serielles Ausgaberegister
 */
 
+word wClockTime; /*
+*Description : Timer für verstrichene Zeit
+*/
+
+word wClockShow; /*
+*Description : Timer für verstrichene Zeit
+*/
+
+word wDelayGame; /*
+* Description : Verzögerungstimer
+*/
+
 /* Bitmuster */
 const byte abZiffer[] = {nZiffer0, nZiffer1, nZiffer2, nZiffer3, nZiffer4, nZiffer5, nZiffer6, nZiffer7, nZiffer8, nZiffer9, nZifferA, nZifferB, nZifferC, nZifferD, nZifferE, nZifferF, nZifferOff};
 const byte abBargraph[] = {~Bit0, ~(Bit0|Bit1), ~(Bit0|Bit1|Bit2), ~(Bit0|Bit1|Bit2|Bit3), 0x0f};
 
 
-/* Tastenabfrage */
-void vTasteS1( void ){
-    if(pinS1 == 0){                             /* User-Taste gedrückt */
-        if(bS1Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
-            if(bS1Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
-                //...
-                }
-            if(bS1Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
-                if(bIdx > 0) bIdx--;
-                else bIdx = 16;
-                }
-            bS1Timer++;
-            }
-        }
-    else{                                       /* Taste nicht gedrückt */ 
-        if((bS1Timer >= nTastShort) && (bS1Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
-            if(bIdx < 16) bIdx++;
-            else bIdx = 0;
-            }
-        bS1Timer = 0;
-        }
-    } 
-
-void vTasteS2( void ){
-    if(pinS2 == 0){                             /* User-Taste gedrückt */
-        if(bS2Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
-            if(bS2Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
-                //...
-                }
-            if(bS2Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
-                if(bDigit > 0b00000001) bDigit = bDigit>>1;
-                else bDigit = 0b00001000;
-                }
-            bS2Timer++;
-            }
-        }
-    else{                                       /* Taste nicht gedrückt */ 
-        if((bS2Timer >= nTastShort) && (bS2Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
-            if(bDigit < 0b00001000) bDigit = bDigit<<1;
-            else bDigit = 0b00000001;
-            }
-        bS2Timer = 0;
-        }
-    } 
-
-void vTasteS3( void ){
-    if(pinS3 == 0){                             /* User-Taste gedrückt */
-        if(bS3Timer < nTastLong+1){             /* Abfrage max. bis Taste lange gedrückt */
-            if(bS3Timer == nTastShort){         /* Taste "kurz gedrückt" erkannt */
-                //...
-                }
-            if(bS3Timer == nTastLong){          /* Taste "lange gedrückt" erkannt */ 
-                bBargraph--;
-                }
-            bS3Timer++;
-            }
-        }
-    else{                                       /* Taste nicht gedrückt */ 
-        if((bS3Timer >= nTastShort) && (bS3Timer <= nTastLong)){             /* Taste wurde bereits erkannt */
-            bBargraph++;
-            }
-        bS3Timer = 0;
-        }
-    } 
-
-
-
-void vCheckTasten( void ){
-    vTasteS1();
-    vTasteS2();
-    vTasteS3();
-    }
-
-/* Ausschieben der 16 Bits für die Anzeige */
 void vShiftLoad(word wLoad){
     word wMask = Bit15;
     pinLoad = 0;
@@ -183,15 +157,142 @@
     pinLoad = 1;
     }
 
+
+byte abDisplayMemory[] = {16,16,16,16}; /* alle Segmente aus */
+
+void vDisplayClock( word w )
+{
+    int16 v;
+    abDisplayMemory[0] = 16; /* Aus */
+    v = (byte)(w / 100);
+    abDisplayMemory[1] = v; /* Hunderter */
+    w = w - (v * 100);
+    v = (byte)(w / 10);
+    abDisplayMemory[2] = v; /* Zehner */
+    w = w - (v * 10);
+    abDisplayMemory[3] = (byte)w; /* Einer */
+}
+
+void vSetWaitForStart( void )
+{
+    abDisplayMemory[0] = 16; /* 7-Segment-Display ausschalten */
+    abDisplayMemory[1] = 16;
+    abDisplayMemory[2] = 16;
+    abDisplayMemory[3] = 16;
+    bDisplayState = enWaitForStart;
+    bTimerDot = 0;
+    bDigit = 0;
+}
+
+void vSetRunClock( void )
+{
+    wClockTime = 0;
+    bDigit = 0;
+    abDisplayMemory[0] = 16; /* 7-Segment-Display ausschalten */
+    abDisplayMemory[1] = 0;
+    abDisplayMemory[2] = 0;
+    abDisplayMemory[3] = 0;
+    bDisplayState = enRunClock;
+}
+
+byte bCheckTasten( byte bState )
+{
+    if((pinS1 == 0) || (pinS2 == 0) || (pinS3 == 0)) { /* Tastendruck erkannt */
+        wClockShow = 1200;
+        if((pinS1 == 0) && (bHotKey == 0)) {
+            wDelayGame = 0;
+            bState = enShowResult;
+            bDisplayState = enShowResult;
+        } else if((pinS2 == 0) && (bHotKey == 1)) {
+            wDelayGame = 0;
+            bState = enShowResult;
+            bDisplayState = enShowResult;
+        } else if((pinS3 == 0) && (bHotKey == 2)) {
+            wDelayGame = 0;
+            bState = enShowResult;
+            bDisplayState = enShowResult;
+        } else {
+            wDelayGame = 200;
+            abDisplayMemory[1] = 15;
+            abDisplayMemory[2] = 15;
+            abDisplayMemory[3] = 15;
+            bState = enShowError;
+            bDisplayState = enShowResult;
+            pinBeep = 0;
+        }
+    }
+    return bState;
+}
+
+void vSegmentDigit( void )
+{
+    bDigit++;
+    wSerial = abZiffer[abDisplayMemory[bDigit&0x03]];
+    switch(bDisplayState) {
+        case enWaitForStart:
+            bTimerDot++; /* Zähler für Punktwechsel */
+            if(bTimerDot == 50) {
+                bTimerDot = 0;
+                bDisplayDot = (bDisplayDot + 1) & 0x03;
+            }
+            if(bDisplayDot == (bDigit&0x03)) {
+                wSerial = wSerial & ~nSegH; /* Punktanzeigen */
+            }
+            break;
+        case enRunClock:
+            if((bDigit&0x03) == 0x03){ /* Ablauf von 10 ms */
+                wClockTime++;
+                if(wClockTime > 999) {
+                    wClockTime = 0;
+                }
+                vDisplayClock(wClockTime);
+            }
+            if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */
+                wSerial = wSerial & ~nSegH;
+            }
+            break;
+        case enShowResult:
+            if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */
+                wSerial = wSerial & ~nSegH;
+                }
+            //if((bDigit&0x03) == 0x03){
+                //wClockMehrzweck++;
+                //if(wClockMehrzweck > 1200){
+                    //bDisplayState= enWaitForStart;
+                    //}
+                //}
+            break;
+    }
+    vShiftLoad(((wSerial << 8) & 0xfff0)| (1 << (bDigit&0x03)));
+}
+
+void vBargraph(byte bTaste){
+    switch(bTaste){
+        case 0 :
+            bLedShield =0b1110;
+            break;
+        case 1 :
+            bLedShield =0b1101;
+            break;
+        case 2 :
+            bLedShield =0b1011;
+            break;
+    }
+}
+
 /***************************************************************************
 *   main()
 ***************************************************************************/
 int main() {
     /* Variablen initialisieren */    
-    bIdx = 0;
-    bDigit = 0b00000001;
-    bLedShield = 0x00;
-    while(1) {
+    byte bRandomTaste = 0;
+    word wRandomClock = 0;
+    bMainState = enWaitForStart;
+    bDisplayState = enWaitForStart;
+    pinBeep = 1;
+    vSetWaitForStart();
+    
+    while(1) {        
         bRandomTaste++;
         if(bRandomTaste > 2) bRandomTaste = 0; /* zufällige LED/Taste bestimmen */
         wRandomClock++;
@@ -199,6 +300,7 @@
         switch(bMainState) {
             case enWaitForStart:
                 wDelayGame++;
+                bLedShield =0b1111;
                 if(wDelayGame > 1200) { /* 3 Sekundenminimum */
                     wDelayGame = wRandomClock;
                     bMainState = enWaitForRun;
@@ -210,10 +312,37 @@
                 bMainState = bCheckTasten(enRunClock);
                 break;
             case enWaitForRun:
+                wDelayGame--;
+                if(wDelayGame == 0){
+                    bMainState = enRunClock;
+                    bDisplayState = enRunClock;
+                    bBeepTime = 20;
+                    bHotKey = bRandomTaste;
+                    vBargraph(bRandomTaste);
+                    vSetRunClock();
+                    pinBeep = 0;
+                    }
                 break;
             case enShowResult:
+                wClockShow--;
+                if(wClockShow==0){
+                    bMainState = enWaitForStart;
+                    bDisplayState = enWaitForStart;
+                    vSetWaitForStart();
+                    }
                 break;
             case enShowError:
+                wDelayGame--;
+                if(wDelayGame == 0)pinBeep = 1;
+                wClockShow--;
+                if(wClockShow==0){
+                    bMainState = enWaitForStart;
+                    bDisplayState = enWaitForStart;
+                    vSetWaitForStart();
+                    }
                 break;
         }
+        vSegmentDigit();
+        wait_us(2500);
     }
+}
\ No newline at end of file