Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: LCD probleme (Software) Kategorie: Programmierung Basic (von André H. - 6.02.2006 12:30)
 Als Antwort auf LCD probleme (Software) von Andreas - 5.02.2006 17:45
Hallo Andi,

> kann man ein LCD zeilenweise Löschen? Hintergrund...bei meinem laienhaften zusammengebastelten Programm wird das LCD gelöscht...nun dauert es ein wenig bis die Zeile 2 wieder da steht. Es tritt also ähnlich wie ein flackern auf.

Das Löschen vom Display sollte man vermeiden, wenn nur einzelne Werte aktualisiert werden sollen.
Es ist dann besser, einfach den Cursor an die entsprechnden stellen zu positionieren und dort
die alten Werte einfach zu überschreiben.

Alternativ kann man natürlich eine komplette Zeile quasi löschen, indem man
den Cursor auf den Zeilenanfang setzt und einfach soviele Leerzeichen ausgibt, wie
das LCD Zeichen pro Zeile hat. (z.B. mittels Print)

> Und zum anderen sendet meine Station immer Leerzeichen über serielle schnittstelle und ich weiß net wo es her kommt.

Das kommt daher, da Du an einigen Stellen in Deinem Code kein Semikolon (Strichpunkt)
nach dem Print hast, sondern einen Doppelpunkt.
Denn ohne semikolon wird noch CR+LF ausgebenen, und das geschieht dann über RS232.
Dazu muß man wissen, wie der Compiler die Prinanweisungen kompiliert:
Ein print "irgendetwas" erzeigt zwei Printanweisungen.
Die erste mit "irgendetwas" und eine zweite, die CR+LF sendet.
Nur wenn man nach dem print ein Semikolon setzt, wird das unterdrückt.
Mit meinem ASM-Treiber wird die Printanweisung dazu "mißbraucht" Festtexte
in den Quellcode einzufügen.
Der ASM-Treiber "schnappt" sich den aktuellen Programmpointer, überließt das folgende Byte
und gibt alle folgenden Bytes solange am LCD aus, bis der Wert 0 kommt(ASCII 0 =Textende),
um das mal grob zu beschreiben.

 
> Kann mal bitte wer über mein zusammengeschustertes Programm drüberschauen? Danke

Benutze bitte die Code-Tags, wenn Du Quellcode postest.
Man kann diesen dann leichter lesen.
Weitere Anmerkungen in Deinem Programm:


define ds port[10] ' diese 3 Definitionen
define shclk port[9] ' kannst Du entfernen. Ich hatte
define stclk port[12] ' vergessen, diese bei den I²C-Beispielen zu löschen.

define cmd byte[3]
define i byte[2]
define LCDLight Bit[192]
 
define LCD_RS_0 &B10 : define LCD_RS_1 &B11 :define LCD_nowrite &B0
define prnLCD &h197
define PCFread &h10e
define PCFwrite &h101
define PCF 64
 
define wert byte[1]' Byte zum Zwischenspeichern der
define P0 Bit[1]   ' Portzustände. Es kann jedes
define P1 Bit[2]   ' beliebige Byte vom RAM gewählt
define P2 Bit[3]   ' werden.
define P3 Bit[4]
define P4 Bit[5]
define P5 Bit[6]
define P6 Bit[7]
define P7 Bit[8]

'ASCII
Define A_ &H41 : Define B_ &H42 : Define C_ &H43 : Define D_ &H44 : Define E_ &H45
Define F_ &H46 : Define G_ &H47 : Define H_ &H48 : Define I_ &H49 : Define J_ &H4A
Define K_ &H4B : Define L_ &H4C : Define M_ &H4D : Define N_ &H4E : Define O_ &H4F
Define P_ &H50 : Define Q_ &H51 : Define R_ &H52 : Define S_ &H53 : Define T_ &H54
Define U_ &H55 : Define V_ &H56 : Define W_ &H57 : Define X_ &H58 : Define Y_ &H59 : Define Z_ &H5A
Define ak &H61 : Define bk &H62 : Define ck &H63 : Define dk &H64 : Define ek &H65
Define fk &H66 : Define gk &H67 : Define hk &H68 : Define ik &H69 : Define jk &H6A
Define kk &H6B : Define lk &H6C : Define mk &H6D : Define nk &H6E : Define ok &H6F
Define pk &H70 : Define qk &H71 : Define rk &H72 : Define sk &H73 : Define tk &H74
Define uk &H75 : Define vk &H76 : Define wk &H77 : Define xk &H78 : Define yk &H79 : Define zk &H7A
Define SPACE &H20 : Define MINUS &H2D : Define GLEICH &H3D : Define DPP &H3A
Define Dot &H2E
Define Line1 &H80 : Define Line2 &HC0  'Für 2x20 LCD
'Define Line1 &H80 : Define Line2 &HC0 : Define Line3 &H90 : Define Line4 &HD0 'Für 4x16 LCD
'-----------------------------------------

