Texte auf dem OLED SSD 1306 anzeigen

Hier können Sie ihre eigenen Projekte vorstellen
Antworten
Heinrichs
Beiträge: 173
Registriert: Do 21. Okt 2010, 18:31

Texte auf dem OLED SSD 1306 anzeigen

Beitrag von Heinrichs » Di 17. Jan 2017, 13:34

In dem Beitrag Mini-Oszi mit dem OLED SSD 1306 haben wir schon gezeigt, wie man mit unserer Attiny-Platine auf dem OLED1306 Spannungssignale darstellen kann. In diesem Beitrag soll dargestellt werden, wie man mit diesem OLED-Modul Texte anzeigen kann. Zwei Probleme gibt es zu lösen:

1. Das OLED1306 besitzt keinen Zeichengenerator; das bedeutet: Für jedes Zeichen müssen die zugehörigen Bitmuster durch das Programm bereitgestellt werden. Es gibt Programme, mit deren Hilfe solche Bitmuster hergestellt werden können; man findet im Internet allerdings auch schon fertige Datenpakete dafür. Für BASCOM-Programme liegen sie meist in Form von Data-Zeilen vor.

2. Der Mikrocontroller auf unserer Attiny-Platine besitzt nur einen recht kleinen Speicherplatz: 2 kB an Programmspeicher und deutlich weniger RAM bzw. EEPROM. So schafft man es gerade, die Großbuchstaben mitsamt den wichtigen Sonderzeichen unterzubringen; ein bisschen Platz bleibt dann noch übrig, um den Zeichen des Textes die Bitmuster zuzuordnen und auf dem Display anzuzeigen. Dieses Speicherplatzproblem kann man lösen, indem man die Bitmuster der Zeichen in einem externen EEPROM abspeichert. Ich benutze dazu den Baustein AT24C256. Er besitzt eine Speicherkapazität von 256 kBit, also 32 kByte. Der Baustein wird über das I2C-Protokoll angesprochen. Anschlussfertig mit Pull-Up-Widerständen auf eine kleine Platine montiert, bekommt man ihn schon für 1,00 Euro.

Wie bin ich nun vorgegangen? Zunächst habe ich die Bitmuster in das EEPROM geladen. Dazu habe ich folgendes Programm benutzt:

Code: Alles auswählen

' Zeichen-Muster in EEPROM 24C256 ablegen
' Bitmuster und weitere Ideen gehen zurück auf: 
' I. Dobson, Sonal Pinto und Ben Zijlstra & Theo Kleijn

' SCL -> B.7
' SDA -> B.5

'----------------------------------------------------------------------------

$regfile = "attiny2313.dat"                                 'Dadurch wird auch das Pin Layout bestimmt


'**********************************************************
'******************* Deklarationen ************************


Dim Z As Word
Dim Adresse_low As Byte
Dim Adresse_high As Byte
Dim Wert As Byte
Declare Sub Write_eeprom
Dim Write_adresse As Byte
Dim Pause As Byte

'**********************************************************
'****************** Initialisierung ***********************

Ddrb = &B11111111                                           'Port B als Ausgangsport
Ddrd = &B01110000                                           'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111                                          'Eingänge auf high legen

Waitms 50                                                   'warte bis Kondensator bei Ta0 geladen

Write_adresse = 160
Pause = 10

'**********************************************************
'******************** Hauptprogramm ***********************

Portb = 1

For Z = 0 To 767                                            '96 Zeichen à 8 Bit (von asciicode 32 bis 127)
  Wert = Lookup(z , Asciitab)
  Call Write_eeprom
Next Z

Portb = 0

End

'**********************************************************
'******************** Unterprogramme **********************

Sub Write_eeprom
  I2cstart
  I2cwbyte Write_adresse
  Adresse_high = High(z)
  I2cwbyte Adresse_high
  Adresse_low = Low(z)
  I2cwbyte Adresse_low
  I2cwbyte Wert
  I2cstop                                                   'initiiert brennen
  Waitms Pause
End Sub

'**********************************************************
'******************Interruptroutinen***********************



'**********************************************************

