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