PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD "zu Fuss" initialisieren...



Jaecko
28.05.2007, 18:38
Moin.

Nachdem ich es immer noch nicht geschafft hab, ein gewisses 40x2 LCD zum laufen zu bringen, wollte ich mal fragen, ob hier jemand ne Initialisierung von Hand als Quellcode hat. Meine jetzt nicht das ganze mit Config LCD und Initlcd, sondern ein Stück Code in "Rohform", Bascom oder AVR.

Hat da jemand was rumliegen?


Kurz zur Geschichte:
Mit den Standard-Befehlen eines AVR will ein 40x2-Display nicht (andere LCDs funktionieren problemlos). An einer fertigen USB-Ansteuerung läuft dieses eine Display jedoch auch. (Obwohl hier eben auch ein AVR, scheinbar ATTiny, verbaut ist).
Eine "Kopie" der Sequenz (ausgelesen mit einem Logik-Analyzer und in Bascom nachgebaut) klappt leider aus welchen Gründen auch immer nicht (Obwohl die Signale nach LA identisch sind *ratlos*)

linux_80
28.05.2007, 20:26
Servus,
hast Du nicht mehr Infos zum LCD selber (Fundort usw., evtl. mit Bildern), vielleicht findet sich da was drüber.
Du hast also noch kein Datenblatt dazu ?

Jaecko
28.05.2007, 20:48
Das einzige was ich vom LCD selber weiss: Es ist ein 40x2 LCD. Einbauort war bzw. ist ein altes Telefon "Octophon", Hersteller war die Telekom; Bild davon ist im Anhang. Da auf dem Display selbst leider keine weiteren Nummern zu finden sind, scheitert auch die Suche nach einem Datenblatt. Lediglich ein 47800 sowie ein paar Erweiterungstreiber (44100?) sind darauf zu finden; keine Hintergrundbeleuchtung.

Edit: Anhang aus Platzgründen entfernt

xunwichtig
28.05.2007, 23:08
Ich habe einmal eine LCD-Ansteuerung auf dem PC via Paraschnitstelle geschrieben. Das ganez dann auf den AVR umgelegt.

Hiermit kannst du das regeln, musst allerdings in den LCD_Wait funktionen die Zeiten entsprechend auf die Taktraten anpassen!!!


'################################################# ################################################## #####################################
'# LCD-Routinen ################################################## ################################################## #####################
'################################################# ################################################## #####################################
'LCD Winstar 1202A Spezifische Routinen
Sub Lcd_send(byval V_value As Byte)
'## maskiert ausgeben!!
'Out Lcd_adr , V_value
End Sub


Sub Lcd_send_statecode(byval V_rs As Byte , Byval V_rw As Byte , Byval V_clock As Byte)
Dim V As Byte
'## V (startwert für Bytemaske vordevinieren)
V = 3
If V_rs = 1 Then V = V And 254
If V_rw = 1 Then V = V And 253
If V_clock = 1 Then V = V Or 4
'## maskiert ausgeben!!
'Out LCD_ADR + 2, V
End Sub


Sub Lcd_send_clock_init()
Call Lcd_send_statecode(0 , 0 , 1)
Waitus 1800
Call Lcd_send_statecode(0 , 0 , 0 )
Waitus 1800
End Sub


Sub Lcd_send_clock_cmd()
Call Lcd_send_statecode(0 , 0 , 1)
Waitus 45
Call Lcd_send_statecode(0 , 0 , 0)
Waitus 45
End Sub


Sub Lcd_send_clock_data()
Call Lcd_send_statecode(1 , 0 , 1)
Waitus 45
Call Lcd_send_statecode(1 , 0 , 0)
Waitus 45
End Sub












Sub Lcd_init()
'## LCD-BYTE Adresswert festlegen
'Lcd_adr = 0
Lcd_display = 8
'LCD-Reset
Call Lcd_send(48)
Call Lcd_send_clock_init
Call Lcd_send(48)
Call Lcd_send_clock_init
Call Lcd_send(48)
Call Lcd_send_clock_init
'LCD-Init
Call Lcd_send(44)
Call Lcd_send_clock_init
Call Lcd_send(4)
Call Lcd_send_clock_init
Call Lcd_clear
Call Lcd_set_displayon(1)
End Sub


Sub Lcd_clear()
Call Lcd_send(1)
Call Lcd_send_clock_init
Call Lcd_set_position_cursor(1 , 0)
End Sub


Sub Lcd_set_displayon(byval V_value As Byte)
If V_value = 1 Then
Lcd_display = Lcd_display Or 4
Else
Lcd_display = Lcd_display Xor 4
End If
Call Lcd_send(lcd_display)
Call Lcd_send_clock_init
End Sub


Sub Lcd_set_cursoron(v_value As Byte)
If V_value = 1 Then
Lcd_display = Lcd_display Or 2
Else
Lcd_display = Lcd_display Xor 2
End If
Call Lcd_send(lcd_display)
Call Lcd_send_clock_init
End Sub









Sub Lcd_put_text_multichar(byval V_string As String)
For Xbyte = 1 To Len(v_string)
Xstring = Mid(v_string , Xbyte , 1)
Xchar = Asc(xstring)
Call Lcd_put_text_monochar(xchar)
Next
For Xbyte = Len(v_string) To 12
Call Lcd_put_text_monochar(32)
Next
End Sub


Sub Lcd_put_text_monochar(byval V_char As Byte)
Call Lcd_send(v_char)
Call Lcd_send_clock_data
Call Lcd_shift_cursor(1)
End Sub











Sub Lcd_shift_cursor(byval V_left As Byte)
If V_left = 1 Then
Call Lcd_send(24)
Else
Call Lcd_send(28)
End If
Call Lcd_send_clock_cmd
'Call Lcd_wait1
End Sub


Sub Lcd_set_position_line(byval V_line As Byte)
Select Case V_line
Case 1 : Lad = 128
Case 2 : Lad = 192
End Select
Call Lcd_send(lad)
Call Lcd_send_clock_cmd
End Sub


Sub Lcd_set_position_cursor(byval V_line As Byte , Byval V_pos As Byte)
Select Case V_line
Case 1 : Lad = 128 Or V_pos
Case 2 : Lad = 192 Or V_pos
End Select
Call Lcd_send(lad)
Call Lcd_send_clock_cmd
End Sub

Diese Funktionen kannst du ganz leicht an unterschiedliche Zeilen und Zeichen anpassen.


JimJim
XUN

Gento
28.05.2007, 23:28
ich finde die Aktion lächerlich , es sei da sind 100 000 LCD's vorhanden.

Gento

Jaecko
29.05.2007, 00:30
Klar, ich könnte ja das Display einfach austauschen... aber warum sollte ich unnötig Geld ausgeben und ein funktionierendes Display gegen ein funktionierendes Display austauschen, wenns lediglich an der Ansteuerung hackt?
Ich weiss, dass das Display fehlerfrei arbeitet, wenn es denn erst einmal initialisiert ist. Und genau diese Initialisierung ist das Problem.

Also den Source werd ich baldmöglichst mal testen sobald ich das Display wieder in Reichweite hab. (Dürfte gegen Ende der Woche sein). Sieht soweit gut aus.