Asciitab:
    Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,                     'ASCII-Code 32
    Data 0 , 0 , 6 , 95 , 6 , 0 , 0 , 0,                    'ASCII-Code 33
    Data 0 , 7 , 3 , 0 , 7 , 3 , 0 , 0,                     '...
    Data 0 , 36 , 126 , 36 , 126 , 36 , 0 , 0,
    Data 0 , 36 , 43 , 106 , 18 , 0 , 0 , 0,
    Data 0 , 99 , 19 , 8 , 100 , 99 , 0 , 0,
    Data 0 , 54 , 73 , 86 , 32 , 80 , 0 , 0,
    Data 0 , 0 , 7 , 3 , 0 , 0 , 0 , 0,
    Data 0 , 0 , 62 , 65 , 0 , 0 , 0 , 0,
    Data 0 , 0 , 65 , 62 , 0 , 0 , 0 , 0,
    Data 0 , 8 , 62 , 28 , 62 , 8 , 0 , 0,
    Data 0 , 8 , 8 , 62 , 8 , 8 , 0 , 0,
    Data 0 , 0 , 224 , 96 , 0 , 0 , 0 , 0,
    Data 0 , 8 , 8 , 8 , 8 , 8 , 0 , 0,
    Data 0 , 0 , 96 , 96 , 0 , 0 , 0 , 0,
    Data 0 , 32 , 16 , 8 , 4 , 2 , 0 , 0,
    Data 0 , 62 , 81 , 73 , 69 , 62 , 0 , 0,
    Data 0 , 0 , 66 , 127 , 64 , 0 , 0 , 0,
    Data 0 , 98 , 81 , 73 , 73 , 70 , 0 , 0,
    Data 0 , 34 , 73 , 73 , 73 , 54 , 0 , 0,
    Data 0 , 24 , 20 , 18 , 127 , 16 , 0 , 0,
    Data 0 , 47 , 73 , 73 , 73 , 49 , 0 , 0,
    Data 0 , 60 , 74 , 73 , 73 , 48 , 0 , 0,
    Data 0 , 1 , 113 , 9 , 5 , 3 , 0 , 0,
    Data 0 , 54 , 73 , 73 , 73 , 54 , 0 , 0,
    Data 0 , 6 , 73 , 73 , 41 , 30 , 0 , 0,
    Data 0 , 0 , 108 , 108 , 0 , 0 , 0 , 0,
    Data 0 , 0 , 236 , 108 , 0 , 0 , 0 , 0,
    Data 0 , 8 , 20 , 4 , 65 , 0 , 0 , 0,
    Data 0 , 36 , 36 , 36 , 36 , 36 , 0 , 0,
    Data 0 , 0 , 65 , 34 , 20 , 8 , 0 , 0,
    Data 0 , 2 , 1 , 89 , 9 , 6 , 0 , 0,
    Data 0 , 62 , 65 , 93 , 85 , 30 , 0 , 0,
    Data 0 , 126 , 17 , 17 , 17 , 126 , 0 , 0,
    Data 0 , 127 , 73 , 73 , 73 , 54 , 0 , 0,
    Data 0 , 62 , 65 , 65 , 65 , 34 , 0 , 0,
    Data 0 , 127 , 65 , 65 , 65 , 62 , 0 , 0,
    Data 0 , 127 , 73 , 73 , 73 , 65 , 0 , 0,
    Data 0 , 127 , 9 , 9 , 9 , 1 , 0 , 0,
    Data 0 , 62 , 65 , 73 , 73 , 122 , 0 , 0,
    Data 0 , 127 , 8 , 8 , 8 , 127 , 0 , 0,
    Data 0 , 0 , 65 , 127 , 65 , 0 , 0 , 0,
    Data 0 , 48 , 64 , 64 , 64 , 63 , 0 , 0,
    Data 0 , 127 , 8 , 20 , 34 , 65 , 0 , 0,
    Data 0 , 127 , 64 , 64 , 64 , 64 , 0 , 0,
    Data 0 , 127 , 2 , 4 , 2 , 127 , 0 , 0,
    Data 0 , 127 , 2 , 4 , 8 , 127 , 0 , 0,
    Data 0 , 62 , 65 , 65 , 65 , 62 , 0 , 0,
    Data 0 , 127 , 9 , 9 , 9 , 6 , 0 , 0,
    Data 0 , 62 , 65 , 81 , 33 , 94 , 0 , 0,
    Data 0 , 127 , 9 , 9 , 25 , 102 , 0 , 0,
    Data 0 , 38 , 73 , 73 , 73 , 50 , 0 , 0,
    Data 0 , 1 , 1 , 127 , 1 , 1 , 0 , 0,
    Data 0 , 63 , 64 , 64 , 64 , 63 , 0 , 0,
    Data 0 , 31 , 32 , 64 , 32 , 31 , 0 , 0,
    Data 0 , 63 , 64 , 60 , 64 , 63 , 0 , 0,
    Data 0 , 99 , 20 , 8 , 20 , 99 , 0 , 0,
    Data 0 , 7 , 8 , 112 , 8 , 7 , 0 , 0,
    Data 0 , 113 , 73 , 69 , 67 , 0 , 0 , 0,                ' ASCII-Code 90
    Data 0 , 0 , 127 , 65 , 65 , 0 , 0 , 0,
    Data 0 , 2 , 4 , 8 , 16 , 32 , 0 , 0,
    Data 0 , 0 , 65 , 65 , 127 , 0 , 0 , 0,
    Data 0 , 4 , 2 , 1 , 2 , 4 , 0 , 0,
    Data 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128,
    Data 0 , 0 , 3 , 7 , 0 , 0 , 0 , 0,
    Data 0 , 32 , 84 , 84 , 84 , 120 , 0 , 0,
    Data 0 , 127 , 68 , 68 , 68 , 56 , 0 , 0,
    Data 0 , 56 , 68 , 68 , 68 , 40 , 0 , 0,
    Data 0 , 56 , 68 , 68 , 68 , 127 , 0 , 0,
    Data 0 , 56 , 84 , 84 , 84 , 8 , 0 , 0,
    Data 0 , 8 , 126 , 9 , 9 , 0 , 0 , 0,
    Data 0 , 24 , 164 , 164 , 164 , 124 , 0 , 0,
    Data 0 , 127 , 4 , 4 , 120 , 0 , 0 , 0,
    Data 0 , 0 , 0 , 125 , 64 , 0 , 0 , 0,
    Data 0 , 64 , 128 , 132 , 125 , 0 , 0 , 0,
    Data 0 , 127 , 16 , 40 , 68 , 0 , 0 , 0,
    Data 0 , 0 , 0 , 127 , 64 , 0 , 0 , 0,
    Data 0 , 124 , 4 , 24 , 4 , 120 , 0 , 0,
    Data 0 , 124 , 4 , 4 , 120 , 0 , 0 , 0,
    Data 0 , 56 , 68 , 68 , 68 , 56 , 0 , 0,
    Data 0 , 252 , 68 , 68 , 68 , 56 , 0 , 0,
    Data 0 , 56 , 68 , 68 , 68 , 252 , 0 , 0,
    Data 0 , 68 , 120 , 68 , 4 , 8 , 0 , 0,
    Data 0 , 8 , 84 , 84 , 84 , 32 , 0 , 0,
    Data 0 , 4 , 62 , 68 , 36 , 0 , 0 , 0,
    Data 0 , 60 , 64 , 32 , 124 , 0 , 0 , 0,
    Data 0 , 28 , 32 , 64 , 32 , 28 , 0 , 0,
    Data 0 , 60 , 96 , 48 , 96 , 60 , 0 , 0,
    Data 0 , 108 , 16 , 16 , 108 , 0 , 0 , 0,
    Data 0 , 156 , 160 , 96 , 60 , 0 , 0 , 0,
    Data 0 , 100 , 84 , 84 , 76 , 0 , 0 , 0,
    Data 0 , 8 , 62 , 65 , 65 , 0 , 0 , 0,
    Data 0 , 0 , 0 , 119 , 0 , 0 , 0 , 0,
    Data 0 , 0 , 65 , 65 , 62 , 8 , 0 , 0,
    Data 0 , 2 , 1 , 2 , 1 , 0 , 0 , 0,
    Data 0 , 60 , 38 , 35 , 38 , 60 , 0 , 0                 'ASCII-Code 127
