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
Lesezeichen