Ansteuerung EA DIP203-LCD

#3991479
Lesenswert?

Moin,

ich habe ein EA DIP203-LCD mit grüner Hintergrundbeleuchtung. Im Betrieb 
zeigt sich ein schwarzer Hintergrund mit heller Schrift. anscheinend ist 
das Display invertiert. Gibt es ein konkretes Bit, welches sie 
Invertierung steuert? welche Bitkombination muss gewählt werden, um die 
Invertierung rückgängig zu machen und so die Schrift auf Schwarz und den 
Hintergrund auf hell zu schalten?

Gruß
Angehängte Dateien:
#3991709
Lesenswert?

Hier mal der Code:
1
void lcd_init( void )
2
{
3
    // verwendete Pins auf Ausgang schalten
4
    uint8_t pins = (0x0F << LCD_DB) |           // 4 Datenleitungen
5
                   (1<<LCD_RS) |                // R/S Leitung
6
                   (1<<LCD_EN);                 // Enable Leitung
7
    LCD_DDR |= pins;
8
 
9
    // initial alle Ausgänge auf Null
10
    LCD_PORT &= ~pins;
11
 
12
    // warten auf die Bereitschaft des LCD
13
    _delay_ms( LCD_BOOTUP_MS );
14
 
15

16
    lcd_out( LCD_SOFT_RESET );
17
    _delay_ms( LCD_SOFT_RESET_MS1 );
18
 
19
    lcd_enable();
20
    _delay_ms( LCD_SOFT_RESET_MS2 );
21
 
22
    lcd_enable();
23
    _delay_ms( LCD_SOFT_RESET_MS3 );
24
 
25
    // 4-bit Modus aktivieren 
26
    lcd_out( LCD_SET_FUNCTION |
27
             LCD_FUNCTION_4BIT );
28
    _delay_ms( LCD_SET_4BITMODE_MS );
29
 
30
    // 4-bit Modus / 2 Zeilen / 5x7
31
    lcd_command( LCD_SET_FUNCTION |
32
                 LCD_FUNCTION_4BIT |
33
                 LCD_FUNCTION_4Line |
34
                 //LCD_FUNCTION_2LINE |
35
                 LCD_FUNCTION_5X7 |
36
                 0x20);
37
 
38
    // Display ein / Cursor aus / Blinken aus
39
    lcd_command( LCD_SET_DISPLAY |
40
                 LCD_DISPLAY_ON |
41
                 LCD_CURSOR_OFF |
42
                 LCD_BLINKING_OFF); 
43
 
44
    // Cursor inkrement / kein Scrollen
45
    lcd_command( LCD_SET_ENTRY |
46
                 LCD_ENTRY_INCREASE |
47
                 LCD_ENTRY_NOSHIFT );
48
 
49
    lcd_clear();
50
}
1
// Set Function --------------- 0b001xxxxx
2
#define LCD_SET_FUNCTION        0x20
3
 
4
#define LCD_FUNCTION_4BIT       0x00
5
#define LCD_FUNCTION_8BIT       0x10
6
#define LCD_FUNCTION_1LINE      0x00
7
#define LCD_FUNCTION_2LINE      0x08
8
#define LCD_FUNCTION_5X7        0x00
9
#define LCD_FUNCTION_5X10       0x04
10
#define LCD_FUNCTION_test       0x01
11
#define LCD_FUNCTION_4Line      0x09
12
#define LCD_FUNCTION_test       0x20
13
  
14
#define LCD_SOFT_RESET          0x30
LCD_FUNCTION_test soll die Invertierung aufheben.
#3991739
Lesenswert?

Marco G. schrieb:

> LCD_FUNCTION_test soll die Invertierung aufheben.

Schön.
Wird aber im Code gar nicht verwendet.

Aber das hier
1
#define LCD_FUNCTION_4Line      0x09

funktioniert im Zusammenhang mit dem hier
1
    lcd_command( LCD_SET_FUNCTION |
2
                 LCD_FUNCTION_4BIT |
3
                 LCD_FUNCTION_4Line |
4
                 //LCD_FUNCTION_2LINE |
5
                 LCD_FUNCTION_5X7 |
6
                 0x20);

so nicht.
Siehe das Initialisierungsbeispiel auf der Seite 3.
Um auf 4 Zeilen zu schalten sind offenbar 2 Bytes notwendig.
Erst mal muss ein SET_FUNCTION gemacht werden, bei dem das Bit "RE" 
(extension) den Wert 1 hat. Nach diesem Befehl wird ein weiteres Byte 
eingeschoben, in dem dann das Bit für den 4-Zeilen Modus sitzt.

Interesssanterweise hast du mit 0x09 genau das 'Reverse' Bit gesetzt.
#3991751
Lesenswert?

