Grüß Gott an alle,
ich habe hier aus einem Tutorial einen Python-Schnipsel für meine Zwecke
angepasst, der ein hd47780 (oder kompatibles) Display an einem Raspberry
ansteuert (nicht i2c, sondern der "normale" 4-Bit-Modus).
Der Code macht auch genau das, was er soll - zumindest mit einem 2x8,
einem 2x16 und einem 4x20-Zeichen-Display.
Jetzt habe ich hier ein Display mit 2x40 Zeichen. Und hier habe ich das
Problem, daß bei der ersten Zeile der Inhalt um eins nach links
verschoben erscheint - der erste Buchstabe fehlt, der letzte wird mit
"leer" aufgefüllt (siehe Bild).
Was ich schon versucht habe: Die Werte von LCD_LINE_1 und -2 zu ändern.
Bei dem Wert für die zweite Zeile funktioniert das auch, ich kann damit
den Text zeichenweise nach links oder rechts schieben. Nur die erste
Zeile bleibt unverändert.
Ich habe auch schon versucht, alle 80 Zeichen in nur einer Zeile
anzugeben. Auch das funktioniert und auch hier ist die erste Zeile um
ein Zeichen versetzt.
Die Frage ist - wie bekomme ich das hin, daß die erste Zeile auch
korrekt angezeigt wird? Ein " " vor den String zu setzen geht zwar, aber
dann passen nur 39 Zeichen in die erste Zeile, und da geht's um das
Prinzip. :)
Hier der auf das 2x40-Zeichen-Display angepasste Code aus dem erwähnten
Tutorial:
1
!/usr/bin/python
2
3
import RPi.GPIO as GPIO
4
import time, sys
5
6
# Define GPIO to LCD mapping
7
LCD_RS = 7
8
LCD_E = 8
9
LCD_D4 = 25
10
LCD_D5 = 24
11
LCD_D6 = 23
12
LCD_D7 = 18
13
LED_ON = 15
14
15
# Define some device constants
16
LCD_WIDTH = 40 # Maximum characters per line
17
LCD_CHR = True
18
LCD_CMD = False
19
20
#Diesen Wert ändern hat keinerlei Auswirkungen:
21
LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
22
23
# Über diesen Wert kann ich zeichenweise den Text der zweiten Zeile
24
# verschieben, bei xa2 startet der Text genau in der ersten Zelle der
25
# zweiten Zeile.
26
LCD_LINE_2 = 0xa2 # LCD RAM address for the 2nd line
Ich glaube, du musst nach dem Initialisieren des Displays ein bisschen
warten. Ich warte nach jedem Daten-Byte (das wäre bei Dir das Ende von
lcd_byte) 60µs und nach dem Kommando RETURN_HOME sogar 1600µs.
Das Kommando RETURN_HOME (0x02) vermisse ich in deiner Initialisierung
ganz. Vielleicht ist es notwendig.
Was du mal probieren kannst:
Gebe mal zuerst etwas in Zeile 2 aus, danach in Zeile 1. Wenn sich der
Fehler dann auf Zeile 2 verschiebt, hatte ich mit dem Timing ziemlich
sicher Recht.
Displayproblem schrieb:> Die Frage ist - wie bekomme ich das hin, daß die erste Zeile auch> korrekt angezeigt wird?
Im Datenblatt des LCD sind, besonders beim Init, Zeiten zwischen den
Bytes angegeben, die man nicht unterschreiten sollte.
Man kann auch die Zeiten aus dem HD44780-Datenblatt nehmen, die meisten
Text-LCD sind dazu kompatibel.
Hi,
die Initialisierungssequenz sieht bei mir so aus (2x16):
Vermisse die 3x 0x30
Jedesmal Pausen dazwischen senden.
0x30 Init
0x30 Init
0x30 Init
0x20 Vierbit
0x28 Vierbit, z w e i zeilig; kann angepasst werden(!)
ab hier Befehle im Vierbitmodus senden (zweimal Enable!)
0x08 Cursor aus, Blinken aus
0x01 Anzeigepuffer loeschen
0x06 Cursor nach rechts
0x10 Cursor nach rechts, kein Schieben
0x0C Cursor aus, Blinken aus
0x01 Anzeigepuffer loeschen
Mal den Test machen mit den Positionierungsbefehl:
locate1: ;Anfang Zeile 1
push temp
ldi temp, 0x80
rcall comd2lcd
pop temp
ret
Ist zwar ASM, aber gemeint ist, einen Befehl mit dem "Wert" 0x80 an das
Display zu senden im Kommandomodus, nicht Textmodus. Wie das in der
Syntax aussieht, weiß ich nicht, jedenfalls müssen die 0x80 rein für
Anfang Zeile 1 plus Befehl zum Wechseln in den Befehlsmodus.
Wenn das dann nach der Initialisierung klappt, ist die Initsequenz
irgendwo nicht ganz korrekt, oder, wie oben schon gesagt, die Pausen zu
kurz.
Peter D. schrieb:> Im Datenblatt des LCD sind, besonders beim Init, Zeiten zwischen den> Bytes angegeben, die man nicht unterschreiten sollte.
ciao
gustav
> Jedesmal Pausen dazwischen senden.
Das war der entscheidende Hinweis.
ein "time.sleep(0.1)" in der Initialisierung hat das Problem behoben.
Danke an alle.