Forum: Mikrocontroller und Digitale Elektronik LCD-Display ST7066


von eyk107 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle,

ich versuche eine LCD-Display (WH1602A, Controller ST7066) mit einem 
Beaglebone-Black und Python, mit dem folgenden Code zum laufen zu 
bringen:
1
-------------------------------------------------------------------
2
import Adafruit_BBIO.GPIO as GPIO
3
import time
4
 
5
# Define GPIO to LCD mapping
6
LCD_RS="P9_15"
7
LCD_E="P9_16"
8
LCD_D4="P9_21"
9
LCD_D5="P9_22"
10
LCD_D6="P9_23"
11
LCD_D7="P9_24"
12
13
OUT=GPIO.OUT
14
LOW=GPIO.LOW
15
HIGH=GPIO.HIGH
16
17
# Define some device constants
18
LCD_WIDTH = 16    # Maximum characters per line
19
LCD_CHR = True
20
LCD_CMD = False
21
 
22
LCD_LINE_1 = 0x00 # LCD RAM address for the 1st line
23
LCD_LINE_2 = 0x28 # LCD RAM address for the 2nd line
24
 
25
# Timing constants
26
E_PULSE = 0.00005 
27
E_DELAY = 0.00005
28
 
29
def main():  # Main program block
30
  GPIO.setup(LCD_E,OUT)  # E
31
  GPIO.setup(LCD_RS,OUT) # RS
32
  GPIO.setup(LCD_D4,OUT) # DB4
33
  GPIO.setup(LCD_D5,OUT) # DB5
34
  GPIO.setup(LCD_D6,OUT) # DB6
35
  GPIO.setup(LCD_D7,OUT) # DB7
36
 
37
  # Initialise display
38
  lcd_init()
39
40
def lcd_init():
41
  # Initialise display
42
  lcd_byte(0x30,LCD_CMD) # 110011 Initialise
43
  time.sleep(0.01)
44
  lcd_byte(0x30,LCD_CMD) # 110010 Initialise
45
  time.sleep(0.01)
46
  lcd_byte(0x30,LCD_CMD) # 000110 Cursor move direction
47
  time.sleep(0.01)