define Temp2 ad[6] 'Tempsensor 2
define sck port[3]
define dataout port[4]


define f1 word [8]               'eingefügt
define ts word [9]
define shtvalue word [10]
define xy word [11]
define cme byte [4]
define k byte [5]
define j byte [6]
define test1 byte [7]
define test2 byte [8]
define test3 byte [9]
define test4 byte [10]


'----------------------------------------
gosub LCD_Init
LCDLight=ON : gosub setPCFLight
#loop

'-----------------------------------------
gosub sht11


'-----------------------------------------
gosub LCD_CLS

Statt das Display hier zu löschen, kannst Du einfach den Cursor fest positionieren:

cmd=Line1 : gosub LCD_CMD

Da alles nachfolgende fest formatiert ist, braucht man nichts vorher löschen.

cmd=hour : gosub LCD_Zahl2null
cmd=DPP : gosub LCD_Char
cmd=minute : gosub LCD_Zahl2null
cmd=DPP : gosub LCD_Char
cmd=second : gosub LCD_Zahl2null
cmd=space : gosub LCD_Char
cmd=space : gosub LCD_Char
cmd=space : gosub LCD_Char
cmd=space : gosub LCD_Char

Statt den Leerzeichen kannst Du auch einfach den Cursor setzen. Das ist schneller:
cmd=Line1+12 : gosub LCD_CMD
So wird einfach der an die vorgesehen Position (nach 12ten Zeichen) in Zeile 1 gesetzt.

sys prnLCD,LCDLight,0,PCF : print "T1=";
cmd=test3 : gosub LCD_zahl2
sys prnLCD,LCDLight,0,PCF : print ",":

Hier setzt Du hinter print einen Doppelpunkt. Es gehört aber ein Semikolon hin.
Einzelne Zeichen sollten lieber mit LCD_Char ausgegeben werden. Das belegt weniger Platz:

cmd=&h2c : gosub LCD_Char 'Komma

Mit Define kannst Du das Komma auch als Konstante anlegen. Dann mußt du Dir den
Wert nicht merken.


cmd=test4 : gosub LCD_zahl2null

cmd=Line2 : gosub LCD_CMD
cmd=day : gosub LCD_Zahl2null
cmd=Dot : gosub LCD_Char
cmd=month : gosub LCD_Zahl2null
sys prnLCD,LCDLight,0,PCF : print ".20";
cmd=year : gosub LCD_Zahl2null
cmd=space : gosub LCD_Char
cmd=space : gosub LCD_Char
sys prnLCD,LCDLight,0,PCF : print "LF=";
cmd=test1 : gosub LCD_zahl2
sys prnLCD,LCDLight,0,PCF : print ",":
Hier wieder: Semikolon statt Doppelpunkt setzen.

cmd=test2 : gosub LCD_zahl2null

pause 45

gosub LCD_CLS
cmd=hour : gosub LCD_Zahl2null
cmd=DPP : gosub LCD_Char
cmd=minute : gosub LCD_Zahl2null
cmd=DPP : gosub LCD_Char
cmd=second : gosub LCD_Zahl2null
cmd=space : gosub LCD_Char
cmd=space : gosub LCD_Char
cmd=space : gosub LCD_Char
cmd=space : gosub LCD_Char
sys prnLCD,LCDLight,0,PCF : print "T1=";
cmd=test3 : gosub LCD_zahl2
sys prnLCD,LCDLight,0,PCF : print ",":
Hier wieder: Semikolon statt Doppelpunkt setzen.

cmd=test4 : gosub LCD_zahl2null

cmd=Line2 : gosub LCD_CMD
cmd=day : gosub LCD_Zahl2null
cmd=Dot : gosub LCD_Char
cmd=month : gosub LCD_Zahl2null
sys prnLCD,LCDLight,0,PCF : print ".20";
cmd=year : gosub LCD_Zahl2null
cmd=space : gosub LCD_Char
cmd=space : gosub LCD_Char
sys prnLCD,LCDLight,0,PCF : print "LF=":
Hier wieder: Semikolon statt Doppelpunkt setzen.

cmd=test1 : gosub LCD_zahl2
sys prnLCD,LCDLight,0,PCF : print ",":
Hier wieder: Semikolon statt Doppelpunkt setzen.

cmd=test2 : gosub LCD_zahl2null

pause 45
goto loop
...
...



MfG André H.

 Antwort schreiben

Bisherige Antworten: