PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nokia display linien zeichnen



seseb
17.06.2012, 11:32
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)


$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

Thomas E.
20.06.2012, 10:50
Gibt es keinen Befehl für das Setzen von einzelnen Pixel?:confused:

debegr92
20.06.2012, 14:08
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. (http://de.wikipedia.org/wiki/Bresenham-Algorithmus)
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.




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

So Beispielsweise ;-)

seseb
30.06.2012, 10:35
und wie setzt man jetzt einzelne pixel ? so setzt man ja nur den cursor an eine bestimmte stelle...

debegr92
30.06.2012, 13:17
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.


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...

seseb
06.07.2012, 17:04
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

Thomas E.
06.07.2012, 18:25
sei ruhig du hast doch keine ahnung !
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.

debegr92
06.07.2012, 20:33
Erstens: Deine Umschalttaste ist anscheinend kaputt.
Zweitens: Dieser Ton ist nicht angebracht, du bist nicht eimal auf die Ausführungen von debegr92 eingegangen.


Danke Thomas...


Ü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.

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...

seseb
09.07.2012, 06:38
als erstes mal sorry für alles bin am ende

ePyx
09.07.2012, 07:59
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 :




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);
}

seseb
10.07.2012, 20:07
danke kug ich mir an