48
  lcd_byte(0x20,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
49
  time.sleep(0.01)
50
  #lcd_byte(0x1C,LCD_CMD) # 101000 Data length, number of lines, font size
51
  #  time.sleep(0.01)
52
  lcd_byte(0x0C,LCD_CMD)
53
  time.sleep(0.01)
54
  lcd_byte(0x01,LCD_CMD)
55
  time.sleep(0.01)
56
  #lcd_byte(0x06,LCD_CMD) # 000001 Clear display
57
 
58
def lcd_byte(bits, mode):
59
  # Send byte to data pins
60
  # bits = data
61
  # mode = True  for character
62
  #       False for command
63
  GPIO.output(LCD_RS, mode) # RS
64
  GPIO.output(LCD_D4, False)     # High bits
65
  GPIO.output(LCD_D5, False)
66
  GPIO.output(LCD_D6, False)
67
  GPIO.output(LCD_D7, False)
68
  time.sleep(0.001)
69
  lcd_toggle_enable()
70
  if bits&0x10:
71
    GPIO.output(LCD_D4, True)
72
  if bits&0x20:
73
    GPIO.output(LCD_D5, True)
74
  if bits&0x40:   GPIO.output(LCD_D6, True)
75
  if bits&0x80:
76
    GPIO.output(LCD_D7, True)
77
  time.sleep(E_PULSE)
78
  GPIO.output(LCD_E, True)
79
  time.sleep(E_DELAY)
80
  GPIO.output(LCD_E, False)
81
  time.sleep(E_PULSE)
82
83
# lcd_toggle_enable()
84
  GPIO.output(LCD_D4, False)
85
  GPIO.output(LCD_D5, False)
86
  GPIO.output(LCD_D6, False)
87
  GPIO.output(LCD_D7, False)
88
 
89
  if bits&0x01:
90
    GPIO.output(LCD_D4, True)
91
  if bits&0x02:
92
    GPIO.output(LCD_D5, True)
93
  if bits&0x04:
94
    GPIO.output(LCD_D6, True)
95
  if bits&0x08:
96
    GPIO.output(LCD_D7, True)
97
  lcd_toggle_enable()
98
   
99
def lcd_toggle_enable():
100
  time.sleep(0.005)
101
  GPIO.output(LCD_E, False)
102
  time.sleep(E_PULSE)
103
  GPIO.output(LCD_E, True)
104
  time.sleep(E_DELAY)
105
  GPIO.output(LCD_E, False)
106
  time.sleep(0.005)
107
108
def lcd_string(zeile,text):
109
  if zeile == 1:
110
      lcd_byte(LCD_LINE_1, LCD_CMD) 
111
  if zeile == 2:
112
      lcd_byte(LCD_LINE_1, LCD_CMD)
113
  message=text.ljust(LCD_WIDTH,'_')
114
  for i in range(LCD_WIDTH):      
115
    lcd_byte(ord(message[i]),LCD_CHR)
116
    main()
117
lcd_string(1,'abc')
118
------------------------------------------------------------
Ich bekomme das Display zwar angesteuert, leider ist die Ausgabe 
teilweise fehlerhaft (siehe Foto). Ich vermute, dass etwas mit dem 
toggle-Befehl oder der Wartezeit falsch ist, kann aber leider keinen 
Fehler sehen.
Hat jmd vllt eine eine Idee?
Vielen Dank für eure Hilfe.

: Bearbeitet durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

eyk107 schrieb:
> Hat jmd vllt eine eine Idee?
Eine Anregung hätte ich: verwende das nächste Mal die [ c ] oder [ code 
] Tags, so wie's über jeder Eingabebox steht:
1
Antwort schreiben
2
Wichtige Regeln - erst lesen, dann posten!
3
    ....
4
    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
5
Formatierung (mehr Informationen...)
6
    [c]C-Code[/c]
7
    [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
8
    ....

: Bearbeitet durch Moderator
von eyk107 (Gast)


Lesenswert?

hallo,
ist leider komplett untergegangen. Fehlt wohl der erste Kaffee ;-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

eyk107 schrieb:
> leider ist die Ausgabe teilweise fehlerhaft (siehe Foto).
Was hättest du stattdessen erwartet?

Da kann doch auch noch was nicht stimmen:
1
def lcd_string(zeile,text):
2
  if zeile == 1:
3
      lcd_byte(LCD_LINE_1, LCD_CMD) 
4
  if zeile == 2:
5
      lcd_byte(LCD_LINE_1, LCD_CMD)

von Heiko G. (heikog)


Lesenswert?

Der Beaglebone Black verwendet 3,3V Logik. Ist das Display dafür 
vorgesehen? Offenbar gibt es von WH1602A 3,3- und 5Volt-Versionen. Oder 
wenn es ein 5V-Display ist, wurden Levelshifter davorgeschaltet ?

von eyk107 (Gast)


Lesenswert?

Lothar M. schrieb:
> eyk107 schrieb:
>> leider ist die Ausgabe teilweise fehlerhaft (siehe Foto).
> Was hättest du stattdessen erwartet?
>
> Da kann doch auch noch was nicht stimmen:def lcd_string(zeile,text):
>   if zeile == 1:
>       lcd_byte(LCD_LINE_1, LCD_CMD)
>   if zeile == 2:
>       lcd_byte(LCD_LINE_1, LCD_CMD)

Hatte abc erwartet, das "b" wird ja auch angezeigt, nur ein " " anstatt 
des a und eine 2 anstatt des c.

Danke für den Tipp, blöder Copy-paste Fehler.

Heiko G. schrieb:
> Der Beaglebone Black verwendet 3,3V Logik. Ist das Display dafür
> vorgesehen? Offenbar gibt es von WH1602A 3,3- und 5Volt-Versionen. Oder
> wenn es ein 5V-Display ist, wurden Levelshifter davorgeschaltet ?

Verwende das 3,3V-Modell. Hab mich bei der Initialisierung auch an das 
HD44780 gehalten, möglicherweise sind diese beiden doch nicht zu 100% 
wie im Datenblatt?!

von Alt-Code-Enter (Gast)


Lesenswert?

> Da kann doch auch noch was nicht stimmen:
>
1
> def lcd_string(zeile,text):
2
>   if zeile == 1:
3
>       lcd_byte(LCD_LINE_1, LCD_CMD)
4
>   if zeile == 2:
5
>       lcd_byte(LCD_LINE_1, LCD_CMD)
6
>

Ich lieber so:
1
def lcd_string(zeile,text):
2
   lcd_byte(LCD_LINE_1 if (1==zeile) else LCD_LINE_2, LCD_CMD)

So wird die Funktion immer aufgerufen, auch für andere Zahlen als 1,2 
von "zeile" und man merkt es weil ggfs. Zeile 2 überschrieben wird, aber 
keine ungültige Werte dem Displaycontroller gegeben werden.

Werden im Controllerdatenblatt die Zeilen nicht 0 und 1 nummeriert?

von eyk107 (Gast)


Lesenswert?

>
> Werden im Controllerdatenblatt die Zeilen nicht 0 und 1 nummeriert?

Die Nummerierung kommt ja von mir, definiere ja den Bereich, an welcher 
Stelle welche Zeile beginnt.

Jmd sonst vllt noch eine Idee, wieso nichts brauchbares ausgegeben wird?

von eyk107 (Gast)


Lesenswert?

Kurzes Update: Habe mir eben mal ein anderes Display mit dem KS0066 
genommen:
Zeigt genau das gleiche in grün an. Also müsste das erste Display heile 
sein, und der Fehler wohl in der Software liegen (andere Kabel 
verwendet)...

von Karl M. (Gast)


Lesenswert?

Hallo eyk107,

nun im 4-Bit Moduls muss man in der Init jeweils nur ein Nibbel senden 
und auch das Timing eingehalten werden!

Da das schon +1000x gemacht worden ist, kann man einfach einen C-Code 
nehmen und in deine Systax übertragen.

Ein Byte sendet man dann durch zweimaligen Aufruf der Nibbel Procedure 
unter Beachtung der Nibbelreihenfolge.

von Karl M. (Gast)


Lesenswert?

Du wackelst mir auch zu viel am E-Signal.

Das Timing für schreibe (write) Operationen ist als Diagramm in den 
Datenblättern zu finden.

von eyk107 (Gast)


Lesenswert?

Karl M. schrieb:
> Du wackelst mir auch zu viel am E-Signal.
>
> Das Timing für schreibe (write) Operationen ist als Diagramm in den
> Datenblättern zu finden.

hab jetzt die init und enable geändert/weniger. Jetzt geht es, vielen 
Dank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.