Forum: Mikrocontroller und Digitale Elektronik Probleme mit GLCD


von Steffen (Gast)


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);
    }
  }


}

von hebel23 (Gast)


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.

von Steffen (Gast)


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);
   }
}

von Matthias Friedrich (Gast)


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.

von Matthias Friedrich (Gast)


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.

von hebel23 (Gast)


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

von thkais (Gast)


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ß

von Steffen (Gast)


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ß

von Steffen (Gast)


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?

von hebel23 (Gast)


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

von Steffen (Gast)


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)

von Steffen (Gast)


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();
         }

      };
}

von Steffen (Gast)


Lesenswert?

Shit! Funktioniert immer noch nicht. Grrrrr

von Steffen (Gast)


Lesenswert?

Für die Hilfe wäre ich dankbar.

von Martin (Gast)


Lesenswert?

Hallo....

von Steffen (Gast)


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);
         }
      };
}

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.