Forum: Projekte & Code [ASM] SSD1306 Grafik Library für OLED Displays


von Steffen H. (avrsteffen)



Lesenswert?

Ich hab es ja schon in einem anderen Thread vorgestellt. Nun dachte ich 
trenne ich es mal von der Text Library zum ssd1306 ab.
Denn hier geht es jetzt um Grafik!

Leider benötigt Grafik einiges an Ressourcen auf einem AVR, aber auch 
anderswo. Vor allem RAM!

Mindestanforderung an RAM des AVR's sind 2kB für diese kleinen 
128x64 Pixel OLED Displays.

Angefangen habe ich mit den Grafik Grundfunktionen wie Pixel setzen, 
Linie zeichnen. Inzwischen gibt es noch einige andere Funktionen mit 
zugehörigen Macros.

In der Grafik SSD1306_GFX.inc stehen folgende Funktionen zur Verfügung:
- oled_set_pixel
- oled_draw_hline
- oled_draw_vline
- oled_draw_line
- oled_draw_rect
- oled_draw_fill_rect
- oled_draw_round_rect
- oled_draw_round_fill_rect
- oled_draw_circle
- oled_draw_fill_circle

NEU dazugekommen:
- oled_draw_Gauge

 auf den
kleinen OLED Displays möglich. Ich habe dazu auch eine Library
geschrieben. Alles in ASM!

Text mit unterschiedlichen Fonts in unterschiedlichen Größen und eben
ein wenig Grafik wie Rechtecke, Linien, Kreise und abgerundete
Rechtecke.

In der Grafik SSD1306_GFX.inc stehen folgende Funktionen zur Verfügung:
- oled_set_pixel
- oled_draw_hline
- oled_draw_vline
- oled_draw_line
- oled_draw_rect
- oled_draw_fill_rect
- oled_draw_round_rect
- oled_draw_round_fill_rect
- oled_draw_circle
- oled_draw_fill_circle

Ach ja, wenn man das T-Flag vor Aufruf der Funktion setzt, dann wird
nicht gezeichnet, sondern das Objekt gelöscht. Und es existieren
auch MAKROS um die Funktionen einfacher aufzurufen, zumindest wenn man
mit festen Werten (Konstanten) für Koordinaten und Längen arbeitet.
Somit kann man dann zum Beispiel eine Linie mit
1
ldi    XL,0   ; Startpunkt X
2
ldi    YL,3   ; Startpunkt Y
3
ldi    XH,10  ; Endpunkt X
4
ldi    YH,20  ; Endpunkt Y
5
rcall  oled_draw_line
oder mit MACRO
1
draw_line   0,3,10,20    ; (Xstart,Ystart,Xende,Yende)
eine Linie zeichnen. Möchte man allerdings eine Linie (oder welches
Objekt auch immer) löschen, setzt man einfach vor dem Funktionsaufruf
das T-Flag.
Beispiel: Löschen eines eines gefüllten Rechtecks mit abgerundeten Ecken
1
set                          ; setze T-Flag
2
draw_rfrect  10,10,30,14,4   ; (Xstart,Ystart,Xweite,Yhoehe,radius)
3
clt                          ; lösche T-Flag wieder
als MACRO

Ausprobieren erwünscht!

Als nächstes soll noch eine Analog Uhr kommen. Und dann geht es an die 
Umsetzung mit SSD1351.

Gruß AVRSteffen

von Steffen H. (avrsteffen)


Angehängte Dateien:

Lesenswert?

Ich hab jetzt mal einen ATmega4809 genommen. Der hat mehr RAM, 6k sogar. 
Dadurch konnte ich noch 2 Layer im RAM hinzufügen und diese nur für 
Grafik verwenden. So gibt es jetzt 2 Grafiklayer und einen Textlayer. 
Durch die beiden Grafiklayer konnt ich das Rundinstrument beschriften 
ohne das mir der Zeiger die Beschriftung löscht und ich die jedes mal 
erneut schreiben muss.

Das Prinzip ist einfach. Ich hab es oben mal dargestellt. So hatte ich 
das vor Jahren auch schon bei der Anzeige meines Eigenbau Speicher 
Oszilloskops gelöst.

Um in Text in den zweiten Grafiklayer zu schreiben muss man vorher 
wieder einmal das T-Flag setzen, um der Funktion "sendChar" die Auswahl 
des Speicherbereichs (Layer) im RAM zu ändern. Somit wird nicht in den 
Textlayer geschrieben.

Steffen

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.