Hallo Forum,

ich verwende ein 4*20 Zeichen Dispay mit HD44780-Controller im 8bit-Modus.

Da die Ausgabe mit LCD "irgendwas" zu lange dauert, möchte ich notwendige Ausgaben in ein Variablenpuffer legen und in Ruhezeiten ausgeben.

Um auch in diesen Ruhezeiten schnell zu sein möchte ich das Busy-Flag abfragen und nicht einfach nur warten.

Leider werden nach der Busy-Flag-Abfrage nur noch abwechselnd volle Kästchen ($FF) und Leerzeichen ausgegeben.
Auch wird das Cls im Main-loop nach der ersten Busy-Flag-Abfrage nicht mehr ausgeführt.

Das Problem vermute ich in Datenrichtungsangabe, denn füge ich in der lcd_put()-Sub am Anfang ein DDRC = 1 ein, erhalte ich ebenfalls abwechselnde Kästchen


Code:
$regfile = "m128def.dat"
$crystal = 16000000
$framesize = 100
$swstack = 100
$hwstack = 100
$baud = 57600
'$sim



Testpin Alias Portf.4 : Config Testpin = Output : Testpin = 0
Declare Sub Lcd_put(_x As Byte)
Declare Sub Lcd_busy()


'################### LCD Settings #############################################
Dim Lcd_textbuffer As String * 20 , Lcd_textbuffer1 As String * 20
Config Lcdpin = Pin , Port = Portc , E = Portd.5 , Rs = Portg.3
Config Lcd = 20 * 4
Config Portg.4 = Output

Lcd_enable Alias Portd.5
Lcd_rs Alias Portg.3
Lcd_rw Alias Portg.4
Lcd_data Alias Portc
Cursor Off
Initlcd
Cls

Dim Lcd_zeile1 As String * 20
Dim Lcd_zeile1_char(20) As Byte At Lcd_zeile1 Overlay

Dim Lcd_zeile2 As String * 20
Dim Lcd_zeile2_char(20) As Byte At Lcd_zeile2 Overlay

Dim Lcd_zeile3 As String * 20
Dim Lcd_zeile3_char(20) As Byte At Lcd_zeile3 Overlay

Dim Lcd_zeile4 As String * 20
Dim Lcd_zeile4_char(20) As Byte At Lcd_zeile4 Overlay

Dim I As Byte


Do
   Cls
   Lcd_zeile1 = "0123456789"
   'input Lcd_zeile1

   For I = 1 To Len(lcd_zeile1)
      toggle Testpin
      Call Lcd_put(lcd_zeile1_char(i))
      toggle Testpin
      Waitms 100
   Next I
   Decr I
   Lowerline : Lcd "ready, " ; I ; " zeichen"
   Wait 5
Loop
End



Sub Lcd_put(_x As Byte)
  'DDRC = 1
  Lcd_data = _x
  Lcd_rw = 0
  Lcd_rs = 1
  !nop
  !nop
  Lcd_enable = 1
  !nop
  !nop
  Lcd_enable = 0
  Call Lcd_busy()
End Sub




Sub Lcd_busy
    Ddrc = 0
    Portc = 1
    Lcd_rs = 0
    Lcd_rw = 1
    !nop
    !nop
    Do
       Toggle Lcd_enable
       !nop
       !nop
    Loop Until Pinc.7 = 0
    Ddrc = 1
End Sub
Was mache ich verkehrt? oder besser, was wäre besser?

Gruß und Dank

BoGe-Ro