Cursor setzen LCD Display

OP #4110616
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
Angehängte Dateien:
OP #4110780
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
Gast #4110831
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.
#4110839
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
}
OP #4112042
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
Gast #4112070
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
//======================================

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren