Forum: Mikrocontroller und Digitale Elektronik 2x8 LCD nach Beschreiben des DDRAMS nur noch BUSY


von Pete (Gast)


Lesenswert?

Hallo Leute,

ich habe hier ein Display mit 2x8.
Es lässt sich initialisieren und auch Zeichen wiedergeben. Allerdings 
wir beim schreiben oder lesen aufs display die DDRAM-Adresse 
incrementiert. Ist ja auch so eingestellt. Da ich aber immer das 
Busy-Flag abfrage muss ich die DDRAM-Adresse korigieren.
Hier ist mein Problem dass es laut Datenblatt wie bei all den anderen 
Hitachi kompatiblen displays ist. Allerdings ist es bei mir so dass sich 
das display nach Beschreiben der DDRAM-Adresse nicht mehr ansprechen 
lassen kann. Sprich ich lese nanach immer dass das Display Busy ist.

weiss einer nen Rat?

gruss,
pete

von Pete (Gast)


Lesenswert?

Hallo,

irgendwie komm ich hier nicht weiter.
in die 2te zeile komme ich erst wenn ich so lange schreibe bis ich bei 
Adresse 0x40 gelandet bin. Somit funktionieren zumindest beide Zeilen.
Aber ich kann immer noch nicht den Cursor auf eine bestimmte position 
setzen.

zwischen jedem schreiben und lesen warte ich 2msec.
die Initialisierung sieht wie folgt aus:

FunktionSET (8bit, 2-zeilig, 5x7font)
DisplayOFF
LCDClear
LCDModeSet (curser hochzählen)
LCDON
LCDHome (setze cursor auf Adresse 0x00)

dass funktioniert alles prima. Dann kann ich auf der ersten Zeile was 
schreiben. Wenn ich aber die Adresse beschreiben will sprich den cursor 
wo anders hin setzten möchte (zeile 1: 0x00 bis 0x07, zeile 2 0x40 bis 
0x47) dann kann ich danach das Display nicht beschreiben da das Busy 
flag gesetzt bleibt. Wenn ich diese ignoriere und weiter schreibe. Steht 
der Cursor auf der letzten position. Sprich es sieht so aus als ob da 
nichts passiert wäre.

Was könnte denn mein fehler sein???

gruss,
pete

von µluxx .. (uluxx) Benutzerseite


Lesenswert?

ja das problem mit dem cusor hatte ich auch mal, und zwar so:
in der ersten zeile konnte ich den cursor beliebig verschieben, und ich 
konnte in auf 0x40 also 2. zeile verschieben, aber in der zweiten zeile 
nicht an eine beliebige stelle, er landete immer an 0x40. hat da jemand 
infos?
uLuxx

von Matthias (Gast)


Lesenswert?

Welcher LCD-Controller?
Bei manchen kann man das Inc für jede Zeile getrennt einstellen.

von MKer (Gast)


Lesenswert?

Hallo,
ist in der Zwischenzeit eine Lösung gefunden worden?
Habe leider dasselbe Problem. Benutze ein Batronix ISP-Board mit einem 
Atmel T89C51-AC2 und einem LCD von Displaytech (162C) mit einem HD44780.
Kann den Cursor in der 1. Zeile verschieben, aber den Cursor an keine 
Spalte direkt setzen. Die 2. Zeile wird nur durch Zufall mal erreicht.
Habe meinen Quelltext angehängt.
Hoffentlich kann mir jemand helfen, ich bin am verzweifeln...

Danke,
Markus

von MKer (Gast)


Angehängte Dateien:

Lesenswert?

Jetzt auch mit Quelltext...

von Jörn P. (jonnyp)


Lesenswert?

Ich kenne keine LCD´s bei denen der Adressbereich kontinuierlich 
durchgeht für 2-zeilige (oder mehr) displays durchgeht. Da ist immer ein 
Offset dazwischen. Genaues sagt das Datenblatt. Das Busy-Flag kann man 
direkt unter seiner Adresse auslesen, dazu braucht man den Pointer nicht 
zu ändern. Allerdings muss man die Flag-Adresse 2 mal lesen falls das 
Display im 4 Bit Modus angesteuert wird.

von Zeusi (Gast)


Angehängte Dateien:

Lesenswert?

Jo,

laut datenblatt 1.Zeile 0x00, 2.Zeile 0x40,

für den 162C eine routine zum schreiben, der schreibt von links nach 
rechts und überspringt dabei die bandlücke (muhahaha, typisch phyisk)
(8Bit modus, Char @ temp1)

Der rest ist im anhang, falls ihr fragen habt, könnt ihr mir auch eine 
mail schreiben,.. grüüüüße
1
;#######################################################################################################
2
;Routine lcd_data_trans_l
3
; uses specific delay routine
4
; and sets automaticly the right addressroom
5
;#######################################################################################################
6
lcd_data_trans_l:
7
           ldi temp1,0x00
8
       out lcd_port,temp1
9
       rcall delay50us
10
       
11
           cpi lcd_pos_counter,8
12
       brlt low_pos_l
13
       
14
high_pos_l:mov temp2,lcd_pos_counter
15
       subi temp2,8
16
           ldi temp1,0x40
17
       add temp1,temp2
18
           ori temp1,0b10000000
19
       out lcd_port,temp1
20
       rcall lcd_enable
21
       rjmp pos_set_l
22
23
low_pos_l: ldi temp1,0b10000000
24
       or temp1,lcd_pos_counter
25
       out lcd_port,temp1           
26
           rcall lcd_enable
27
28
pos_set_l: rcall delay50us
29
       sbi lcd_ctrl,lcd_RS                ;set Enable
30
       sbi lcd_ctrl,lcd_E                 ;set RS
31
       out lcd_port,lcd_data              ;set Port with Data
32
       nop                                ;wait 7 cycles (normaly 6, +1 to be sure)
33
       nop
34
       nop
35
       nop
36
       nop
37
       nop
38
       nop
39
       cbi lcd_ctrl,lcd_E                 ;clear Enable
40
       cbi lcd_ctrl,lcd_RS                ;clear RS
41
       cpi lcd_pos_counter,16
42
       brge l_pos_too_high
43
       inc lcd_pos_counter
44
           ret                              ;return
45
       l_pos_too_high:
46
       ldi lcd_pos_counter,0
47
       ret
48
;#######################################################################################################
49
50
;#######################################################################################################

von MKer (Gast)


Lesenswert?

Nochmal zum Verständnis:
Du springst nicht direkt auf eine bestimmte Zeile/Spalte, sondern 
verschiebst einfach den Cursor solange (???nach rechts???) bis du die 
gewünschte Zeile/Spalte erreicht hast?

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.