tobimc
12.10.2004, 13:39
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.
Aber ich und avatar wissen nicht, wo es ist!
Seit gestern Abend tüfteln wir jetzt schon...
Viele liebe Grüße, und Danke schon jetzt!
Tobi
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.
Aber ich und avatar wissen nicht, wo es ist!
Seit gestern Abend tüfteln wir jetzt schon...
Viele liebe Grüße, und Danke schon jetzt!
Tobi