Probleme mit GLCD

Gast #119400
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);
    }
  }


}
Gast #119401
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.
Gast #119402
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);
   }
}
Gast #119403
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.
Gast #119404
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.
Gast #119405
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
Gast #119411
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();
         }

      };
}
Gast #119415
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren