Forum: Mikrocontroller und Digitale Elektronik Cursor setzen LCD Display


von Daniel E. (everyday_fun69)


Angehängte Dateien:

Lesenswert?

Hallo Forumsteilnehmer,

ich habe an meinem PIC18F4580 ein 4x40 Display, welches mehrseitig 
beschrieben ist und alles funzt wunderbar.

Da ich auch Zahlen darstelle, welche ich verändern möchte, möchte ich 
den Cursor blinkend zum Anzeigen der Zahl, welche ich grad verstellen 
kann benutzen.

Schreib ich CURSOR_ON mit in die OpenXLCD rein, so hab ich in der 3. 
Zeile alles Kästchen.


OpenXLCD(FOUR_BIT & LINES_5X7 ); Zeile 1 und 2
while( BusyXLCD() ) { }

Delay1KTCYx(75);

OpenXLCD_2(FOUR_BIT & LINES_5X7 & CURSOR_ON ); Zeile 3 und 4
while( BusyXLCD_2() ) { }

Kann mir jemand einen Tip geben, was ich für eine Reihenfolge abarbeiten 
muss? Ich benutze MPLAb C18.

Es gibt auch noch den Befehl BLINK_ON. Muss ich gar beide benutzen?

Danke im Voraus.

Daniel

von Seppel (Gast)


Lesenswert?

Daniel EGAL schrieb:
> (FOUR_BIT & LINES_5X7 & CURSOR_ON );

Bist Du Dir sicher, das Du das mit & und nicht mit | verknüpfen mußt?
Kenne das von den AVRs so.

von Toxic (Gast)


Angehängte Dateien:

Lesenswert?

Ich wuerde die WriteCmdXLCD-Funktion verwenden.Beispiele sind in der 
pdf-Datei angegeben.
Hab den Lib-Sourcecode nicht gecheckt, aber offensichtlich lassen sich 
nur mit dieser Funktion (im Gegensatz zur OpenXLCD)verschiedene 
Displayeinstellungen vornehmen.

von Falk B. (falk)


Lesenswert?

Versuch mal

void SetDDRamAddr(PARAM_SCLASS unsigned char);

von Daniel E. (everyday_fun69)


Lesenswert?

Hallo und Danke für den Tip !!

Schreib ich nur

WriteCmdXLCD( BLINK_ON ); steht der Cursor an der ersten Stelle. Schreib 
ich

SetDDRamAddr((unsigned char) 3);  // 1. Zeile 4 Stelle im Display

WriteCmdXLCD( BLINK_ON );


für die 4. Stelle steht der Cursor trotzdem an der ersten Stelle. Was 
mache ich nur falsch?


Vorab Danke.

Daniel

von Toxic (Gast)


Lesenswert?

Vergiss nicht die Zeile:

 while( BusyXLCD() );

vor dem Aufruf von setDDram/writeCMd-Funktionen zu verwenden.
Also immer wenn Du eine Funktion aufrufst, muss zuvor das Busy-Flag 
getestet werden,ansonsten schreibst Du Daten oder Commands zum Display 
die der Lcd-Kontroller nicht verarbeiten kann,weil er noch mit was 
anderem beschaeftigt ist.

von Falk B. (falk)


Lesenswert?

@Daniel EGAL (everyday_fun69)

>SetDDRamAddr((unsigned char) 3);  // 1. Zeile 4 Stelle im Display

SetDDRamAddr(3); reicht

>für die 4. Stelle steht der Cursor trotzdem an der ersten Stelle. Was
>mache ich nur falsch?

SetDDRamAddr(4); sollte funktionieren.

Sinnvollerweise schreibst du dir eine Funktion zum Setzen des Cursors, 
das ist vor allem hier wichtig, weil dieses LCD 2 Controller hat (einer 
für die Zeilen 1+2, einer für 3+4.

Wie diese prinzipiell aussieht, sieht man u.a. hier.

Erweiterte LCD-Ansteuerung

1
////////////////////////////////////////////////////////////////////////////////
2
// Setzt den Cursor in Zeile y (0..3) Spalte x (0..15)
3
 
4
void lcd_setcursor( uint8_t x, uint8_t y ) {
5
    uint8_t data;
6
 
7
    switch (y) {
8
        case 0:    // 1. Zeile
9
            data = LCD_SET_DDADR + LCD_DDADR_LINE1 + x;
10
            break;
11
        case 1:    // 2. Zeile
12
            data = LCD_SET_DDADR + LCD_DDADR_LINE2 + x;
13
            break;
14
        case 2:    // 3. Zeile
15
            data = LCD_SET_DDADR + LCD_DDADR_LINE3 + x;
16
            break;
17
        case 3:    // 4. Zeile
18
            data = LCD_SET_DDADR + LCD_DDADR_LINE4 + x;
19
            break;
20
        default:    
21
            return; // für den Fall einer falschen Zeile
22
    }
23
 
24
    lcd_command( data );
25
}

von Daniel E. (everyday_fun69)


Lesenswert?

Hallo Gemeinde,

ich habe den Code mal eingebaut, jedoch steht der Cursor immer noch an 
der ersten Stelle.

while( BusyXLCD() );
SetDDRamAddr((unsigned char) 6);     // 1. Zeile im Display
WriteCmdXLCD(BLINK_ON );
SetDDRamAddr((unsigned char) 0);            // 1. Zeile im Display
putrsXLCD(( char*)"Uhrzeit");

Im übrigen habe ich für Zeile 1+2 eine xlcd.h und für Zeile 3+4 eine 
xlcd_.h. Siehe auch mein Thread hier: Funzt wunderbar.

Beitrag "Error - could not find definition of symbol 'putrsXLCD_2' in file 'D:\LCD_2015\main.o'."

Was könnte den noch die Ursache sein?

Danke und Grüße.

Daniel

von Toxic (Gast)


Lesenswert?

Daniel EGAL schrieb:
> while( BusyXLCD() );
> SetDDRamAddr((unsigned char) 6);     // 1. Zeile im Display
> WriteCmdXLCD(BLINK_ON );
> SetDDRamAddr((unsigned char) 0);            // 1. Zeile im Display
> putrsXLCD(( char*)"Uhrzeit");


Die logische Abfolge waere so:
//======================================
while( BusyXLCD() );
WriteCmdXLCD(BLINK_ON ); // dies sollte schon bei der initialisierung
                         // des Lcd's erfolgen - der Uebersicht wegen...

while( BusyXLCD() );     // Lcd ready?
SetDDRamAddr(0)          // Cursor an 1. Stelle
while( BusyXLCD() );     // Lcd ready?
putrsXLCD( "Uhrzeit" );  // Texteinblendung
while( BusyXLCD() );     // Lcd ready?
SetDDRamAddr(6);         // Cursor an 7.Stelle & sollte zudem blinken
//======================================

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
Noch kein Account? Hier anmelden.