Forum: Mikrocontroller und Digitale Elektronik Selbstdefiniertes Zeichen in LCD Laden


von Gargoyl (Gast)


Lesenswert?

Hallo,

ich bekomm es einfach nicht hin ein eigenes Zeichen in ein LCD Display 
zu laden. Hab schon das ganze Forum durchblättert nach ähnlichen Threads 
aber wirklich geholfen hat es nicht.

Das Prinzip ist klar auch wenn sich die aussagen zur Addressierung 
unterscheiden...

Mein Ansatz sieht wie folgt aus:
1
void lcd_load_signs ( void )
2
{
3
  unsigned char i, cfg_msg[4];
4
  unsigned char initvalues[]= {
5
  0x40,  //CG Ram-adr auf 0 setzen
6
7
  0x04,  //1. Zeile
8
  0x04,  //2. Zeile
9
  0x0A,  //3. Zeile
10
  0x0A,  //4. Zeile
11
  0x0A,  //5. Zeile
12
  0x11,  //6. Zeile
13
  0x11,  //7. Zeile
14
  0x00,  //8. Zeile
15
      
16
  0x01   // Display Löschen
17
  };
18
19
  for ( i = 0; i < 11; i++)
20
  {
21
    cfg_msg[0] = ( initvalues[i] >> 4 ) | 0xC0; //MSB + EA
22
    cfg_msg[1] = ( initvalues[i] >> 4 ) | 0x80; //MSB 
23
    cfg_msg[2] = ( initvalues[i] ) | 0xC0; //LSB +EA
24
    cfg_msg[3] = ( initvalues[i] ) | 0x80; //LSB 
25
    i2c_send_msg (cfg_msg, 4, LCD_ADR);
26
  }
27
}
Das Display wird im 4 Bismodus über einen i/o Baustein angesteuert. Aus 
diesem Grund betreibe ich es immer im 4 Bitmodus und das normale 
Schreiben und Konfigurieren klappt auch einwandfrei...
Hoffe einer von euch hat eine Idee dazu was falsch sein könnte

grüße

Gargoyl

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Ich hab zwar jetzt keine Ahnung von C, aber wenn deine Ausgaberoutine 
funktioniert, dann stimmen zumindest die Daten, welche du sendest. 
Allerdings musst du die Daten ins CG-RAM schreiben und nicht ins DD-RAM. 
Laut deinen Kommentaren schreibst du aber ins DD-RAM. Prüf das mal.

Sven

von Gargoyl (Gast)


Lesenswert?

So, Fehler gefunden =)
1
void lcd_load_signs ( void )
2
{
3
  unsigned char i, cfg_msg[4];
4
  unsigned char initvalues[]= {
5
  0x40,
6
7
  0x0E,
8
  0x0E,
9
  0x04,
10
  0x0E,
11
  0x15,
12
  0x04,
13
  0x0A,
14
  0x00,
15
      
16
  0x01
17
  };
18
19
  cfg_msg[0] = 0x44;
20
  cfg_msg[1] = 0x04;
21
  cfg_msg[2] = 0x40;
22
  cfg_msg[3] = 0x00;
23
  i2c_send_msg (cfg_msg, 4, LCD_ADR);
24
25
  for ( i = 1; i < 9; i++)
26
  {
27
    cfg_msg[0] = ( initvalues[i] >> 4 ) | 0x60;
28
    cfg_msg[1] = ( initvalues[i] >> 4 ) | 0x20;
29
    cfg_msg[2] = ( initvalues[i] & 0x0F ) | 0x60;
30
    cfg_msg[3] = ( initvalues[i] & 0x0F) | 0x20;
31
    i2c_send_msg (cfg_msg, 4, LCD_ADR);
32
  }
33
34
  cfg_msg[0] = 0x40;
35
  cfg_msg[1] = 0x00;
36
  cfg_msg[2] = 0x41;
37
  cfg_msg[3] = 0x01;
38
  i2c_send_msg (cfg_msg, 4, LCD_ADR);
39
}

