Array umformen

OP #1624102
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!!!
Angehängte Dateien:
#1624161
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
#1624205
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.

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