Hi
Nach stundenlangem Probieren, überlegen... kam ich dennoch nicht zum Ziel.
Die Unterschiede sind zwar nur klein, aber ich bekomm immer error´s, oder die Schriftzeichen sind anders verwirrt als vorher, oder ich habe nur Balken wo die Schrift ist.
Ich komme einfach nicht zurecht. Hier die Funktionen um Char´s darzustellen
Von der S65-Shield-Lib:
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;
#if FONT_WIDTH <= 8
uint8_t data, mask;
#elif FONT_WIDTH <= 16
uint16_t data, mask;
#elif FONT_WIDTH <= 32
uint32_t data, mask;
#endif
uint8_t i, j, width, height;
const prog_uint8_t *ptr;
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();
for(; height!=0; height--)
{
#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
for(mask=(1<<(width-1)); mask!=0; mask>>=1)
{
if(data & mask)
{
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();
for(; height!=0; height--)
{
#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
for(i=size; i!=0; i--)
{
for(mask=(1<<(width-1)); mask!=0; mask>>=1)
{
if(data & mask)
{
for(j=size; j!=0; j--)
{
s65_draw(color);
}
}
else
{
for(j=size; j!=0; j--)
{
s65_draw(bg_color);
}
}
}
}
}
s65_drawStop();
}
return ret;
}
Hier die vom ARM Inet-radio:
unsigned int lcd_putc(unsigned int x, unsigned int y, unsigned int c, unsigned int font, unsigned int size, unsigned int color, unsigned int bgcolor)
{
unsigned int ret, i, j, width, height, w, h, wh;
unsigned long *ptr;
switch(font)
{
case SMALLFONT:
c -= SMALLFONT_START;
ptr = (unsigned long*)&SMALLFONT_NAME[c*(SMALLFONT_WIDTH*SMALLFONT_HEIGHT/8)];
width = SMALLFONT_WIDTH;
height = SMALLFONT_HEIGHT;
break;
#ifndef LOADER
case NORMALFONT:
c -= NORMALFONT_START;
ptr = (unsigned long*)&NORMALFONT_NAME[c*(NORMALFONT_WIDTH*NORMALFONT_HEIGHT/8)];
width = NORMALFONT_WIDTH;
height = NORMALFONT_HEIGHT;
break;
case TIMEFONT:
c -= TIMEFONT_START;
ptr = (unsigned long*)&TIMEFONT_NAME[c*(TIMEFONT_WIDTH*TIMEFONT_HEIGHT/8)];
width = TIMEFONT_WIDTH;
height = TIMEFONT_HEIGHT;
break;
#endif
}
ret = x+(width*size);
if(ret >= LCD_WIDTH)
{
return LCD_WIDTH;
}
if(size <= 1)
{
lcd_setarea(x, y, x+(+width-1), y+(height-1));
lcd_drawstart();
#ifdef LCD_L2F50
wh = (width*height);
for(w=0; w<width; w++)
{
# ifdef LCD_MIRROR
for(h=w+(wh-width); h<wh; h-=width)
# else
for(h=w; h<wh; h+=width)
# endif
{
if(lcd_checkbit(ptr, h))
{
lcd_draw(color);
}
else
{
lcd_draw(bgcolor);
}
}
}
#else
unsigned long data, mask;
for(wh=(width*height)/32; wh!=0; wh--)
{
data = *ptr++;
//data = ((data&0xFF000000UL)>>24)|((data&0x00FF0000UL)>>8)|((data&0x0000FF00UL)<<8)|((data&0x000000FFUL)<<24); //swap32
for(mask=0x80000000UL; mask!=0UL; mask>>=1)
{
if(data & mask)
{
lcd_draw(color);
}
else
{
lcd_draw(bgcolor);
}
}
}
#endif
lcd_drawstop();
}
else
{
lcd_setarea(x, y, x+(width*size)-1, y+(height*size)-1);
lcd_drawstart();
#ifdef LCD_L2F50
wh = (width*height);
for(w=0; w<width; w++)
{
for(i=size; i!=0; i--)
{
# ifdef LCD_MIRROR
for(h=w+(wh-width); h<wh; h-=width)
# else
for(h=w; h<wh; h+=width)
# endif
{
if(lcd_checkbit(ptr, h))
{
for(j=size; j!=0; j--)
{
lcd_draw(color);
}
}
else
{
for(j=size; j!=0; j--)
{
lcd_draw(bgcolor);
}
}
}
}
}
#else
unsigned int bit;
wh = (width*height);
for(h=0; h<wh; h+=width)
{
for(i=size; i!=0; i--)
{
bit = h;
for(w=0; w<width; w++)
{
if(lcd_checkbit(ptr, bit++))
{
for(j=size; j!=0; j--)
{
lcd_draw(color);
}
}
else
{
for(j=size; j!=0; j--)
{
lcd_draw(bgcolor);
}
}
}
}
}
#endif
lcd_drawstop();
}
return ret;
}
Die Funktionen sind ja eig ziemlich gleich aufgebaut, aber es endet bei jedem versuch immer mit Verwirrung und Verzweiflung.
Kann evtl einer helfen?
In "normalen" sachen wie schleifen, abfragen, anderen funktionen usw komme ich super zurecht, nur da habe ich 0 durchblick
MFG, Robdeflop®