mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD eigene Zeichen


Autor: Marco Hinrichs (purzelbaum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Einmal vorweg :-) Ich weiß, dass es schon viele solche Themen gibt und 
ich hab auch schon so einige durchgelesen.

So also ich hab folgendes problem. Ich möchte mit meinem LCD eigene 
Zeichen schreiben. Lese die Bytes seriell ein. Protokoll ist 
Crystalfontz

if(data==25)
}
while(!DataRdyUSART());
data=getcUSART();
if(data==0)
{
  lcd_data(0x40);
  cgr=0x00;
}
if(data==1)
{
  lcd_data(0x48);
  cgr=0x01;
}
if(data==2)
{
  lcd_data(0x50);
  cgr=0x02;
}
if(data==3)
{
  lcd_data(0x58);
  cgr=0x03;
}
if(data==4)
{
  lcd_data(0x60);
  cgr=0x04;
}
if(data==5)
{
  lcd_data(0x68);
  cgr=0x05;
}
if(data==6)
{
  lcd_data(0x70);
  cgr=0x06;
}
if(data==7)
{
  lcd_data(0x78);
  cgr=0x07;
}
for(i=0;i<8;i++)
{
  while(!DataRdyUSART());
  data=getcUSART();
  lcd_write(data);
}
lcd_data(line1);
lcd_write(cgr);

So wenn der PIC nun am ende der schleife ankommt passiert nichts :-)
Hoffe ihr habt eine Idee :-)

Gruß Marco

Autor: Ztalam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider keine ausreichende Infomationen.
Bitte Frage neu formulieren.
Siehe 
http://www.mikrocontroller.net/articles/Netiquette...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser Codeschnippsel sieht korrekt aus (bis auf if(data==25)}). Der 
Fehler liegt wo anders.

Autor: Marco Hinrichs (purzelbaum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin also ich hab etwas neues rausgefunden.
Entschuldigt, wenn dies nur ein "Code-Schnipsel" ist, aber auch nur dort 
liegt der Fehler. Ich kann mit meinen Routinen ganz normal Zeichen auf 
dem Display ausgeben.

So nun zu dem, was ich rausgefunden habe.
Normal läuft es ja so ab.

1. RS=0 und Adresse 0x40 laden
2. RS=1 und Daten an das LCD schicken (8x und ich hab 
auto-Inkrementierung)
3. RS=0 und Adresse 0x80 laden oder die Zeile in die man schreiben 
möchte

Zu 1.: Ich weiß nicht, ob das klappt :-) Ich vermute(auch wenn man keine 
Vermutungen machen soll), das 1. nicht geht

Zu 2.: Nun könnte ich ja z.B. 8x 0bXXX11111 schreiben. XXX wird ja 
überlesen. Gebe ich aber 0b00110010 ein müsste ja eigentlich 0bXXX10010 
gelesen werden. Aber es wird auf das LCD eine 2 geschrieben. Das dürfte 
doch gar nicht, weil ich ja in das CG Ram schreibe.

Zu 3.: Dadurch das ich bei 2. z.B 0x80 in das DD Ram schreibe gehe ich 
ja nur wieder auf Zeile 1.

Oder hab ich irgendetwas falsch verstanden? :-)

Gruß Marco

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sagt das Datenblatt deines LCD, dass das bei diesem LCD das CGRAM 
(Zeichengenerator) bei 0x40 beginnt?

Kannst du reguläre Zeichen (ASCI-Zeichen) über die Adressierung im DDRAM 
(Textpuffer) ablegen und an der Wunschposition ausgeben? Liegt lt. 
Datenblatt bei deinem LCD der Textpuffer bei 0x80?

Du hast eine kleine Verknotung bei den Funktionsnamen; die Funktionen 
benennt man üblicherweise anders


Funktion          "Normal"         Du
========================================
Byte mit RS=0    lcd_command   lcd_data
an LCD
= Steuerkommando

Byte mit RS=1    lcd_data      lcd_write
an LCD
= reg. Ausgabe

Deine Codeschnippsel würde ich leicht umordnen:

#define ESC_EIGENES_ZEICHEN 25
#define CGRAM_LCD 0x40  // Wert im Datenblatt nachsehen!
#define DDRAM_LCD 0x80  // Wert im Datenblatt nachsehen!

// Verknotete Programmierung :-)
#define LCD_COMMAND(a)  lcd_data((a))   // Byte an LCD mit RS=0
#define LCD_DATA(a)     lcd_write((a))  // Byte an LCD mit RS=1

  // ...hier kommt ein Zeichen in data für die 
  // Ausgabe auf dem LCD an...

  if( data == ESC_EIGENES_ZEICHEN )
  {
    // Nächste 1+8 Bytes für eigenes Zeichen verwenden
    // 1. Byte: Nummer des Zeichens 0..7
    while( !DataRdyUSART() );
    data = getcUSART();
    cgr = data % 8; // Nummer des Zeichens auf 0..7 begrenzen
    data = CGRAM_LCD + cgr * 8; // Startadresse im CGRRAM festlegen
    LCD_COMMAND(data);  // Schreibadresse CGRAM festlegen
    for(i=0;i<8;i++) // 8 Bytes: Bitmuster ins CGRAM übertragen
    {
      while( !DataRdyUSART() );
      data = getcUSART();
      LCD_DATA(data);
      // der CGRAM-Adresszähler inkrementiert automatisch
    }
    // Eigenes Zeichen jetzt ausgeben
    LCD_COMMAND(DDRAM_LCD); // Zeiger im DDRAM auf Anfang setzen
    LCD_DATA(cgr);
  }


Autor: Marco Hinrichs (purzelbaum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wow danke Stefan.
Das mit lcd_data und lcd_write wurde mir auch schon einmal gesagt, aber 
wie du es geschrieben hast lässt es sich schnell ändern. Werde das aber 
komplett in meiner .c und .h ändern :-)

Ich versuche mal deinen Code aus.
Wenn es nicht geklappt hat, was ich nicht hoffe, dann poste ich nochmal.

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.