LCD-Display ST7066

Gast #4638557
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.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #4638559
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
    ....
Gast #4638582
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?!
Gast #4638602
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?
Gast #4638695
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?
Gast #4638799
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)...
Gast #4638820
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.