вобщем-то большую часть передрал с других библиотек,
сложности возникли со своими: lcd::bitmap();
никак не пойму почему так происходит:
чтоб не качать все исходники привожу куски кода.
- Код: Выделить всё • Развернуть
namespace bitmaps
{
/* 6x8
* [* **]
* [* * *]
* [* * *]
* [** *]
* [** *]
* [* * *]
* [* * *]
* [* **]
*/
uint8_t PROGMEM c1_bmp__data[] = {
0xff, 0x18, 0x24, 0x42, 0x81, 0xff
};
bitmap_pt c1_bmp = {6, 8, c1_bmp__data};
/* 6x16
* [* **]
* [* * *]
* [* * *]
* [** *]
* [** *]
* [* * *]
* [* * *]
* [* **]
* [** *]
* [* * *]
* [* * *]
* [* **]
* [* **]
* [* * *]
* [* * *]
* [** *]
*/
uint8_t PROGMEM c2_bmp__data[] = {
0xff, 0x18, 0x24, 0x42, 0x81, 0xff,
0xff, 0x81, 0x42, 0x24, 0x18, 0xff
};
bitmap_pt c2_bmp = {6, 16, c2_bmp__data};
}
lcd glcd;
int main(void)
{
glcd.bitmap(0, 0, &bitmaps::c2_bmp);
glcd.bitmap(6, 1, &bitmaps::c2_bmp);
glcd.bitmap(12, 2, &bitmaps::c2_bmp);
glcd.bitmap(18, 3, &bitmaps::c2_bmp);
glcd.bitmap(24, 4, &bitmaps::c2_bmp);
glcd.bitmap(30, 5, &bitmaps::c2_bmp);
glcd.bitmap(36, 6, &bitmaps::c2_bmp);
glcd.bitmap(42, 7, &bitmaps::c2_bmp);
glcd.bitmap(48, 8, &bitmaps::c2_bmp);
glcd.bitmap(54, 9, &bitmaps::c2_bmp);
glcd.bitmap(60, 10, &bitmaps::c2_bmp);
glcd.bitmap(66, 11, &bitmaps::c2_bmp);
glcd.bitmap(72, 12, &bitmaps::c2_bmp);
glcd.bitmap(78, 13, &bitmaps::c2_bmp);
glcd.bitmap(84, 14, &bitmaps::c2_bmp);
glcd.bitmap(90, 15, &bitmaps::c2_bmp);
glcd.bitmap(96, 16, &bitmaps::c2_bmp);
glcd.update();
while(1)
wdt_reset();
return 0;
};
- Код: Выделить всё • Развернуть
void lcd::bitmap(uint8_t left, uint8_t top, bitmap_t *bmp, operation_t op)
{
uint8_t *dat, *p1, *p2;
uint8_t x, y;
uint8_t tt;
uint16_t t1, t2;
tt = top % 8;
dat = bmp->data;
for(y=(top>>3); y <= ((top+bmp->heigth-1)>>3); y++)
for(x=left; x <= (left+bmp->width-1); x++)
{
t1 = pgm_read_byte(dat++);
t2 = 0xff;
switch(op)
{
case OP_NORMALL:
break;
case OP_INV:
t1 = 0xff & ~t1;
break;
case OP_SET:
case OP_OR:
case OP_CLEAR:
case OP_AND:
case OP_XOR:
break;
}
if(tt)
{
t1 <<= tt;
t2 <<= tt;
t2 = ~t2;
p1 = (uint8_t*) &t1;
p2 = (uint8_t*) &t2;
rmw(x, y, *p1, *p2);
rmw(x, y+1, *(p1+1), *(p2+1));
}
else
{
rmw(x, y, (uint8_t)t1, 0x00);
}
}
}
- Код: Выделить всё • Развернуть
/**
* Изменить набор пикселей ( \a x ; \a 0+8*y ) -> ( \a x ; \a 7+8*y )
* \f[ w = (r \and clear_mask) \or mask \f]
* \param x
* \param y range(4) -> (0, 1, 2, 3)
* \param mask
* \param clear_mask
* \return pixels state
*/
uint8_t rmw(uint8_t x, uint8_t y, uint8_t mask, uint8_t clear_mask);