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