
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
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 |