Unterprogramme automatischer Aufruf nach dem Hochzählen

Gast #3948314
Lesenswert?

Hallo,

so nun zu meiner Frage. Ich habe 27 LED´s die über 12Bit angesteuert 
werden (8 Bit PORTA, 4 LOWBit PORTB). Da ich für jede LED PORTA und 
PORTB definieren muss, habe ich diese in ein Unterprogramm 
ausgegliedert:
1
void LED1( void )
2
{
3
  PORTA=0x01;
4
  PORTB=0x0c;
5
}
6
void LED2()
7
{
8
  PORTA=0x02;
9
  PORTB=0x0c;
10
}
11
void LED3()
12
{
13
  PORTA=0x04;
14
  PORTB=0x0c;
15
}
16
void LED4()
17
{
18
  PORTA=0x08;
19
  PORTB=0x0c;
20
}
21
void LED5()
22
{
23
  PORTA=0x10;
24
  PORTB=0x0c;
25
}
26
void LED6()
27
{
28
  PORTA=0x20;
29
  PORTB=0x0c;
30
}
31
void LED7()
32
{
33
  PORTA=0x40;
34
  PORTB=0x0c;
35
}
36
.
37
.
38
.
39
.
40
.

Nun wäre es bei einem Lauflicht zum Programmieren total einfach, wenn 
ich die in einem weiteren Unterprogramm einfach dann die Methode LEDX 
mit der entsprechenden Zahl aufrufen kann, die dann immer hochgezählt 
wird.
Hier nur ein unfertiger Ausschnitt:
1
void Lauflicht()
2
{
3
  LEDX(); 
4
  X++;
5
  _delay_ms(10);
6
}
Also das X soll sich immer ändern und die entsprechende LED aufrufen.

Ist der Ansatz überhaupt verfolgbar? In meinem C Buch habe ich dies 
nicht gefunden oder konnte es nicht zuordnen. Welche Möglichkeiten gibt 
es noch dies elegant und Profihaft zu lösen?

Vielen Dank im Voraus für alle konstruktiven Beiträge!
#3948322
Lesenswert?

Lies mal in deinem C-Buch das Kapitel über Arrays.
Du könntest jetzt die Funktionszeiger in ein solches packen, und dann 
per Index aufrufen.

Einfacher ist es allerdings, die Funktionen wegzulassen, und statt 
dessen die Werte für PortA und PortB in zwei Arrays zu speichern (oder 
ein Array mit structs), und dann auf die Werte per Index zugreifen.

Oliver
Gast #3948323
Lesenswert?

Lieber TO,

ich bedaure Dir mitteilen zu müssen, dass keine konstruktiven Beiträge 
möglich sind, die nicht auch als potentiell beleidigend aufgefasst 
werden können - es sei denn Du bist unter 12 Jahre alt.

Um ganz sicher zu gehen, teile bitte mit, welche Art von "konstruktiven 
Beitrag" Du genau wünschst.
#3948475
Lesenswert?

Der Trick ist, zu erkennen, worin sich Dein Wust an Funktionen 
unterscheidet.
Und schwups ist nur noch eine einzige Funktion mit Argument:
1
void set_led( uint8_t n )
2
{
3
  uint16_t mask;
4

5
  mask = 1<<n;           // convert number to bit mask
6
  PORTA = mask;          // low byte
7
  PORTB = mask>>8;       // high byte
8
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren