mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Selbstdefiniertes Zeichen in LCD Laden


Autor: Gargoyl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void lcd_load_signs ( void )
{
  unsigned char i, cfg_msg[4];
  unsigned char initvalues[]= {
  0x40,  //CG Ram-adr auf 0 setzen

  0x04,  //1. Zeile
  0x04,  //2. Zeile
  0x0A,  //3. Zeile
  0x0A,  //4. Zeile
  0x0A,  //5. Zeile
  0x11,  //6. Zeile
  0x11,  //7. Zeile
  0x00,  //8. Zeile
      
  0x01   // Display Löschen
  };

  for ( i = 0; i < 11; i++)
  {
    cfg_msg[0] = ( initvalues[i] >> 4 ) | 0xC0; //MSB + EA
    cfg_msg[1] = ( initvalues[i] >> 4 ) | 0x80; //MSB 
    cfg_msg[2] = ( initvalues[i] ) | 0xC0; //LSB +EA
    cfg_msg[3] = ( initvalues[i] ) | 0x80; //LSB 
    i2c_send_msg (cfg_msg, 4, LCD_ADR);
  }
}
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

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gargoyl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, Fehler gefunden =)
void lcd_load_signs ( void )
{
  unsigned char i, cfg_msg[4];
  unsigned char initvalues[]= {
  0x40,

  0x0E,
  0x0E,
  0x04,
  0x0E,
  0x15,
  0x04,
  0x0A,
  0x00,
      
  0x01
  };

  cfg_msg[0] = 0x44;
  cfg_msg[1] = 0x04;
  cfg_msg[2] = 0x40;
  cfg_msg[3] = 0x00;
  i2c_send_msg (cfg_msg, 4, LCD_ADR);

  for ( i = 1; i < 9; i++)
  {
    cfg_msg[0] = ( initvalues[i] >> 4 ) | 0x60;
    cfg_msg[1] = ( initvalues[i] >> 4 ) | 0x20;
    cfg_msg[2] = ( initvalues[i] & 0x0F ) | 0x60;
    cfg_msg[3] = ( initvalues[i] & 0x0F) | 0x20;
    i2c_send_msg (cfg_msg, 4, LCD_ADR);
  }

  cfg_msg[0] = 0x40;
  cfg_msg[1] = 0x00;
  cfg_msg[2] = 0x41;
  cfg_msg[3] = 0x01;
  i2c_send_msg (cfg_msg, 4, LCD_ADR);
}

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

Autor: Frank aus Köln (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Juergen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void show_sign (void)
{  
   unsigned char byte[8], n, cgAdr, z;   
   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?
 
   // High nibble
   LCD_PORT = (0<<RS); 
   LCD_PORT |= (cgAdr&0xf0); 
   EN=1; for(z=0;z<5;z++)z=z; EN=0;
Zur 3. Codezeile: EN ist der enable Pin. Ist das so richtig?
  
   // Low nibble
   LCD_PORT = (0<<RS);
   LCD_PORT |= (cgAdr<<4)&0xf0;
   EN=1; for(z=0;z<5;z++)z=z; EN=0;

   // Array füllen
   byte[0] = 0b00000000;
   byte[1] = 0b00001010;
   byte[2] = 0b00001010;
   byte[3] = 0b00000000;
   byte[4] = 0b00000100;
   byte[5] = 0b00010001;
   byte[6] = 0b00001010;
   byte[7] = 0b00000100;
   
   // Array in den CG RAM schreiben
   for(n=0; n<8;n++){
       // Data to be sent
       // high nibble
       LCD_PORT = (1<<RS);
       LCD_PORT |= (byte[n]&0xf0);
       EN=1; for(z=0;z<5;z++)z=z; EN=0;
      
       // low nibble
       LCD_PORT = (1<<RS);
       byte[n] = byte[n]<<4;      //juergen
       LCD_PORT |= (byte[n]&0xf0);
       EN=1; for(z=0;z<5;z++)z=z; EN=0;
   }
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!
// CG RAM verlassen, indem man Set DD RAM Address oder Display Clear aufruft
   //...
   lcd_clear();
   // Zeichen ausgeben
   // high nibble
   LCD_PORT = (1<<RS);
   LCD_PORT |= (0&0xF0);
   EN=1; for(z=0;z<5;z++)z=z; EN=0;
   // low nibble
   LCD_PORT = (1<<RS);
   LCD_PORT |= sentVal<<4;
   EN=1; for(z=0;z<5;z++)z=z; EN=0;
}
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/Tut...

lg Jürgen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.