Fehler lag beim schreiben der Daten da diese werder im CG noch im D Ram 
gelandet sind.

Danke an Stefan für den hinweis ;)

grüße

Gargoyl

von Frank aus Köln (Gast)


Lesenswert?

Hallo  Gargoyl,

das setzen der CG_ram Adresse ist ein Steuerbefehl ( RS = 0 ).
Dann sendest du die 8 Byte als Displaydaten ( RS = 1 ) und dann den 
Clear_Home wieder mit RS = 1.

Gruß aus Köln

Frank

von Juergen (Gast)


Lesenswert?

Hallo,

ich versuche derzeit auch selbstdefinierte Zeichen am LCD auszugeben. 
Zur info, ich arbeite mit Codevision C.
Der folgende Code gibt leider noch gar nichts aus.
Hier mein Code:
1
void show_sign (void)
2
{  
3
   unsigned char byte[8], n, cgAdr, z;   
4
   cgAdr=0b01000000; //DB7=0 DB6=1 DB5-0=Adr

Hier setze ich die Code generator ram adr auf Null, richtig? Falls es 
richtig ist und ich die cgAdr auf Null setze, wie kann ich dann später 
das Zeichen anzeigen welches hier liegt?
1
 
2
   // High nibble
3
   LCD_PORT = (0<<RS); 
4
   LCD_PORT |= (cgAdr&0xf0); 
5
   EN=1; for(z=0;z<5;z++)z=z; EN=0;
Zur 3. Codezeile: EN ist der enable Pin. Ist das so richtig?
1
  
2
   // Low nibble
3
   LCD_PORT = (0<<RS);
4
   LCD_PORT |= (cgAdr<<4)&0xf0;
5
   EN=1; for(z=0;z<5;z++)z=z; EN=0;
6
7
   // Array füllen
8
   byte[0] = 0b00000000;
9
   byte[1] = 0b00001010;
10
   byte[2] = 0b00001010;
11
   byte[3] = 0b00000000;
12
   byte[4] = 0b00000100;
13
   byte[5] = 0b00010001;
14
   byte[6] = 0b00001010;
15
   byte[7] = 0b00000100;
16
   
17
   // Array in den CG RAM schreiben
18
   for(n=0; n<8;n++){
19
       // Data to be sent
20
       // high nibble
21
       LCD_PORT = (1<<RS);
22
       LCD_PORT |= (byte[n]&0xf0);
23
       EN=1; for(z=0;z<5;z++)z=z; EN=0;
24
      
25
       // low nibble
26
       LCD_PORT = (1<<RS);
27
       byte[n] = byte[n]<<4;      //juergen
28
       LCD_PORT |= (byte[n]&0xf0);
29
       EN=1; for(z=0;z<5;z++)z=z; EN=0;
30
   }
Zur Zeile mit //juergen: Ist es richtig / nötig hier die Bits zu shiften 
oder kann ich die Bits "unten" stehen lassen und mit &0f maskieren?

Bis hier ist mir das Prinzip klar, wenns aber zum anzeigen geht hab ich 
meine probleme!
1
// CG RAM verlassen, indem man Set DD RAM Address oder Display Clear aufruft
2
   //...
3
   lcd_clear();
4
   // Zeichen ausgeben
5
   // high nibble
6
   LCD_PORT = (1<<RS);
7
   LCD_PORT |= (0&0xF0);
8
   EN=1; for(z=0;z<5;z++)z=z; EN=0;
9
   // low nibble
10
   LCD_PORT = (1<<RS);
11
   LCD_PORT |= sentVal<<4;
12
   EN=1; for(z=0;z<5;z++)z=z; EN=0;
13
}
Der Code ist vom netz übernommen und mir ist nicht klar was in der 
Variable sentVal zu stehen hat??!

Der Code stammt von dieser Seite (befindet sich ganz unten):
http://www.hs-augsburg.de/~hhoegl/tmp/da-liehr/Tutorial/programmierung/lcd.html

lg Jürgen

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.