SSD1306 Oled

  • 1
  • 2
  • 3
  • 4
  • Page 1 of 4
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 770
Registered: 06 / 2013
Subject:

SSD1306 Oled

 · 
Posted: 07.05.2015 - 21:06  ·  #1
Da auch ich so langsam von den 16x2 LCD Displays mit {KS0073} weg kommen möchte, habe ich mir
ein Oled bei e..y gekauft.

SSD1306
128 x 64 Pixel. Mit I2C (VCC GND SCL SDA)

nun schlage ich mich die ganze zeit mit dem Display rum, hat jmd von euch, so ein display
schon mal in betrieb genommen ?
golf
Benutzer
Avatar
Gender:
Location: Donauwörth
Age: 71
Posts: 256
Registered: 11 / 2009
Subject:

Re: SSD1306 Oled

 · 
Posted: 08.05.2015 - 07:32  ·  #2
hallo thebeginner,
leider kenn ich das display bzw den controller selbst nicht. jedoch gibt es im internet jede menge beispiele für dessen initialisierung und betrieb. meist halt unter c oder basic. aber man kann da ja doch genügend abschauen.
beiträge, ohne diese näher angeschaut zu haben z.b. unter

http://sfcompiler.co.uk/phpBB3/viewtopic.php?f=5&t=1728
http://sfcompiler.co.uk/phpBB3…31&start=0
https://github.com/adafruit/Adafruit_SSD1306
https://www.kismetwireless.net…/ssd1306.c

ich habe sowas vor jahren mal gemacht mit den 320x240 tfts mit dem ssd1289 oder ähnlichen. die sind allerdings parallel angeschlossen. aber solche dinger gehen für mich einwandfrei gerade mit den atxmegas.

beispiel von gps-normalfrequenz generator mit dem ad9548. die gps-synchronisierten ausgabefrquenzen sind frei einstellbar bis 6 Ghz, bei einsatz des adf 5355 bis 13 Ghz.
Attachments
TFT 320x240 an GPS-Normal
Filename: GPS-Frequenznormale  … x240.jpg
Filesize: 40.49 KB
Title: TFT 320x240 an GPS-Normal
Download counter: 201
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 770
Registered: 06 / 2013
Subject:

Re: SSD1306 Oled

 · 
Posted: 08.05.2015 - 08:53  ·  #3
Danke golf,

dieser erste link ist echt super, den habe ich nicht gefunden.
vieles ist in C geschrieben und das verstehe ich nicht.. :aerger:


Init OLed steht soweit weil das auch geht.-->

Code

Procedure FillDisplay(data : Byte);
var page : Byte;
    col  : Byte;
 begin
    For Page := $B0 To $B8 do
        SetAddress(page, $00 + OFFSET, $10);
        For col := 0 To SCREEN_HOR_SIZE - 1  do
            ssd1306_data(data);
        endfor;
    endfor;
end FillDisplay;








Gruß Frank
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 770
Registered: 06 / 2013
Subject:

Re: SSD1306 Oled

 · 
Posted: 08.05.2015 - 09:12  ·  #4
Damit komme ich nicht klar, vllt kann mir jmd helfen das umzuschreiben.

Original
Code

Public Sub oledWriteChar1x(letter As Byte, page As Byte, column As Byte, invert As Boolean)

    Dim b, i As Byte
    Dim ix   As Word

    ix = (letter - Byte(" ")) * 6       // Adjust character to table that starts at $20
    For i = 0 To 5
        b = _font8x6(ix + i)
        If (invert) Then
            b = Not(b)
        EndIf
        WriteData(b)
    Next
       
End Sub


Public Sub oledPutString(text As String, page As Byte, column As Byte, invert As Boolean = false)

    Dim  i, x As Byte
       
    If ((page>=0) And (page<8)) Then   
        i = column
        page = page + $B0
        x = 0
        While(Byte(text(x))<>0)
            oledWriteChar1x(text(x), page, i, invert)
            Inc(x)
            i = i+6
        Wend
    End If
End Sub




Das was ich schon umgeschrieben habe.
da habe ich Probleme mit
ssd1306_command($10+((column > 4)And $0F));
ix := (letter - Byte(" ")) * 6; // Adjust character to table that starts at $20
Code

Procedure oledWriteChar1x(letter : Byte; page : Byte; column : Byte; invert : Boolean);
Var b, i : Byte;
    ix   : Word;
Begin
   ssd1306_command(page);
   column := column + OFFSET;
   ssd1306_command($00 + (column And $0F));
   ssd1306_command($10+((column > 4)And $0F));
    ix := (letter - Byte(" ")) * 6;       // Adjust character to table that starts at $20
    For i := 0 To 5 do
        b := _font8x6(ix + i)
        If (invert) Then
            b := Not(b):
        EndIf;
        WriteData(b);
    endfor;
End;


Procedure oledPutString(text : String[16]; page : Byte; column : Byte; invert : Boolean);
var  i, x : Byte;
Begin
    If ((page> = 0) And (page < 8)) Then
        i := column;
        page := page + $B0;
        x := 0;
        While(Byte(text(x))<>0)
            oledWriteChar1x(text(x), page, i, invert)
            Inc(x)
            i = i+6
        Wend
    End If
End Sub


Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2135
Registered: 03 / 2003
Subject:

Re: SSD1306 Oled

 · 