Karl Heinz schrieb:

> Erst mal muss ein SET_FUNCTION gemacht werden, bei dem das Bit "RE"
> (extension) den Wert 1 hat. Nach diesem Befehl wird ein weiteres Byte
> eingeschoben, in dem dann das Bit für den 4-Zeilen Modus sitzt.

Konkreter funktioniert das so:

In der Befehlstabelle ist die erste Spalte das RE Bit.
Je nachdem ob dieses Bit 0 oder 1 ist, haben ein paar der Befehle 
unterschiedliche Interpretation in den Bits.

Um das RE Bit auf 0 oder 1 zu kriegen ist ein "Function Set" Kommando 
notwendig. Mit dem kann das RE Bit auf den gewünschten Zustand gebracht 
werden und schaltet so zum Beispiel zwischen dem Kommado "Display 
on/off" und dem Kommando "extended Function Set" um, wenn vom LCD ein 
Kommando Byte empfangen wird, welches mit der Bitsequenz "0b00001xxx" 
das Kommando identifiziert.
#3991778
Lesenswert?

Ich habe jetzt folgendes probiert, aber irgendwie funktioniert das noch 
nicht richtig:

lcd_command(0x24| //setzte 4Bit-Modus RE=1
            0x09);//setze 4-Zeilen Modus

lcd_command(0x20| //setzte 4Bit-Modus RE=0
            0x08);

Wenn ich die erste Variante wähle, gibt es zwei Zeilen invertiert, bei 
der zweiten Variante vier Zeilen nicht invertiert. Worin ist mein 
Denkfehler?
#3991785
Lesenswert?

Marco G. schrieb:
> Ich habe jetzt folgendes probiert, aber irgendwie funktioniert das noch
> nicht richtig:
>
> lcd_command(0x24| //setzte 4Bit-Modus RE=1
>             0x09);//setze 4-Zeilen Modus

2 Kommandos! Hintereinander!
1
   lcd_command( 0x24 );   // Function Set, wobei RE auf 1 geschaltet wird
2
   lcd_command( 0x09 );   // d.h. das hier ist nicht mehr das Kommando
3
                          // "Display on/off", sondern das Kommando "extended Function set"

ist doch wirklich nicht so schwer.


Und danach würde ich das RE Bit mit einem weiteren Function Set Kommando 
wieder auf 0 setzen.
#3991864
Lesenswert?

Ich kann durch die Sequenz

lcd_command( 0x24 );
lcd_cómmand( 0x09 );
lcd_command( 0x20 );

den vierzeiligen Modus aktivieren. Wenn ich wieder auf den zweizeiligen 
Modus zurück möchte, muss ich doch einfach die Änderung rückgängig 
machen, also so:

lcd_command( 0x24 );
lcd_cómmand( 0x08 );
lcd_command( 0x20 );

Stimmt das so, oder habe ich noch etwas übersehen?
#3991913
Lesenswert?

> lcd_command( 0x20 );
Ich hätt halt 0x28 genommen, da du ja auf 2 zeilig willst.

D.h. eigentlich hätt ich auch nicht 0x28 genommen, sondern
1
    lcd_command( LCD_SET_FUNCTION |
2
                 LCD_FUNCTION_4BIT |
3
                 LCD_FUNCTION_2LINE |
4
                 LCD_FUNCTION_5X7 );
weils dann halt doch lesbarer ist, als eine Hex-Zahl. Auch wenns letzten 
Endes ohnehin für den µC aufs gleiche rausläuft.
#3991937
Lesenswert?

Wobei sich die Frage erhebt, ob das überhaupt möglich ist.
Wozu sollte man das auch tun, ein eigentlich 4 zeiliges LCD in einem 2 
Zeilen Modus betreiben. Die physikalisch ins Glas geätzten Pixel werden 
deswegen ja nicht mehr oder weniger.
Wenn du nur 2 der physikalisch vorhandenen 4 Zeilen benutzen willst, 
dann beschreib halt nur die beiden Zeilen.
#3991985
Lesenswert?

Ach MIst, da hab ich mich auch verhaut.
Wenn das RE Bit erst mal auf 1 gesetzt ist, dann gilt ja nicht mehr die 
von dir eingekringelte INterpretation, sondern die darunter.

D.h. das ist ein mehrstufiger Prozess
* mit einem FUNCTION SET erst mal das RE Bit auf 1 setzen
* dann den 4-Zeilen Modus ausschalten
* dann mit der 'unteren' Interpretation das RE Bit wieder auf 0 setzen 
(momentan steht es ja noch auf 1)
* und erst dann gilt wieder die eingekringelte Version und du kannst auf 
2 Zeilen (bzw. Revers/Not Reverse) schalt
Angehängte Dateien:

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