Funktioniert!!

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /***************************************************************************
00002 * Titel        : main.cpp
00003 *
00004 * Description  : Labormodul "HAPOA"
00005 *
00006 * Revision List:
00007   --------------------------------------------------------------------------
00008   Date     | Author          | Change
00009   --------------------------------------------------------------------------
00010   24.10.22 | J. Altenburg    | Ersterstellung
00011   --------------------------------------------------------------------------
00012            |                 |
00013   ---------------------------------------------------------------------------
00014   
00015   Editor List:
00016   --------------------------------------------------------------------------
00017   Date     | Author          | Change
00018   --------------------------------------------------------------------------
00019   20.11.22 |Tobias Zinke     | Labor02
00020   --------------------------------------------------------------------------
00021   20.11.22 |Alexander Pitthan| Labor02
00022   ---------------------------------------------------------------------------
00023 ****************************************************************************/
00024 #include "mbed.h"
00025 #include "cdef.h"
00026 
00027 /* Vereinbarungen zu den Tasteneingängen */
00028 DigitalIn   pinS1(A1);
00029 DigitalIn   pinS2(A2);
00030 DigitalIn   pinS3(A3);
00031 
00032 BusOut      bLedShield(D10, D11, D12, D13);
00033 
00034 /* Anschlüsse der Schieberegister */
00035 DigitalOut  pinSdo(PA_9);
00036 DigitalOut  pinSck(PA_8);
00037 DigitalOut  pinLoad(PB_5);
00038 DigitalOut  pinBeep(PB_3);
00039 
00040 /* ISR */
00041 Ticker      stTimer;
00042 
00043 /***************************************************************************
00044 *   Defines und Makros                                                       *
00045 ***************************************************************************/
00046 #define nTastShort    4     /* Taste 50 Millisekunden gedrückt */    
00047 #define nTastLong   150     /* Taste 1.5 Sekunden gedrückt */ 
00048 
00049 #define nSegA           0x01
00050 #define nSegB           0x02
00051 #define nSegC           0x04
00052 #define nSegD           0x08
00053 #define nSegE           0x10
00054 #define nSegF           0x20
00055 #define nSegG           0x40
00056 #define nSegH           0x80
00057 
00058 #define nZiffer0    ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF)
00059 #define nZiffer1    ~(nSegB | nSegC)
00060 #define nZiffer2    ~(nSegA | nSegB | nSegD | nSegE | nSegG)
00061 #define nZiffer3    ~(nSegA | nSegB | nSegC | nSegD | nSegG)
00062 #define nZiffer4    ~(nSegB | nSegC | nSegF | nSegG)
00063 #define nZiffer5    ~(nSegA | nSegC | nSegD | nSegF | nSegG)
00064 #define nZiffer6    ~(nSegA | nSegC | nSegD | nSegE | nSegF | nSegG)
00065 #define nZiffer7    ~(nSegA | nSegB | nSegC)
00066 #define nZiffer8    ~(nSegA | nSegB | nSegC | nSegD | nSegE | nSegF | nSegG)
00067 #define nZiffer9    ~(nSegA | nSegB | nSegC | nSegD | nSegF | nSegG)
00068 #define nZifferA    ~(nSegA | nSegB | nSegC | nSegE | nSegF | nSegG)
00069 #define nZifferB    ~(nSegC | nSegD | nSegE | nSegF | nSegG)
00070 #define nZifferC    ~(nSegA | nSegD | nSegE | nSegF)
00071 #define nZifferD    ~(nSegB | nSegC | nSegD | nSegE | nSegG)
00072 #define nZifferE    ~(nSegA | nSegD | nSegE | nSegF | nSegG)
00073 #define nZifferF    ~(nSegA | nSegE | nSegF | nSegG)
00074 #define nZifferOff   (nSegA | nSegB | nSegC | nSegD | nSegE | nSegF | nSegG | nSegH)
00075 
00076 byte bIdx; /*
00077 * Description : Index auf Ausgabe
00078 */
00079 
00080 byte bDigit; /*
00081 * Description : aktives Digit
00082 */
00083 
00084 byte bBargraph; /*
00085 * Description : Bargraph durchschalten
00086 */
00087 
00088 byte bS1Timer; /*
00089 * Description : Timer für Taste S1
00090 */
00091 
00092 byte bS2Timer; /*
00093 * Description : Timer für Taste S2
00094 */
00095 
00096 byte bS3Timer; /*
00097 * Description : Timer für Taste S3
00098 */
00099 
00100 byte bDisplayState; /*
00101 * Description : 
00102 */
00103 const byte enWaitForStart=0x00;
00104 const byte enRunClock = 0x01;
00105 const byte enShowResult = 0x02;
00106 const byte enShowError = 0x03;
00107 const byte enWaitForRun = 0x04;
00108 
00109 
00110 byte bState; /*
00111 * Description : 
00112 */
00113 
00114 byte bTimerDot; /*
00115 * Description : Zähler für Dots
00116 */
00117 
00118 byte bHotKey; /*
00119 * Description : Auswahl der Taste
00120 */
00121 
00122 byte bDisplayDot; /*
00123 * Description : 
00124 */
00125 
00126 byte bMainState; /*
00127 * Description : Hauptzustand
00128 */
00129 
00130 byte bBeepTime; /*
00131 * Description : Tondauer 
00132 */
00133 
00134 
00135 word wSerial; /*
00136 * Description : serielles Ausgaberegister
00137 */
00138 
00139 word wClockTime; /*
00140 *Description : Timer für verstrichene Zeit
00141 */
00142 
00143 word wClockShow; /*
00144 *Description : Timer für verstrichene Zeit
00145 */
00146 
00147 word wDelayGame; /*
00148 * Description : Verzögerungstimer
00149 */
00150 
00151 /* Bitmuster */
00152 const byte abZiffer[] = {nZiffer0, nZiffer1, nZiffer2, nZiffer3, nZiffer4, nZiffer5, nZiffer6, nZiffer7, nZiffer8, nZiffer9, nZifferA, nZifferB, nZifferC, nZifferD, nZifferE, nZifferF, nZifferOff};
00153 const byte abBargraph[] = {~Bit0, ~(Bit0|Bit1), ~(Bit0|Bit1|Bit2), ~(Bit0|Bit1|Bit2|Bit3), 0x0f};
00154 
00155 
00156 void vShiftLoad(word wLoad){
00157     word wMask = Bit15;
00158     pinLoad = 0;
00159     while(wMask){
00160         if(wMask & wLoad) pinSdo = 1;
00161         else              pinSdo = 0;
00162         pinSck = 1;
00163         wMask >>= 1;
00164         pinSck = 0;
00165         }    
00166     pinLoad = 1;
00167     }
00168 
00169 
00170 byte abDisplayMemory[] = {16,16,16,16}; /* alle Segmente aus */
00171 
00172 void vDisplayClock( word w )
00173 {
00174     int16 v;
00175     abDisplayMemory[0] = 16; /* Aus */
00176     v = (byte)(w / 100);
00177     abDisplayMemory[1] = v; /* Hunderter */
00178     w = w - (v * 100);
00179     v = (byte)(w / 10);
00180     abDisplayMemory[2] = v; /* Zehner */
00181     w = w - (v * 10);
00182     abDisplayMemory[3] = (byte)w; /* Einer */
00183 }
00184 
00185 void vSetWaitForStart( void )
00186 {
00187     abDisplayMemory[0] = 16; /* 7-Segment-Display ausschalten */
00188     abDisplayMemory[1] = 16;
00189     abDisplayMemory[2] = 16;
00190     abDisplayMemory[3] = 16;
00191     bDisplayState = enWaitForStart;
00192     bTimerDot = 0;
00193     bDigit = 0;
00194 }
00195 
00196 void vSetRunClock( void )
00197 {
00198     wClockTime = 0;
00199     bDigit = 0;
00200     abDisplayMemory[0] = 16; /* 7-Segment-Display ausschalten */
00201     abDisplayMemory[1] = 0;
00202     abDisplayMemory[2] = 0;
00203     abDisplayMemory[3] = 0;
00204     bDisplayState = enRunClock;
00205 }
00206 
00207 byte bCheckTasten( byte bState )
00208 {
00209     if((pinS1 == 0) || (pinS2 == 0) || (pinS3 == 0)) { /* Tastendruck erkannt */
00210         wClockShow = 1200;
00211         if((pinS1 == 0) && (bHotKey == 0)) {
00212             wDelayGame = 0;
00213             bState = enShowResult;
00214             bDisplayState = enShowResult;
00215         } else if((pinS2 == 0) && (bHotKey == 1)) {
00216             wDelayGame = 0;
00217             bState = enShowResult;
00218             bDisplayState = enShowResult;
00219         } else if((pinS3 == 0) && (bHotKey == 2)) {
00220             wDelayGame = 0;
00221             bState = enShowResult;
00222             bDisplayState = enShowResult;
00223         } else {
00224             wDelayGame = 200;
00225             abDisplayMemory[1] = 15;
00226             abDisplayMemory[2] = 15;
00227             abDisplayMemory[3] = 15;
00228             bState = enShowError;
00229             bDisplayState = enShowResult;
00230             pinBeep = 0;
00231         }
00232     }
00233     return bState;
00234 }
00235 
00236 void vSegmentDigit( void )
00237 {
00238     bDigit++;
00239     wSerial = abZiffer[abDisplayMemory[bDigit&0x03]];
00240     switch(bDisplayState) {
00241         case enWaitForStart:
00242             bTimerDot++; /* Zähler für Punktwechsel */
00243             if(bTimerDot == 50) {
00244                 bTimerDot = 0;
00245                 bDisplayDot = (bDisplayDot + 1) & 0x03;
00246             }
00247             if(bDisplayDot == (bDigit&0x03)) {
00248                 wSerial = wSerial & ~nSegH; /* Punktanzeigen */
00249             }
00250             break;
00251         case enRunClock:
00252             if((bDigit&0x03) == 0x03){ /* Ablauf von 10 ms */
00253                 wClockTime++;
00254                 if(wClockTime > 999) {
00255                     wClockTime = 0;
00256                 }
00257                 vDisplayClock(wClockTime);
00258             }
00259             if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */
00260                 wSerial = wSerial & ~nSegH;
00261             }
00262             break;
00263         case enShowResult:
00264             if((bDigit&0x03) == 0x01) { /* Dezimalpunkt setzen */
00265                 wSerial = wSerial & ~nSegH;
00266                 }
00267             break;
00268     }
00269     vShiftLoad(((wSerial << 8) & 0xfff0)| (1 << (bDigit&0x03)));
00270 }
00271 
00272 void vBargraph(byte bTaste){
00273     switch(bTaste){
00274         case 0 :
00275             bLedShield =0b1110;
00276             break;
00277         case 1 :
00278             bLedShield =0b1101;
00279             break;
00280         case 2 :
00281             bLedShield =0b1011;
00282             break;
00283     }
00284 }
00285 
00286 /***************************************************************************
00287 *   main()
00288 ***************************************************************************/
00289 int main() {
00290     /* Variablen initialisieren */    
00291     byte bRandomTaste = 0;
00292     word wRandomClock = 0;
00293     bMainState = enWaitForStart;
00294     bDisplayState = enWaitForStart;
00295     pinBeep = 1;
00296     vSetWaitForStart();
00297     
00298     while(1) {        
00299         bRandomTaste++;
00300         if(bRandomTaste > 2) bRandomTaste = 0; /* zufällige LED/Taste bestimmen */
00301         wRandomClock++;
00302         if(wRandomClock > 800) wRandomClock = 0; /* Zufallszeit erzeugen */
00303         switch(bMainState) {
00304             case enWaitForStart:
00305                 wDelayGame++;
00306                 bLedShield =0b1111;
00307                 if(wDelayGame > 1200) { /* 3 Sekundenminimum */
00308                     wDelayGame = wRandomClock;
00309                     bMainState = enWaitForRun;
00310                 }
00311                 break;
00312             case enRunClock:
00313                 bBeepTime--;
00314                 if(bBeepTime == 0)pinBeep = 1;
00315                 bMainState = bCheckTasten(enRunClock);
00316                 break;
00317             case enWaitForRun:
00318                 wDelayGame--;
00319                 if(wDelayGame == 0){
00320                     bMainState = enRunClock;
00321                     bDisplayState = enRunClock;
00322                     bBeepTime = 20;
00323                     bHotKey = bRandomTaste;
00324                     vBargraph(bRandomTaste);
00325                     vSetRunClock();
00326                     pinBeep = 0;
00327                     }
00328                 break;
00329             case enShowResult:
00330                 wClockShow--;
00331                 if(wClockShow==0){
00332                     bMainState = enWaitForStart;
00333                     bDisplayState = enWaitForStart;
00334                     vSetWaitForStart();
00335                     }
00336                 break;
00337             case enShowError:
00338                 wDelayGame--;
00339                 if(wDelayGame == 0)pinBeep = 1;
00340                 wClockShow--;
00341                 if(wClockShow==0){
00342                     bMainState = enWaitForStart;
00343                     bDisplayState = enWaitForStart;
00344                     wDelayGame = 0;
00345                     vSetWaitForStart();
00346                     }
00347                 break;
00348         }
00349         vSegmentDigit();
00350         wait_us(2500);
00351     }
00352 }