Hi! Der Titel hört sich komplex an, ist aber eigentlich ein relativ "einfaches" Problem: Das LCD (2x20 Zeichen) wird über 2 PCF8574 gesteuert. Das funktioniert auch ganz gut. Ich habe gestern Abend eine Funktion geschrieben, die aus einem String n Zeichen ins LCD drucken soll. Wenn ich das ganze LCD vollschreiben will, dan schreibe ich meinen Text in "Lcdtext" und sage "printlcd(<anzahl zeichen>)" So. Die schleife soll dann n mal durchlaufen und die Zeichen per I²C in das LCD schreiben. Das funktioniert; aber nur bis zum ende der Ersten Zeile. Der Quelltext: '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++ '| MEECH HAUPRPROGRAMM | '| Copyright: Tobias Schlegel | '| Version 0.4 | '| | '| www.drschlegel.de/tobias | '| Compiled for ATMEGA16, 16Mhz (ext.)Crystal | '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++ '===CONFIGURATIONS=== $regfile = "m16def.dat" $baud = 9600 $crystal = 16000000 $lib "i2c.lib" Config Scl = Portc.0 'I²C SDA Config Sda = Portc.1 'I²C SCL '===FUNKTIONEN=== Declare Function Lcdprint(byval Nchars As Byte) As Byte '===VARIABLEN=== Dim A As Byte Dim B As Byte Dim C As Byte Dim D As Byte Dim E As Byte Dim Lcdtext As String * 40 Const Lcddataaddr = &H40 Const Lcdcntrladdr = &H42 Const Default_i2c_delay_time = 3 '===PROGRAMMBEGINN=== Begin: I2cinit I2csend Lcddataaddr , 0 Waitms 10 I2csend Lcdcntrladdr , 0 Sound Beep , 250 , 1000 'Ein bisschen gepiepse zum Anfang... Sound Beep , 250 , 900 Sound Beep , 250 , 800 Sound Beep , 500 , 500 A = Sirene(3) 'Ich komme... 'Waitms 500 'Watren '====Eigentlicher PROGRAMMSTART==== Source: 'TESTPROGRAMM I2csend Lcddataaddr , 56 'Mit 2 Zeilen initialisieren... Waitms 10 I2csend Lcdcntrladdr , 1 Waitms 10 I2csend Lcdcntrladdr , 0 Waitms 10 I2csend Lcddataaddr , 12 'Einschalten Waitms 10 I2csend Lcdcntrladdr , 1 Waitms 10 I2csend Lcdcntrladdr , 0 Waitms 10 I2csend Lcddataaddr , 2 'Cursor HOME Waitms 10 I2csend Lcdcntrladdr , 1 Waitms 10 I2csend Lcdcntrladdr , 0 Waitms 10 Lcdtext = "1babababaf2babababaf3ababababf4babababFX" A = Lcdprint(40) End 'ENDE!! '&====FUNKTIONEN UND SUBROUTINEN====& Function Lcdprint(nchars As Byte) As Byte Dim Sign As String * 1 Dim Prnt As Byte Dim Schlvar3 As Byte For Schlvar3 = 1 To Nchars Sign = Mid(lcdtext , Schlvar3 , 1) Prnt = Asc(sign) I2csend Lcddataaddr , Prnt Waitms Default_i2c_delay_time I2csend Lcdcntrladdr , 4 Waitms Default_i2c_delay_time I2csend Lcdcntrladdr , 5 Waitms Default_i2c_delay_time I2csend Lcdcntrladdr , 4 Waitms Default_i2c_delay_time Next End Function Im LCD steht: 1babababaf2babababaf und in der unteren Linie nix. Das alles funktioniert richtig, wenn man die ersten 20 Zeichen alleine Schickt, und die anderen 20 auch alleine. Dann steht alles richtig. Da ist irgendein kleines Problem. Seit gestern Abend tüftel' ich jetzt schon... Viele liebe Grüße, und Danke schon jetzt! Tobi
Schau mal ins Datenblatt der LCD-Anzeige und richte dort dein Augenmerk auf die Adressen der ersten und zweiten Zeile. Du schreibst alle 40 Zeichen in die erste Zeile. Die sind auch da, bloß sind nur die ersten 20 "sichtbar", weil du die Anzeige/den Cursor nicht "shiftest" !!
was für ein LCD hast du denn? es könnte sein, das Du nach 20 Zeichen eine extra Spalten- und Zeichenadresse senden solltest (so was wie GoToXY). Bei einigen LCD's gibt's leider keine interne Autoincrementfünktion bei dem "Spaltenwechsel" Also angenommen 1.Zeile-1.Spalte hat Adresse 00h und 1.Zeile 20. Spalte hat die Adresse (20-1 to hex) = 13h. Dann hat die 1. Spalte in der 2. Zeile nicht die Adresse 14h sondern in deinem Fall wahrscheinlich 20h. also die 12 Zeichen zwischen 14h und 1Fh ( gehen verloren... ) :-( Ich rate Dir mal Datenblatt deines LCD-Controllers nachzuguken... mfg Lodar
Hi! Das hab' ich mir auch schon gedacht. Aber wen ich mit einer entloßschleife z.B."a" sende, wird automatisch in die zweite Zeile gewechselt. Datenblatt des LCDs: http://www.reichelt.de/inhalt.html?SID=12QVGPENS4AQwAAFST-7Uda05f517eb821c36aa37db532025ee5b;ACTION=7;LASTACTION=6;SORT=artikel.artnr;GRUPPE=A5211;WG=0;SUCHE=202a;CONNECT=AND;SORT_SEARCH=standard;ARTIKEL=LCD%2520202A;START=0;END=16;FOLDER=A500;FILE=LCD202A%2523DIS.pdf;STATIC=0;FC=669;PROVID=0;TITEL=0;DOWNLOADTYP=1;DATASHEETAUTO= Vielen Dank soweit!! Tobi
Ist auch logisch, weil bei der Endlosschleife auch die Adressen weitergezählt werden und so auch irgendwann die 40h (Beginn 2,Zeile)und höher erreicht wird !!
HI! Das klingt logisch! Es funktioniert! Ich habe das Steuerzeichen dec. 192 gesendet und daraufhin funktioniert es. Danke für eure Hilfe!! Viele liebe Grüße, Tobi
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.