Du solltest die Eingabe, die Anzeige und die Geschwindigkeitseinstellung
entkoppeln. Alles in einer (1) if-Abfrage zu machen bringt dich früher
oder später an den Rande eines GOTOs...
Ich vermute mal, das Ganze läuft in der Hauptschleife zyklisch ab.
(wenn nicht, solltest du den Programmierstil ändern ;-)
1 | :
|
2 | unsigned char leds;
|
3 | :
|
4 | while(1) { // Meine Vermutung
|
5 | :
|
6 | :
|
7 | // GESCHWINDIGKEIT
|
8 | if( get_key_press( 1<<KEY0 )) {
|
9 | speed=speed+1;
|
10 | led_speed=led_speed+1;
|
11 | if(led_speed==4) led_speed=0; // Überlauf --> zurücksetzen
|
12 | if(led_speed==1) {
|
13 | KEY_PORT = 0x1F;
|
14 | speed=1;
|
15 | // ANZEIGE 1 //
|
16 | ANZEIGE_PORT = 0x00;
|
17 | ANZEIGE_PORT ^= 1<<b;
|
18 | ANZEIGE_PORT ^= 1<<c;
|
19 | }
|
20 | if(led_speed==2) {
|
21 | KEY_PORT = 0x1F;
|
22 | // ANZEIGE 2 //
|
23 | ANZEIGE_PORT = 0x00;
|
24 | ANZEIGE_PORT ^= 1<<a;
|
25 | ANZEIGE_PORT ^= 1<<b;
|
26 | KEY_PORT ^= 1<<g;
|
27 | ANZEIGE_PORT ^= 1<<e;
|
28 | ANZEIGE_PORT ^= 1<<d;
|
29 | }
|
30 | if(led_speed==3) {
|
31 | KEY_PORT = 0x1F;
|
32 | // ANZEIGE 3 //
|
33 | ANZEIGE_PORT = 0x00;
|
34 | ANZEIGE_PORT ^= 1<<a;
|
35 | ANZEIGE_PORT ^= 1<<b;
|
36 | KEY_PORT ^= 1<<g;
|
37 | ANZEIGE_PORT ^= 1<<c;
|
38 | ANZEIGE_PORT ^= 1<<d;
|
39 | }
|
40 | }
|
41 |
|
42 | //LANGSAMER VORLAUF
|
43 | if (bit_is_clear (PIND, PD1)) { // vermutlich die Vorlauf-Taste
|
44 | OCR1A = 1800;
|
45 | _delay_ms(10); // AUA, nicht in der Haupt-Schleife
|
46 | OCR1A = 1600;
|
47 | }
|
48 |
|
49 | // LEDs ansteuern
|
50 | leds = 0; // Variable manipulieren
|
51 | if (led_speed==1) leds |= 1<<LED0;
|
52 | if (bit_is_clear (PIND, PD1) || led_speed==2) leds |= 1<<LED1;
|
53 | if (led_speed==3) leds |= 1<<LED2;
|
54 | LED_PORT = ~leds; // nach Berechnung auf Port schreiben
|
55 | :
|
56 | :
|
57 | } // ende while(1)
|
58 | :
|
Warum schreibst du eigentlich überall xxx_PORT, da bricht mir ja das
Augenlicht...
BTW:
speed und led_speed scheinen mir irgendwie ähnlich...
Fazit: eigentlich willst ud die Geschwindigkeit einstellen. Punkt.
Und später irgendwie irgendwo anzeigen. Dann schreib das Programm so,
dass die Geschwindigkeiteinstellung klappt (vermutlich speed) und leite
die Anzeige daraus ab.