mkprojekt.de

Hier möchte ich zeigen, wie man ein Nokia 3310 Display ansteuert.

Das Display hat, genau wie das 3210 auch, einen Philips PCD8544 Controller an Board und wird über die SPI-Schnittstelle angesteuert. Da es bei verschiedenen Beschaffungs-Quellen sehr günstig zu beschaffen ist und eine sehr geringe Stromaufnahme hat, ist es ideales Display. Ein Nachteil ist jedoch die fehldende Hintergrundbeleuchtung.
Hier mal eine kleine Auflistung der Displaytypen in verschiedenen Handys, die aber den gleichen Controller haben.

Display-TypNokia Handy(s)
LPH 76773210
LPH 77793310, 3315, 3330, 3350, 3410
LPH 73665110, 5120, 5130, 5160, 6110, 6150


Das LPH 7366 hat eine etwas andere Pinbelegung, da es neun Pins hat. Auf diesen Typ werde ich hier nicht eingehen.



Ein Testbild, welches über die LPT-Schnittstelle von LCDInfo dargestellt wurde.

 



Dies ist die Rückseite meines Displays mit Pinbelegung.
An Vcc kommen 2.7-3.3V. An Vout kommt nur ein Kondensator von ca. 2.2µF nach GND. Die restlichen Leitungen sind die Daten- und Steuerleitungen.

 





Bild 4: Anschlussplan für das Display über die Hardware SPI-Schnittstelle eines Mega32 / Klicken zum vergrößern.


Die Widerstände R1+R6, R2+R7, ..., sind Spannungsteiler um die 5V-Signale des Mega in eine für das Display zulässige Spannung zu konvertieren. Sie haben ein Verhältins von ungefähr 2:1, sodass am Display eine Spannung von ungefähr 2,5-3V ankommt, wenn eine Leitung des AVR auf high ist. Die Größenordung ist eher unkritisch (so 1k bis 2k dürften gehen).

Wenn der Mega ebenfalls mit 3V (oder 3,3V) betrieben wird, können die Spannungsteiler weggelassen werden. Alternativ zu den Spannungsteilern kann man auch einen Bustreiber-Baustein (wie z.B. den 74HC244/245) nehmen. Der Widerstand R11 zieht den Reset-Eingang des Displays auf High.
 



Ansteuerung mit Bascom


Den Code könnt ihr euch hier runterladen: nokia 3310.bas
Einen Zeichensatz könnt ihr hier laden: zeichensatz.bas
Das Datenblatt findet ihr hier: Datenblatt

Die Ansteuerung via Bascom ist eigentlich recht einfach.
Zu allererst muss das Display nach anlegen der Betriebsspannung resetet werden. Dies geschieht, wenn der Resetport des Displays auf "Low" ist. Nach einer kurzen Wartezeit dann wieder auf "High" setzen.


    Portb.1 = 0         'Reset
    Waitus 250
    Portb.1 = 1

    Spiinit                 'Initialisierung der SPI-Schnittstelle


Hiernach müssen einige Werte an das Display übertragen werden.
Es gibt zwei Möglichkeiten, Werte an das Display zu schicken. Einmal als Kommandos und einmal als Daten. Zuständig für diese Unterscheidung ist der D/C-Pin des Displays. Ist dieser Pin während der Übertragung auf "Low", dann werden die empfangenen Daten als Kommandos interpretiert, ist der Pin auf "High", dann werden sie als Daten interpretiert und im RAM des Displays gespeichert.
Um nicht jedes Mal vor und nach einer Übertragung den Pin manuell umschalten zu müssen, erstellen wir eine Sub, die dieses übernimmt.


    Sub UKommando(byval wert as byte)
       
Portb.0 = 0          'in den Kommando-Mode
        Spiout wert , 1
        Portb.0 = 1          'zurück in den Daten-Mode
    End Sub  

    Sub UData(byval wert as byte)
       
Portb.0 = 1          'um sicher zu gehen, dass man auch wirklich im Datenmode ist
       
Portb.2 = 0
        Spiout wert , 1
        Portb.2 = 1
    End Sub

 

Um jetzt ein Kommando zu übertragen, muss einfach nur "UKommando" und nach einem Leerzeichen einfach der zu sendende Wert geschrieben werden.
Datenwerte können jetzt direkt über "UData xxx" ausgegeben werden.

Die Initialisierung des Displays läuft nun so ab (im Datenblatt ab Seite 22 nachzulesen.)


    Sub Initialisierung
        UKommando &H21         'Erweiterter Kommando-Mode
        UKommando &HC8       
        UKommando &H06        
        UKommando &H13
        UKommando &H20         'Wieder in den normalen Kommando-Mode
   
    UKommando &H0C
    End Sub 

 

Hier eine Auflistung von Befehlen, die über UKommando gesandt werden können und deren Bedeutung (ab Seite 22 im Datenblatt):

&H21 Erweitererter Kommando-Mode
&HC8
Mittlerer Kontrast (nur im erweiterten Mode)
&H06
Temperatur-Ausgleich (nur im erweiterten Mode)
&H13
Bias 1:48 (Optimum, nur im erweiterten Mode)
&H20
Normaler Kommando-Mode
&H0C
Normale, nicht invertierte Ausgabe (nur im normalen Mode)
&H0D
Invertierte Ausgabe (nur im erweiterten Mode)
&H24LCD ausschalten
&H20
LCD einschalten
&H80
RAM auf Adresse "0000000" setzten nur im erweiterten Mode)

 

Jetzt wollen wir das Display löschen.


    Sub LCDLoeschen
    local i as word
        UKommando &H20           'Normaler Kommando-Mode
        UKommando &H0C          'Normaler Bildschirm
        UKommando &H80           'Setze RAM-Adresse auf 0
        Portb.0 = 1                         'Sicherstellen, dass man im Daten-Mode ist
        For i = 0 to 503
            UData &H00
       Next
    End Sub

 

In dieser Sub-Routine schreibt man 504 mal den Wert 0 in das RAM des Displays, da es 84 * 6 = 504 Speicherbänke hat. Dies bewirkt, dass das Display gelöscht wird.


Bild 5: Adressierung des Displays (Quelle: Datenblatt Seite 8)

 

Um zu verstehen, wie die Adressierung erfolgt, hier ein kleines Beispiel (wir betrachten einen Ausschnitt ganz links oben des Displays ;-).

  
 So sieht das Display nach einer Löschung aus. Hier wurde jetzt der Wert &H7F bzw. &B01111111 an das Display geschickt.
Jetzt der Wert &H02 oder &B00000010.&H04 oder &B00000100
&H02 oder &B00000010Hier jetzt wieder &H7F.

Im Quelltext würde das nun so aussehen:


LCDLoeschen                  'Falls noch etwas auf dem Display angezeigt wird, wird dies hier entfernt.
    UData &H7F                   'Übermittlung der Werte
    UData &H02
    UData &H04
    UData &H02
    UData &H7F
    UData &H00

 
Dies wäre z.B. ein möglicher Zeichensatz für den Großbuchstaben "M". Der zuletzt gesendete Wert &H00 ist Quasi ein Leerzeichen, damit die Buchstaben nicht direkt aneinander kleben.

Mit Programmen wie FastLCD (Freeware) ist es problemlos möglich, die eigene Zeichensätze herzustellen oder auch Bitmaps zu konvertieren oder selbst herzustellen. Diese können dann entweder im Flash-Speicher als Programmcode abgelegt werden oder auch in den EEPROM "gebrannt" werden.

hier gehts weiter zum zweiten Teil