Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Diff: main.cpp
- Revision:
- 1:ff198413587f
- Parent:
- 0:94f9242d336c
- Child:
- 2:aa141c404210
diff -r 94f9242d336c -r ff198413587f main.cpp
--- 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