Wie man damit nun Texte auf dem OLED anzeigen kann, zeigt das nächste Programm:

Code: Alles auswählen

' OLED display 128x64 SSD1306 0.96"
' EEPROM 24C256 für Zeichen-Muster

' SCL -> B.7
' SDA -> B.5

' Text (Alle ASCII-Zeichen von 32 bis 94) auf Oled anzeigen
' Zeichenketten müssen genau 10 Zeichen lang sein!

'----------------------------------------------------------------------------

$regfile = "attiny2313.dat"                                 'Dadurch wird auch das Pin Layout bestimmt


'**********************************************************
'******************* Deklarationen ************************

Declare Sub Zeige_text
Declare Sub Init
Declare Sub Loeschen
Declare Sub Read_eeprom
Dim Kontrast As Byte
Dim Write_adresse_oled As Byte
Dim Text As String * 10
Dim X As Byte
Dim X1 As Byte
Dim X0 As Byte
Dim Page As Integer
Dim Buchstabe As String * 1
Dim Q As Integer
Dim H As Integer
Dim Temp As Integer
Dim Senden As Byte
Dim Pause As Byte
Dim Write_adresse_eeprom As Byte
Dim Read_adresse_eeprom As Byte
Dim Adresse As Word
Dim Wert As Byte
Dim Adresse_high As Byte
Dim Adresse_low As Byte

