SSD1306 Oled

  • 1
  • 2
  • 3
  • 4
  • Page 3 of 4
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 59
Posts: 957
Registered: 09 / 2007
Subject:

Re: SSD1306 Oled

 · 
Posted: 24.05.2015 - 21:24  ·  #17
Quote
Aber per PN, nicht hier, nicht das die anderen vor lachen vom Stuhl fallen


Hallo TheBeginner,
die kochen alle nur mit Wasser hier.
Und privater Entwicklungscode sieht bei den meisten nicht schön aus.

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

Re: SSD1306 Oled

 · 
Posted: 24.05.2015 - 21:41  ·  #18
Hallo miparo,
na ja ok, dann werde ich morgen früh mal zeigen was ich so Programmiert habe, vllt
schaut der eine oder andere, oder auch du mal drüber und man könnte das noch
verfeinern. oder ?



Gruß Frank
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 59
Posts: 957
Registered: 09 / 2007
Subject:

Re: SSD1306 Oled

 · 
Posted: 24.05.2015 - 22:22  ·  #19
Hallo TheBeginner,
da wird sich der nächste bestimmt darüber freuen.

miparo
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: SSD1306 Oled

 · 
Posted: 24.05.2015 - 22:59  ·  #20
Hi,

"schön" programmiert ist ohnehin ein zwei- (oder eher drei-) schneidiges Schwert
und bei Mikros oft ein Luxus, den man sich gar nicht erlauben kann.
Optimierung der Laufzeit, des ROM/RAM Verbrauchs und der Übersichtlichkeit
vom Quellprogramm widersprechen sich nämlich.

Ich hatte schon den Fall, wo gleiche Routinen für mehrere gleichartige Devices
tatsächlich n Mal vorhanden sein mussten, da die Adressierung einer einzigen
Routine mit Pointern so viel längere Laufzeit brauchte, dass das Sytem nicht
mehr funktionierte. Erst ein Blick in den ASM Code offenbarte dann den
immensen Overhead durch die dann notwendige Pointer-DeReferenzierung ==>
sah in der Source viel übersichtlicher aus und brauchte auch weniger ROM
aber konnte nicht mehr funktionieren.

Gruß
Gunter
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 59
Posts: 957
Registered: 09 / 2007
Subject:

Re: SSD1306 Oled

 · 
Posted: 24.05.2015 - 23:06  ·  #21
So ist es.
Und wer dann noch Schick ausehen lassen will , der benutzt den Beauti Button im PED :)
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 756
Registered: 06 / 2013
Subject:

Re: SSD1306 Oled

 · 
Posted: 25.05.2015 - 06:17  ·  #22
Guten morgen, na dann will ich mal zeigen wie ich das OLed 128x64 unter einen
AtMega8 zum laufen gebracht habe.


Als erstes erstmal die Const, zeige aber nur ein teil, sonst wird das posting zu lang.
Das ! brauche ich nicht und habe mit da ein Ohmzeichen einprogrammier.

Code

Const :
myarry : array[32..122,1..6] of byte =
   (($00, $00, $00, $00, $00, $00) , // " " $20       
    ($16, $19, $01, $19, $16, $00) , // !   $21       // Hier ist mein Ohmzeichen
usw.
    ($3e, $51, $49, $45, $3e, $00) , // 0   $30       6
    ($00, $42, $7f, $40, $00, $00) , // 1   $31       17---
    ($42, $61, $51, $49, $46, $00) , // 2   $32       8
usw
     ($7e, $11, $11, $11, $7e, $00) , // A   $41     
     ($7f, $49, $49, $49, $36, $00) , // B   $42
     ($3e, $41, $41, $41, $22, $00) , // C   $43
usw
     ($7e, $11, $11, $11, $7e, $00) , // A   $41      33----
     ($7f, $49, $49, $49, $36, $00) , // B   $42
     ($3e, $41, $41, $41, $22, $00) , // C   $43
usw



Hier meine Init die ich aus dem Internet habe. (Zusammen gesucht habe)

Code

//------------------------------------------------------------------------------
//  Sende Command Oled
//------------------------------------------------------------------------------
Procedure ssd1306_command(cmd1 : byte);
Begin
   I2Cout($3C,$80,cmd1);
end ssd1306_command;

//------------------------------------------------------------------------------
// Sende Data Oled
//------------------------------------------------------------------------------
Procedure ssd1306_data(cmd1 : byte);
Begin
   I2Cout($3C,$40,cmd1);
end ssd1306_data;


//------------------------------------------------------------------------------
// // 0111100 = $3C   I2C Adresse
//------------------------------------------------------------------------------
Procedure Init_OLED;
var x : byte;
Begin
  if I2Cstat($3C) then
// Init sequence for 128x64 OLED module
    ssd1306_command(SSD1306_DISPLAYOFF);                    // 0xAE
    ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV);            // 0xD5
    ssd1306_command($80);                                   // the suggested ratio 0x80
