Selbstdefiniertes Zeichen in LCD Laden

Gast #913592
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
Gast
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
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.