'**********************************************************
'****************** Initialisierung ***********************

Ddrb = &B11111111                                           'Port B als Ausgangsport
Ddrd = &B01110000                                           'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111                                          'Eingänge auf high legen

Config I2cdelay = 1                                         'I2C-Taktung möglichst rasch

Kontrast = 200                                              'hoher Kontrast
Write_adresse_oled = &H78                                   'OLED SSD1306
Write_adresse_eeprom = 160                                  'EEPROM 24C256
Read_adresse_eeprom = 161

Waitms 50                                                   'warte bis Kondensator bei Ta0 geladen

'**********************************************************
'******************** Hauptprogramm ***********************

Pause = 50                                                  'Pause in ms zwischen zwei Zeichen

Call Init
Call Loeschen

Wait 1

X = 0                                                       'Position x = 0 (Pixel)
Page = 1                                                    '1. Zeile
Text = "Hallo Welt "
Call Zeige_text
Waitms Pause

X = 8                                                       'Position x = 8 (Pixel)
Page = 2                                                    '2. Zeile
Text = "OLED SSD"
Call Zeige_text
Waitms Pause

X = 0
Page = 3
Text = "ASSDFGhjkl"
Call Zeige_text
Waitms Pause

X = 0
Page = 5
Text = "Frohes    "
Call Zeige_text
Waitms Pause

X = 24
Page = 6
Text = "Neues     "
Call Zeige_text

X = 40                                                      'Position x = 40 (Pixel)
Page = 7                                                    '7. Zeile
Text = "  Jahr!   "
Call Zeige_text
Waitms Pause

End


'**********************************************************
'******************** Unterprogramme **********************

Sub Init
  I2cstart
  I2cwbyte Write_adresse_oled
  If Err = 0 Then Portd.6 = 1                               'LED bei D.6 an, wenn OLED gefunden
  I2cstop
  Waitms 500
  Portd.6 = 0                                               'Kontrolle

  I2cstart
  I2cwbyte Write_adresse_oled

  I2cwbyte &H00                                             'Command Stream(nötig -------------??)

  I2cwbyte &HAE                                             'DISPLAYOFF ------------------------OK

  I2cwbyte &HD5                                             'SETDISPLAYCLOCKDIV ----------------OK
  I2cwbyte &H80                                             'ratio 0x80

  I2cwbyte &HA8                                             'Set MUX
  I2cwbyte &H3F                                             '&H1F for 128x32; &H3F for 128x64

  I2cwbyte &HD3                                             'SETDISPLAYOFFSET ------------------OK
  I2cwbyte &H00

  I2cwbyte &H40                                             'SETSTARTLINE ----------------------OK

  I2cwbyte &H8D                                             'CHARGEPUMP ------------------------OK
  I2cwbyte &H14                                             'vccstate 14 for chargepump

  I2cwbyte &H20                                             'MEMORYMODE ------------------------OK
  I2cwbyte &H00                                             'horizontal addr mode

  I2cwbyte &HA0                                             'SEGREMAP links-rechts A0/A1 -------OK

  I2cwbyte &HC0                                             'COMSCANDEC (&HC0 vert. gesp.) -----OK

  I2cwbyte &HDA                                             'SETCOMPINS ------------------------OK
  I2cwbyte &H12                                             '&H12 for 64 rows

  I2cwbyte &H81                                             'SETCONTRAST -----------------------OK
  I2cwbyte Kontrast                                         'value 1-->256

  I2cwbyte &HD9                                             'SETPRECHARGE ----------------------OK
  I2cwbyte &HF1                                             'vccstate  F1

  I2cwbyte &HDB                                             'SETVCOMDETECT ---------------------OK
  I2cwbyte &H30                                             '&H30 -> 0.83*VCC; bei Arduino &H40 ??

  I2cwbyte &HA4                                             'DISPLAYALLON_RESUME ---------------OK

  I2cwbyte &HA6                                             'NORMALDISPLAY

  I2cwbyte &HAF                                             'Display on ------------------------OK
  I2cstop