// Multiplex Ratio
    ssd1306_command(SSD1306_SETMULTIPLEX);                  // 0xA8
    ssd1306_command($3F);                                   // alt 3F
// Display Offset
    ssd1306_command(SSD1306_SETDISPLAYOFFSET);              // 0xD3
    ssd1306_command($0);                                    // no offset
//Display Startline
    ssd1306_command(SSD1306_SETSTARTLINE);                  // $40
// Set Charge Pump
    ssd1306_command(SSD1306_CHARGEPUMP);                    // 0x8D
    ssd1306_command($14);
// Re-map
    ssd1306_command(SSD1306_SEGREMAP);                      // A1
// COM Output Scan Direction
    ssd1306_command(SSD1306_COMSCANDEC);                    // C8

// COM Pins Hardware Configuration
    ssd1306_command(SSD1306_SETCOMPINS);                    // 0xDA
    ssd1306_command($12);
// Contrast Control Register
    ssd1306_command(SSD1306_SETCONTRAST);                   // 0x81 Contrast
    ssd1306_command($CF);
// Set Pre Charge Period
    ssd1306_command(SSD1306_SETPRECHARGE);                  // 0xd9
    ssd1306_command($F1);                                   // alt 22 // $22 - External, $F1 - Internal
// Set VCOMH Deselect level
    ssd1306_command(SSD1306_SETVCOMDETECT);                 // 0xDB
    ssd1306_command($40);                                   // $40 $20
// Display OFF
    ssd1306_command(SSD1306_DISPLAYALLON_RESUME);           // 0xA4
    ssd1306_command(SSD1306_NORMALDISPLAY);                 // 0xA6
//--turn on oled panel
    ssd1306_command(SSD1306_DISPLAYON);                     // 0xAF
endif;
end Init_OLED;



Code


//------------------------------------------------------------------------------
// Setze Oled Adresse
//------------------------------------------------------------------------------
Procedure SetAddress(page, lowerAddr,  higherAddr : Byte);
Begin
   ssd1306_command(page);
   ssd1306_command(lowerAddr);
   ssd1306_command(higherAddr);
End SetAddress;

//------------------------------------------------------------------------------
// Function: ClearDisplay()
//------------------------------------------------------------------------------
Procedure ClearDisplay(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 ClearDisplay;


//------------------------------------------------------------------------------
// Sende Char an Oled
//------------------------------------------------------------------------------
Procedure oledWriteChar1x(letter : char;   page : Byte;    column : Byte;    invert : Boolean);
var
    lx   :  string[3];
    le   :  byte;
    send :  byte;
    i    :  byte;
Begin
   lx := IntToStr(Ord(letter));
   le:= StrToint(lx);

   for i:= 1 to 6 do
     send:= myarry[le,i];
     ssd1306_data(send);
   endfor;
End oledWriteChar1x;

//------------------------------------------------------------------------------
// Prüfe Ausgabe
//------------------------------------------------------------------------------
Procedure oledString(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;     //Page Adresse B0 = page0   B1 = page1
        x := 0;
        ssd1306_command(page);
        ssd1306_command($00 + (column And $0F));
        ssd1306_command($10 + ((column shr 4)And $0F));
        For x:= 1 to length(text) do
            oledWriteChar1x(text[x], page, i, invert);
        endfor;
    EndIf;
End oledString;




Nach EnableInts; MUSS ein mDelay(350) rein, sonst gehts nicht
Code

{--------------------------------------------------------------}
{ Main Program }
{$IDATA}

begin
  InitPorts;
  EnableInts;
  mDelay(350);           // Das muss so lange sein, sonst gehts nicht.      
  Init_OLED;
  oledString('123ABCabc ' ,2,0,true);



Und wie gesagt, es läuft in ein AtMega 8 und ich habe noch genug Platz für meine
app. Chip ist gerade mal 60% voll mit ein paar anderen Proceduren.


Gruß Frank
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 59
Posts: 957
Registered: 09 / 2007
Subject:

Re: SSD1306 Oled

 · 
Posted: 25.05.2015 - 19:04  ·  #23
Wow
An einem Feiertag um 6:17 Posten :-#

Dein Code sieht doch schlank aus =D>
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 756
Registered: 06 / 2013
Subject:

Re: SSD1306 Oled

 · 
Posted: 25.05.2015 - 19:17  ·  #24
Danke miparo, :angel3:
Hauptsache es geht, der eine oder andere würde es bestimmt besser machen wie ich,
aber na ja was solls.




PS. Frühaufsteher.!


Gruß Frank
  • 1
  • 2
  • 3
  • 4
  • Page 3 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: 15 · Cache Hits: 14   137   151 · Page-Gen-Time: 0.047371s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI