Gibt es keinen Befehl für das Setzen von einzelnen Pixel?
Hi
ich habe mir ein nokia 3310 display zugelegt, zeichensatz in groß und klein erstellt - Textausgabe klappt wunderbar.
nun möchte ich auch linien zeichnen können.
könnte mir jemand sagen wie das geht? (bascom )
hier mein programm(von mkprojekt.de ) : (textausgabe weggelassen)
Code:$regfile = "m8def.dat" $crystal = 8000000 Config Portb = Output Declare Sub Ukommando(byval Wert As Byte) Declare Sub Udata(byval Wert As Byte) Declare Sub Initialisierung Declare Sub Lcdloeschen Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 Dc Alias Portb.0 Ce Alias Portb.2 Re Alias Portb.1 Re = 0 'Reset Waitus 250 Re = 1 Spiinit 'Initialisierung der SPI-Schnittstelle Initialisierung Lcdloeschen Do Loop Sub Initialisierung Ukommando &H21 'Erweiterter Kommando-Mode Ukommando &HC8 Ukommando &H06 Ukommando &H13 Ukommando &H20 'Wieder in den normalen Kommando-Mode Ukommando &H0C End Sub Sub Lcdloeschen Local I As Word Ukommando &H20 'Normaler Kommando-Mode Ukommando &H0C 'Normaler Bildschirm Ukommando &H80 'setze RAM-Adresse (x) auf 0 Ukommando &H40 'Setze RAM-Adresse (y) auf 0 Dc = 1 'Sicherstellen, dass man im Daten-Mode ist For I = 0 To 503 Udata &H00 Next End Sub '------------------------------------------------------------------------------ Sub Ukommando(byval Wert As Byte) Dc = 0 'in den Kommando-Mode Spiout Wert , 1 Dc = 1 'zurück in den Daten-Mode End Sub Sub Udata(byval Wert As Byte) Dc = 1 'um sicher zu gehen, dass man auch wirklich im Datenmode ist Ce = 0 Spiout Wert , 1 Ce = 1 End Sub
Gibt es keinen Befehl für das Setzen von einzelnen Pixel?
Grüße
Thomas
Also du sagst die Initialisierung und die Ausgabe von Zeichen klappt wunderbar, dann kann der Rest nur noch eine Kleinigkeit sein.
Für die Ausgabe eines Zeichens brauchst du zum einen ja die Adressierung für den Bereich und zum anderen deine Pixel, welche gesetzt werden sollen. Angenommen du schreibst dir ein Unterprogramm welches nur einen Pixel adressiert und setzt diesen dann auch, dann kannst du einen Pixel zeichnen. Diese Funktion sollte vorhanden sein um eine Linie zeichnen zu können. Denn für die Linie (sofern es keine Horizontale oder Vertikale ist) brauchst du den Bresenham-Algorithmus. Diesen findest du schon fix und fertig bei Wikipedia.
Der Algorithmus berechnet immer den Fehleranteil und gibt dir die X- und Y-Koordinate für den nächsten Pixel. Diese Werte übergibst du dann deiner Funktion.
In C ist das ganze natürlich viel einfacher, aber in ASM auch durchaus möglich und evtl. schneller.
So BeispielsweiseCode:Sub LcdSetPixel Ukommando &H20 'Normaler Kommando-Mode Ukommando &H0C 'Normaler Bildschirm Ukommando XWERT 'setze RAM-Adresse (x) auf 0 Ukommando YWERT 'Setze RAM-Adresse (y) auf 0 Dc = 1 'Sicherstellen, dass man im Daten-Mode ist Udata &H00 'Set Pixel End Sub
Geändert von debegr92 (20.06.2012 um 21:36 Uhr) Grund: Code hinzugefügt
und wie setzt man jetzt einzelne pixel ? so setzt man ja nur den cursor an eine bestimmte stelle...
Jetzt erzähl mir nicht, dass du Zeichen ausgeben kannst, aber dafür keine Pixel... Überleg doch mal.
Das kommt meistens dabei raus wenn man sich Code im Internet zusammen sucht, diesen aber nicht durchblickt. Ich mein das kann man ja machen, doch sollte man sich trotzdem mit dem Code beschäftigen, ihn durchblicken, evtl. Kommentare hinterlassen usw...
sei ruhig du hast doch keine ahnung !
auserdem:
das mit der textausgabe hab ich nochmal komplett überarbeitet weil das so n sh** war mit der zeichentabelle
Erstens: Deine Umschalttaste ist anscheinend kaputt.
Zweitens: Dieser Ton ist nicht angebracht, du bist nicht eimal auf die Ausführungen von debegr92 eingegangen.
Übrigens bin ich auch der Meinung, dass du Pixel setzen kannst, wenn du es geschafft hast einen Zeichensatz auszugeben. Zeig uns mal deine überarbeitete Textausgabe, vielleicht bist du damit bereits nah dran und merkst es nicht. Könnte ja sein.
Grüße
Thomas
Danke Thomas...
Naja eigentlich ist es auch so, wenn man ein LCD Programmiert. ZUerst die Initialisierung, dann die Pixel, Farben und dann die Geometrie und der Text. Wenn man einen Text schreibt, dann nimmt man Bitfolgen meist aus einem Array und gibt diese dann aus. Da du das, wie du uns geschrieben hast, schon kannst, wäre dieser Abschnitt des Codes sehr interessant, da wir so dann die Funktionen analysieren können und die Funktion für die Pixel quasie erraten könnten.
Grüße
Dennis
P.S.: Klar hab ich keine Ahnung, kommt nur drauf an von was...
als erstes mal sorry für alles bin am ende
Das ist natürlich doof, wenn du am Ende bist. Selbst wenn du keine einzelnen Pixel setzen kannst, kann man sich auch Zeichen definieren. Auf der von dir angegebenen Seite ist erklärt wie man sich nen Zeichensatz zusammenbaut.
Ist zwar nicht so cool wie Pixel zu zeichnen und spätestens bei Kreisen trifft man da auf Probleme, aber für das Erste würde das funktionieren.
EIDT: ein bisschen Info über das Display nach 30 Sekunden Googeln
http://ladyada.net/products/nokia5110/
In der Lib von Adafruit findet man eine entsprechende C-Funktion :
Code:void Adafruit_PCD8544::drawPixel(int16_t x, int16_t y, uint16_t color) { if ((x < 0) || (x >= LCDWIDTH) || (y < 0) || (y >= LCDHEIGHT)) return; // x is which column if (color) pcd8544_buffer[x+ (y/8)*LCDWIDTH] |= _BV(y%8); else pcd8544_buffer[x+ (y/8)*LCDWIDTH] &= ~_BV(y%8); updateBoundingBox(x,y,x,y); }
Grüße,
Daniel
Lesezeichen