Show Posts
Pages: [1]
1  International / Deutsch / Re: S65 Shield geht nicht on: April 18, 2013, 07:25:27 pm
Die Beiträge hier sind ja schon etwas älter. Aber da ich einen Tag mit dem s65- Shield  (l2F50) zugebracht habe,
möchte ich hier meine Lösung für das Problem kurz zeigen.

Meine S65Display.cpp sieht jetzt so aus:
Code:
uint8_t S65Display::drawChar(uint8_t x, uint8_t y, char c, uint8_t size, uint16_t color, uint16_t bg_color)
{
  uint8_t ret, h, w; // h,w sind Laufvariablen für Höhe und Weite
#if FONT_WIDTH <= 8
  uint8_t data;
#elif FONT_WIDTH <= 16
  uint16_t data;
#elif FONT_WIDTH <= 32
  uint32_t data;
#endif
  uint8_t i, j, width, height;
  const prog_uint8_t *ptr, *ptr_tmp;

  i      = (uint8_t)c;
#if FONT_WIDTH <= 8
  ptr    = &font_PGM[(i-FONT_START)*(8*FONT_HEIGHT/8)];
#elif FONT_WIDTH <= 16
  ptr    = &font_PGM[(i-FONT_START)*(16*FONT_HEIGHT/8)];
#elif FONT_WIDTH <= 32
  ptr    = &font_PGM[(i-FONT_START)*(32*FONT_HEIGHT/8)];
#endif
  width  = FONT_WIDTH;
  height = FONT_HEIGHT;

  if(size <= 1)
  {
    ret = x+width;
    if(ret > S65_WIDTH)
    {
      return S65_WIDTH+1;
    }

    setArea(x, y, (x+width-1), (y+height-1));

    s65_drawStart();
    ptr_tmp = ptr;
for(w=width; w!=0; w--) //
{
ptr    = ptr_tmp;
//Serial.print("w="); Serial.println(w); delay(50);
for(h= height; h!=0; h--)
    {
#if FONT_WIDTH <= 8
data = pgm_read_byte(ptr); ptr+=1;
#elif FONT_WIDTH <= 16
data = pgm_read_word(ptr); ptr+=2;
#elif FONT_WIDTH <= 32
data = pgm_read_dword(ptr); ptr+=4;
#endif
   
    if(CHECK_BIT(data,w)) // hier Sprung in die Funktion CHECK_BIT(var,pos)
  // die ist in S6%Dislay.h angelegt
  // und sieht so aus:
  // #define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))

{
s65_draw(color);
}
else
{
s65_draw(bg_color);
}
    }
}
    s65_drawStop();
  }
  else
  {
    ret = x+(width*size);
    if(ret > S65_WIDTH)
    {
      return S65_WIDTH+1;
    }

    s65_setArea(x, y, (x+(width*size)-1), (y+(height*size)-1));

    s65_drawStart();
      ptr_tmp = ptr;
for(w=width; w!=0; w--) //
{
ptr    = ptr_tmp;
//Serial.print("w="); Serial.println(w); delay(50);
for(h= height; h!=0; h--)
    {
#if FONT_WIDTH <= 8
      data = pgm_read_byte(ptr); ptr+=1;
#elif FONT_WIDTH <= 16
      data = pgm_read_word(ptr); ptr+=2;
#elif FONT_WIDTH <= 32
      data = pgm_read_dword(ptr); ptr+=4;
#endif
     
       
          if(CHECK_BIT(data,w))
          {
            for(j=size; j!=0; j--)
            {
              s65_draw(color);
            }
          }
          else
          {
            for(j=size; j!=0; j--)
            {
              s65_draw(bg_color);
            }
}
}
         
    }
    s65_drawStop();
  }

  return ret;
}


Bitte auch in der S65Display.h die Definition:

Code:
#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))

nicht vergessen einzufügen.

Leider funktionieren derzeit nur Fonts mit 8 Zeichen Breite, Da aber im Funktionsaufruf  die Größe über "size" geändert werden kann, ist das verschmerzen.

kid
Pages: [1]