Posted: 08.05.2015 - 12:47  ·  #5
Hi Frank,

schau dir mal das Beispiel von dem OLED in Software an. Das ist parallel angeschlossen. Wenn die Initialisierung paßt mußt du nur den Grafikspeicher (eben nicht parallel sondern) via I²C ins Display schieben. Defines an dein Display anpassen (128x64).

..... oder ein anderes Display das mit I²C arbeitet.

Gruss
Harry

PS: In 8h geht's los :)

Im Prinzip so:
Code

  LCDGraphic     = 128, 64, 8;               { x-pix, y-pix, accesswidth }
  LCDgraphMode   = column, iData;            // linear, column, readonly
  DefCharSet     = 'Graphchars.pchr';                         { FileName }
  GViewports     = 1, iData;               { logical ViewPorts, scalings }
  TGraphStr      = 12;                     { Graphic Text String Length  }

Const
  LCDaddr        : byte    = $3C;                // TWI address ANPASSEN !
  LCDctrl        : byte    = $00;                // control type command byte
  LCDdata        : byte    = $40;                // data type command Byte

  STiniParms     : Array[0..6] of Byte =     // ANPASSEN !
                                ($21,  // FunctionSet register, ext reg on
                                       // v   = 0 horizontal addressing
                                       // pd  = 0 set active
                                       // mx  = 0 normal x addressing
                                       // my  = 0 normal y addressing
                                 $09,  // Display config, MSB top,
                                 $12,  // Bias system register
                                       // bs[2:0] = 010 1:65 mux rate
                                 $E0,  // VOP register set Vlcd to ?.?V
                                       // Contrast max. $FF
                                 $20,  // FunctionSet register, ext reg off
                                       // v   = 0 horizontal addressing
                                       // pd  = 0 set active
                                       // mx  = 0 normal x addressing
                                       // my  = 0 normal y addressing
                                 $0C,  // Display control register, normal mode, on
                                 $05); // Vlcd range = high

Procedure GraphInit;
  Begin
    TWIoutC(LCDaddr, LCDctrl, STiniParms);
    TWIoutC(LCDaddr, LCDctrl, $80);
    TWIoutC(LCDaddr, LCDctrl, $40);
    For i:= 0 to (128*8) do
      TWIoutC(LCDaddr, LCDdata, 0);
      EndFor;
    gClrScr(0);
    gDispRefresh;
  End;

{$D-}
UserDevice GraphIOS(cmd : byte; arg : byte);
begin
  if cmd=0
    then
    // set row addr
      TWIoutC(LCDaddr, LCDctrl, $80);     // x-addr <- 0
    // set column address, $40 is the y-addr command
      arg:= 7-arg+$40;                    // row addr 7 -> 0
      TWIoutC(LCDaddr, LCDctrl, arg);     // y-addr <- arg
      ii:=0;                              // reset Y-counter
    else
      If ii<128                            // Ausgabe auf <128 notwendig !
        then                              // 
        // data out                       // 
          TWIoutC(LCDaddr, LCDdata, arg);
          Inc(ii);
        EndIf;
    EndIf;
end;
{$D+}


- STiniParms anpassen mit den Initwerten und das Array entsprechend vergrößern
- Addressen anpassen
- TWIoutC durch dein I2COut ersetzen
golf
Benutzer
Avatar
Gender:
Location: Donauwörth
Age: 71
Posts: 256
Registered: 11 / 2009
Subject:

Re: SSD1306 Oled

 · 
Posted: 08.05.2015 - 12:53  ·  #6
hallo frank,
leider bin ich eher der hardwarebastler und kenn mich mit c oder basic auch nicht aus.
vielleicht sowas:

ssd1306_command($10+((column shr 4)And $0F));
ix := (letter - ord(' ')) * 6; // Adjust character to table that starts at $20

golf
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2135
Registered: 03 / 2003
Subject:

Re: SSD1306 Oled

 · 
Posted: 08.05.2015 - 13:10  ·  #7
Also so sieht das aus (siehe Bild).

Immer ein Byte steht für 8 Pixel. Wenn du dieses Byte in der ersten Page überträgst, werden links oben die roten 8 Pixel behandelt (gesetzt oder nicht). Dein Programm schreibt nacheinander Page0, Page1, Page 2 ...... Page 7.

Mit dem Auto-Daten (siehe frühere PM) werden einfach nacheinander alle 128x8 Byte übertragen (wenn das Init zu dieser Speicherstruktur paßt bzw. so gemacht wurde). Mit einem Mega8 hast du da natürlich keine Chance, da du ja 128x64/8=1024 Byte an RAM schon dafür reservierst. Mega32 oder 644 aufwärts.
Attachments
SSD1306 Oled
Filename: Display128x64.png
Filesize: 211.46 KB
Title:
Download counter: 199
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 770
Registered: 06 / 2013
Subject:

Re: SSD1306 Oled

 · 
Posted: 08.05.2015 - 18:26  ·  #8
Harry morgen bin ich stolzer besitzer eines Atmega 32. :3some:

Ach Harry ist ja im Urlaub und versucht Fische aus dem großen weiten Meer zu fangen. :angel3:
  • 1
  • 2
  • 3
  • 4
  • Page 1 of 4
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 16 · Cache Hits: 15   142   157 · Page-Gen-Time: 0.023369s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI