Alle Pixeln eines LED-Displays löschen

#1557432
Lesenswert?

Wie lösch ich am einfachsten alle Pixeln eines 12x10 LED Displays?

Ich hätte mir das so gedacht:
1
        for (xclear=0;xclear<WIDTH;xclear++)
2
        {
3
          for (yclear=0;yclear<HEIGHT;yclear++)
4
          {
5
            ClearPixel(xclear,yclear);
6
          }
7
          ClearPixel(xclear,yclear);
8
        }
Aber da komme ich ja immer nur bis Zur 10ten Zeile.
#1557471
Lesenswert?

LED!
Das heißt mein "Display" besteht aus stinknormalen LED's.
1
#define WIDTH 12 /* Breite des Displays */
2
#define HEIGHT 10 /* Höhe des Displays */
3

4
#define ClearPixel(x,y) leds[y]&=~(1<<x) /* Makro: Ein "Pixel" löschen */
5

6
  uint8_t xclear;
7
  uint8_t yclear;
8

9
        for (xclear=0;xclear<WIDTH;xclear++)
10
        {
11
          for (yclear=0;yclear<HEIGHT;yclear++)
12
          {
13
            ClearPixel(xclear,yclear);
14
          }
15
          ClearPixel(xclear,yclear);
16
        }

>Dein Display hat doch nur 10 Zeilen
Stimmt auch wieder. Mein Fehler. Ich meinte natürlich:
Die Schleife läuft nur bis Spalte Nr. 10

Die letzten beiden Pixelreihen bleiben immer übrig.
Gast #1557551
Lesenswert?

Nils S. schrieb:

>> memset(&leds, 0, sizeof(leds));
> Dazu muss aber der "Inhalt" des Displays an die Speicherstelle &leds
> gemappt sein.

Genauso, wie für das Makro, das Manfred W. in seinem Code benutzt.

Manfred W. schrieb:

>> memset(&leds, 0, sizeof(leds));
>
> Als definition, oder wie genau?

Definition? Das ist ein Funktionsaufruf.
#1557594
Lesenswert?

bix schrieb:
> Manfred W. schrieb:
>> ClearPixel(xclear,yclear);
>
> Kann es sein, dass Du ClearPixel zwei Parameter übergibst aber intern
> nur einen Parameter für beide Richtungen benutzt?
>
> Zeig doch mal den Code von ClearPixel.

hat er doch schon.
das ist ein Makro, was ein bit in einem Array aus (hoffentlich) 
wenigstens 16bit ints löscht.

die genaue definition von leds würde mich aber auch interessieren.

prinzipiell würde ich _mb aber zustimmen.
memset ist wahrscheinlich am effizeintesten.

Andererseits sehe ich auch keinen grund, warum der Code nicht 
funktionieren sollte.
Das einzige, was ich mir vorstellen könnte, ist, das leds nicht Zeilen, 
sondern Spalten enthält
#1557596
Lesenswert?

Manfred W. schrieb:
> Michael Buesch schrieb:
>> Also ich wuerde es einfach so machen:
>>
>>
>>
>> memset(&leds, 0, sizeof(leds));
>
> Als definition, oder wie genau?


??

memset(leds, 0, sizeof(leds)) setzt alle bits in deinem "leds" array auf 
0.
Das willst du doch, oder? Zumindest interpretiere ich so dein clearpixel 
macro. Also einfach anstatt der zwei for-loops ein memset aufrufen.
#1557607
Lesenswert?

Vlad Tepesch schrieb:
> Das einzige, was ich mir vorstellen könnte, ist, das leds nicht Zeilen,
> sondern Spalten enthält


bingo,
dann ist dein Makro aber auch falsch definiert (Parameter-bezeichenr 
vertauscht).
hättest du von anfang an die definition von ClearPixel und leds gegeben, 
wär das ganze schneller gegangen.


aber warum jedes bit einzeln löschen?
1
for (xclear=0;xclear<WIDTH;xclear++)
2
{
3
  leds[xclear] = 0;
4
}

schleifen rückwärts zählen ist auch effizenter.
(kA, ob der kompiler das in diesem Fall automatisch drehen würde, glaube 
nicht)
1
xclear = WIDTH;
2
while(xclear){
3
  --xclear;
4
  leds[xclear] = 0;
5
}
#1557719
Lesenswert?

Manfred W. schrieb:
> Ich habs jetzt testweise mal verdreht:
>
>
1
>         for (yclear=0;yclear<HEIGHT;yclear++)
2
>             {
3
>               for (xclear=0;xclear<WIDTH;xclear++)
4
>               {
5
>                 ClearPixel(yclear,xclear);
6
>               }
7
>             }
8
>
> Ich bilde mir ein es funktioniert so.
> Zumindest macht es das was es soll.

OK, dann hasst du vorher auch nur die falschen Parameter an ClearPixel 
übergeben.
Eigentlich sollte es egal sein ob Zeilen- oder Spaltenweise das Display 
löscht.

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