www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit GLCD


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe einen AVr an ein Grafik Display (Typ:T6963) angeschlossen.
Funktioniert ohne Probleme. Leider kann ich jetzt keine Zahlen
darstellen lassen.
Hier habe ich mal den Code:
Mit diesem Code kann ich nicht alles Zahlen darstellen lassen.
Kann mir da jemand helfen?
----------------------------------------
void lcd_write_zahl(unsigned char flash data, unsigned char x,unsigned
char y,  )
{
 unsigned char zahl;
 unsigned int address;
 address= y * 22 + x + 0x1000;

 zahl = data;
 if (zahl >=0 & zahl <=9)
  {
   if (zahl == 0) data = 0x30;
   if (zahl == 1) data = 0x31;
   if (zahl == 2) data = 0x32;
   if (zahl == 3) data = 0x33;
   if (zahl == 4) data = 0x34;
   if (zahl == 5) data = 0x35;
   if (zahl == 6) data = 0x36;
   if (zahl == 7) data = 0x37;
   if (zahl == 8) data = 0x38;
   if (zahl == 9) data = 0x39;
   out(0x24, address & 0xff,address >> 8);
   out(0xC0, 0, data-0x20);
  }
 if (zahl >=10 & zahl <=99)
  {
   if(zahl == 10)
    {
     out(0x24, address & 0xff,address >> 8);
     data = 0x31;
     out(0xC0, 0, data-0x20);
     data = 0x30;
     out(0xC0, 0, data-0x20);
    }
  }


}

Autor: hebel23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum denn so umständlich? Wenn Du WinAVR verwendest, kannst Du es auch
so machen:

unsigned char buffer[10];
data = 260; // z.B.

itoa(data,buffer,10); // 10 steht für Dezimalsystem

-> in buffer[] steht jetzt ein terminierter String ("260/0"), der
direkt ans Display geschrieben werden kann.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo hebel23!

So ich habe mal deinen Vorschlag ausprobiert. leider funktioniert dies
nicht.
Kannst du mir bei dieser Funktion helfen?

--------------------------------------------
void lcd_write_zahl_xy(unsigned int x, unsigned int y, unsigned int
zahl)    // write String an pos x, y
{
  unsigned int address;
  unsigned char flash buffer[7];
  itoa(zahl,buffer);
  address = ((unsigned int)y * 22) + x + 0x1000;
  out(0x24,address & 0xff,address >> 8);

  while (*buffer)
   {
    out(0xC0,0,(*buffer++)-0x20);
   }
}

Autor: Matthias Friedrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das wirklich eine gute Idee, den buffer ins Flash zu legen?

Normalerweise muss man nach jedem befehl, den das lcd verarbeitet,
warten bis das display denselben verarbeitet hat, beispielsweise so:

while ((displayCommandRregister & 3) !=3) {};

Ausserdem geht das schreiben in den Display-Speicher mittels des
autowrite-commands wesentlich schneller.

Zudem sind in dem oberen Codeschnipsel die UND-Verknüpfungen falsch:
die syntax ist (a && b) , ein einfaches & ist eine bitweise
UND-Verknüpfung.

Autor: Matthias Friedrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir ist grad noch was aufgefallen, bin mir aber nicht sicher, da ich den
eingebauten Font nicht benutze, sonder nur bitmap-fonts.
Stimmt der Ausdruck (*buffer++)___-0x20___? Wenn das Display den
ascii-zeichensatz beherrscht, dann ist das -0x20 falsch.

Autor: hebel23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

also erstmal gehört der buffer, wie Matthias schon sagt, natürlich in
den RAM und hat im Flash nichts zu suchen.
Ich weiß jetzt nicht, was Deine "out"-Funktion macht, so dass ich das
nicht nachvollziehen kann. Ich schicke einen String so ans Display:

void glcd_PutString(unsigned char *data)// String schreiben
{
  glcd_WriteCommand(0xB0);  // Autoinc an
  while (*data)
  {
    glcd_WriteData( (*data) - 0x20);
       data++;
  }
  glcd_WriteCommand(0xB2);  // Autoinc aus
}

klappt prima und hat den Vorteil, dass man weniger Daten übertragen
muss, da das Display den RAM-Pointer automatisch inkrementiert.

Gruß Andreas

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der T6963-Controller versteht kein Ascii, deshalb ist die Subtraktion
von $20 richtig. Im Datenblatt ist irgendwo eine Tabelle des internen
Zeichensatzes, daraus kann man das ersehen.

Gruß

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hebel23!

Kannst du mir erklären wie ich zum beispiel die Zahl 125 auf das
Display angezeigt bekomme?
Ich bekomme nicht hin!

Vielen Dank

Gruß

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab noch was vergessen.
Ich meine zum Beispiel wenn ich die char Varibale x=127 auf das Display
ausgeben will oder eine int Varibale y=345.
Wie muss ich dies Programmieren?

Autor: hebel23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten morgen!

Ich verstehe Deine Frage nicht. Ich dachte darum geht es die ganze Zeit
schon?! Was genau ist denn jetzt unklar?

Gruß Andreas

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit der "itoa(data,buffer,10); " Funktion bekomme ich es nicht hin.

Ich möchte es so machen:
void lcd_write_zahl_xy(unsigned int x, unsigned int y, unsigned int
zahl)

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vewende den Controller 90S8535.
Programmiert wird das ganze mit dem CodeVision AVR.

void main(void)
{
unsigned char buffer[10];
unsigned int i;
DDRB = 0xFF;
PORTB = 0;
DDRD = 0x00;
PORTD = 0;
PORTC_output();
t6963cinit();
itoa(197,buffer); // Zahl 197

while (1)
      {
        if(PIND.6 == 1)
         {
          for(i=1;i<=10;i++)
           {
            lcd_write_char(buffer[i],1,1);
           }
         }
        if(PIND.5 == 1)
         {
          lcd_write_string_xy(2,3,"*Hallo Henning*");
         }
        if(PIND.4 == 1)
         {
          lcd_Clear_Text();
         }

      };
}

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Shit! Funktioniert immer noch nicht. Grrrrr

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für die Hilfe wäre ich dankbar.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo....

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich es mit dieser Funktion mache dann tut sich auch nichts.
Ich möchte es so, dass ich in dieser Funktion z.B. einen int Variable
übergeben kann und das der Wert auf dem Display erscheint.
----------------------------------------------------------------
void lcd_write_string_xy(unsigned int x, unsigned int y, unsigned char
flash *text)    // write String an pos x, y
{
  unsigned int address;

  address = ((unsigned int)y * 22) + x + 0x1000;

  out(0x24,address & 0xff,address >> 8);
  while (*text)
   {
    out(0xC0,0,(*text++)-0x20);
   }
}
void main(void)
{
unsigned char buffer[8];
unsigned int i,t;
t6963cinit();
itoa(24545,buffer);
t=0;
while (1)
      {
        if(PIND.6 == 1)
         {
          lcd_write_string_xy(1,8,buffer);
         }
      };
}

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.