Forum: Projekte & Code Array umformen


von Klmn O. (destroyer)


Angehängte Dateien:

Lesenswert?

Hallo erstmal,
ich hoffe das das Thema im richtigen Bereich eröffnet habe.

ich habe volgenedes array für die Ausgabe.
1
volatile uint8_t anzeige[8] = {
2
  0b00001000,
3
  0b00010100,
4
  0b00100010,
5
  0b01000001,
6
  0b00111110,
7
  0b01000001,
8
  0b01000001,
9
  0b01000001
10
};

jedoch wird das auf dem 8x8 LED Dot Matrix um 90 grad nach rechts 
gedreht angezeigt. (siehe bild)
Leider ist meine platine fast schon fertig, und ich möchte nicht alles 
nochmal löten müssen. (auf dem bild ist die ausgabe auf dem steckbrett 
nachgebildet, damit ich rumexperementieren kann um die anzeige zu 
korrigieren).

Wollte mal fragen ob jemand einen guten lösungsweg kennt, damit ich die 
ausgabe so verdrehen kann, dass es wieder stimmt?

sitze schon seit mehreren stunden dran, komme aber irgendwie nicht 
drauf.
Wäre sehr dankbar für eine hilfe.

DANKE!!!

von Klaus W. (mfgkw)


Lesenswert?

Vielleicht so:
1
#include <stddef.h>
2
#include <stdio.h>
3
#include <stdint.h>
4
5
// dreht die Bits in einem Feld mit 8 uint8_t um 90 Grad gegen den Uhrzeigersinn
6
void drehe_volatile8x8_gegenUZS( volatile uint8_t *anzeige )
7
{
8
  uint8_t anzeige_tmp[8] =
9
    {
10
      0b00000000,
11
      0b00000000,
12
      0b00000000,
13
      0b00000000,
14
      0b00000000,
15
      0b00000000,
16
      0b00000000,
17
      0b00000000
18
    };
19
20
  size_t iDreh;
21
22
  for( iDreh=0; iDreh<8; ++iDreh )
23
  {
24
    size_t  iBit;
25
    // jeweils die rechte Bitspalte aus anzeige[0...7] in
26
    // anzeige_tmp[iDreh] kopieren:
27
    for( iBit=0; iBit<8; ++iBit )
28
    {
29
      anzeige_tmp[iDreh] <<= 1; // bisheriges Ergebnis nach links
30
      anzeige_tmp[iDreh] |= ( anzeige[iBit] & 0b00000001 ); // Bit kopieren
31
      anzeige[iBit] >>= 1; // verbrauchtes Bit rechts rausschieben
32
    }
33
  }
34
35
  // zurueckkopieren
36
  for( iDreh=0; iDreh<8; ++iDreh )
37
  {
38
    anzeige[iDreh] = anzeige_tmp[iDreh];
39
  }
40
41
}
42
43
int main( int nargs, char **args )
44
{
45
  volatile uint8_t anzeige[8] =
46
    {
47
      0b00001000,
48
      0b00010100,
49
      0b00100010,
50
      0b01000001,
51
      0b00111110,
52
      0b01000001,
53
      0b01000001,
54
      0b01000001
55
    };
56
  size_t iDreh;
57
58
  drehe_volatile8x8_gegenUZS( anzeige );
59
60
  for( iDreh=0; iDreh<8; ++iDreh )
61
  {
62
    printf( "0x%02x\n", (unsigned)anzeige[iDreh] );
63
  }
64
65
  return 0;
66
}


HTH
mfgkw

von Klaus W. (mfgkw)


Lesenswert?

PS:
Die Initialisierung von anzeige_tmp[] kann man sich genau genommen
auch sparen, weil sowieso jedes Bit darin irgendwie neu gesetzt wird.

von Klmn O. (destroyer)


Lesenswert?

Vielen Vielen dank Klaus, hat mir sehr geholfen, du hast mein tag 
gerettet :-)

Funktioniert einwandfrei.

von Klaus W. (mfgkw)


Lesenswert?

Bitte.

Der Vollständigkeit halber (weil das hier Codesammlung ist,
und vielleicht jemand mal danach sucht) die andere Richtung:
1
// dreht die Bits in einem Feld mit 8 uint8_t um 90 Grad im Uhrzeigersinn
2
void drehe_volatile8x8_inUZS( volatile uint8_t *anzeige )
3
{
4
  uint8_t anzeige_tmp[8];
5
 
6
  size_t iDreh;
7
8
  for( iDreh=0; iDreh<8; ++iDreh )
9
  {
10
    size_t  iBit;
11
    // jeweils die rechte Bitspalte aus anzeige[0...7] in
12
    // anzeige_tmp[7-iDreh] kopieren:
13
    for( iBit=0; iBit<8; ++iBit )
14
    {
15
      anzeige_tmp[7-iDreh] <<= 1; // bisheriges Ergebnis nach links
16
      anzeige_tmp[7-iDreh] |= ( anzeige[7-iBit] & 0b00000001 ); // Bit kopieren
17
      anzeige[7-iBit] >>= 1; // verbrauchtes Bit rechts rausschieben
18
    }
19
  }
20
21
  // zurueckkopieren
22
  for( iDreh=0; iDreh<8; ++iDreh )
23
  {
24
    anzeige[iDreh] = anzeige_tmp[iDreh];
25
  }
26
27
}

Vielleicht macht es jemand mal etwas einfacher; ich habe
einfach mit 7-... jeweils den Drehsinn geändert und ansonsten
nur kopiert.
Wenn nicht, hat der Optimierer etwas mehr zu tun.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.