End Sub

Sub Zeige_text
    X0 = X Mod 16
    X1 = X / 16
    X1 = X1 + &H10
    I2cstart
    I2cwbyte &H78
    I2cwbyte &H00                                           'command stream ------------------??
    I2cwbyte X0                                             'Spalte x Low Nibble
    I2cwbyte X1                                             'Spalte x High Nibble
    I2cstop

    Page = Page + 175
    I2cstart
    I2cwbyte &H78
    I2cwbyte &H80
    I2cwbyte Page                                           'Bestimmung Page (Y)
    I2cstop

    I2cstart
    I2cwbyte &H78
    I2cwbyte &H80
    I2cstop

    'Umwandlung von Buchstaben zu Bitmustern aus EEPROM
    For Q = 1 To 10                                         'max. 10 Zeichen pro Zeichenkette
       Temp = 0
       Buchstabe = Mid(text , Q , 1)
       Temp = Asc(buchstabe)
       Temp = Temp - 32                                     'Code 32 -> Space -> Nr. 0
       Adresse = Temp * 8
       For H = 1 To 8
          Call Read_eeprom
          I2cstart
          I2cwbyte &H78
          I2cwbyte &H40
          I2cwbyte Wert
          I2cstop
          Incr Adresse
       Next H
       Waitms Pause
    Next Q

End Sub

Sub Loeschen
  I2cstart
  I2cwbyte Write_adresse_oled
  I2cwbyte &H80                                             'Single Command
  I2cwbyte &HB0                                             'Page (Y) &HB0 = Col0
  I2cstop

  I2cstart
  I2cwbyte Write_adresse_oled
  I2cwbyte &H00                                             'command stream
  I2cwbyte &H00                                             'Select start column 0
  I2cwbyte &H10
  I2cstop

  I2cstart
  I2cwbyte Write_adresse_oled
  I2cwbyte &H40                                             'Datenstrom für das RAM
  For Temp = 0 To 1023
    I2cwbyte 0
  Next Temp
  I2cstop
End Sub

Sub Read_eeprom
  I2cstart
  I2cwbyte Write_adresse_eeprom
  Adresse_high = High(adresse)
  I2cwbyte Adresse_high
  Adresse_low = Low(adresse)
  I2cwbyte Adresse_low
  I2cstop
  I2cstart
  I2cwbyte Read_adresse_eeprom
  I2crbyte Wert , Nack
  I2cstop
End Sub

Zuletzt geändert von Heinrichs am Sa 16. Sep 2017, 18:47, insgesamt 3-mal geändert.

Norbert
Beiträge: 2
Registriert: Mo 19. Mär 2012, 13:06

Re: Texte auf dem OLED SSD 1306 anzeigen

Beitrag von Norbert » Di 31. Jan 2017, 16:19

Hier zwei Links auf Seiten die seriell empfangen und im Display Characters erscheinen lassen.

Auf dieser Seite wird das Display mit einem Arduino Uno ( 328P ) angesteuert.
http://www.technoblogy.com/show?1H44
und hier empfängt einTiny85 via softserial und steuert mit den Asci Daten das Display via SPI an.
http://www.technoblogy.com/show?TV4

Gruß Norbert

Antworten