Funktioniert!!
Dependencies: mbed
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 }
Generated on Sun Nov 20 2022 13:51:00 by
1.7.2