36 #define swap_data(a, b) { uint8_t t = a; a = b; b = t; } 41 static uint8_t s_invertByte = 0x00000000;
57 fill_Data ^= s_invertByte;
109 uint8_t text_index = 0;
110 uint8_t page_offset = 0;
126 if (page_offset == s_fixedFont.
pages)
149 uint16_t offset = (c * s_fixedFont.
pages + page_offset) * s_fixedFont.
width;
150 for( i=s_fixedFont.
width; i>0; i--)
153 if ( style == STYLE_NORMAL )
155 data = pgm_read_byte(&s_fixedFont.
data[offset]);
157 else if ( style == STYLE_BOLD )
159 uint8_t temp = pgm_read_byte(&s_fixedFont.
data[offset]);
165 uint8_t temp = pgm_read_byte(&s_fixedFont.
data[offset + 1]);
166 data = (temp & 0xF0) | ldata;
167 ldata = (temp & 0x0F);
172 x += s_fixedFont.
width;
182 uint8_t text_index = 0;
183 uint8_t page_offset = 0;
199 if (page_offset == (s_fixedFont.
pages << 1))
222 uint16_t offset = (c * s_fixedFont.
pages + (page_offset >> 1)) * s_fixedFont.
width;
223 for( i=s_fixedFont.
width; i>0; i--)
226 if ( style == STYLE_NORMAL )
228 data = pgm_read_byte(&s_fixedFont.
data[offset]);
230 else if ( style == STYLE_BOLD )
232 uint8_t temp = pgm_read_byte(&s_fixedFont.
data[offset]);
238 uint8_t temp = pgm_read_byte(&s_fixedFont.
data[offset + 1]);
239 data = (temp & 0xF0) | ldata;
240 ldata = (temp & 0x0F);
242 if (page_offset & 1) data >>= 4;
243 data = ((data & 0x01) ? 0x03: 0x00) |
244 ((data & 0x02) ? 0x0C: 0x00) |
245 ((data & 0x04) ? 0x30: 0x00) |
246 ((data & 0x08) ? 0xC0: 0x00);
251 x += (s_fixedFont.
width << 1);
262 uint8_t text_index = 0;
263 uint8_t page_offset = 0;
279 if (page_offset == (s_fixedFont.
pages << factor))
302 uint16_t offset = (c * s_fixedFont.
pages + (page_offset >> factor)) * s_fixedFont.
width;
303 for( i=s_fixedFont.
width; i>0; i--)
306 if ( style == STYLE_NORMAL )
308 data = pgm_read_byte(&s_fixedFont.
data[offset]);
310 else if ( style == STYLE_BOLD )
312 uint8_t temp = pgm_read_byte(&s_fixedFont.
data[offset]);
318 uint8_t temp = pgm_read_byte(&s_fixedFont.
data[offset + 1]);
319 data = (temp & 0xF0) | ldata;
320 ldata = (temp & 0x0F);
328 data >>= ((page_offset & ((1<<factor) - 1))<<(3-factor));
330 uint8_t mask = ~((0xFF) << (1<<factor));
331 for (uint8_t idx = 0; idx < 1<<(3-factor); idx++)
333 accum |= (((data>>idx) & 0x01) ? (mask<<(idx<<factor)) : 0);
337 for (uint8_t z=(1<<factor); z>0; z--)
343 x += (s_fixedFont.
width << factor);
358 uint8_t c = ch[j] - 32;
372 if ( style == STYLE_NORMAL )
374 data = pgm_read_byte(&s_font6x8[c*6+i]);
376 else if ( style == STYLE_BOLD )
378 uint8_t temp = pgm_read_byte(&s_font6x8[c*6+i]);
384 uint8_t temp = pgm_read_byte(&s_font6x8[c*6+i + 1]);
385 data = (temp & 0xF0) | ldata;
386 ldata = (temp & 0x0F);
400 uint8_t text_index = 0;
432 uint8_t c = ch[j] - 32;
441 if ( style == STYLE_NORMAL )
443 data = pgm_read_byte(&s_font6x8[c*6+i]);
445 else if ( style == STYLE_BOLD )
447 uint8_t temp = pgm_read_byte(&s_font6x8[c*6+i]);
453 uint8_t temp = pgm_read_byte(&s_font6x8[c*6+i + 1]);
454 data = (temp & 0xF0) | ldata;
455 ldata = (temp & 0x0F);
458 data = ((data & 0x01) ? 0x03: 0x00) |
459 ((data & 0x02) ? 0x0C: 0x00) |
460 ((data & 0x04) ? 0x30: 0x00) |
461 ((data & 0x08) ? 0xC0: 0x00);
479 uint8_t text_end_pos = len * 6 + left;
480 if (text_end_pos <= right)
489 s_fixedFont.
width = pgm_read_byte(&progmemFont[1]);
490 s_fixedFont.
pages = (pgm_read_byte(&progmemFont[2]) + 7) >> 3;
491 s_fixedFont.
ascii_offset = pgm_read_byte(&progmemFont[3]);
492 s_fixedFont.
data = progmemFont + 4;
497 s_font6x8 = progmemFont + 4;
516 void ssd1306_putPixel_delayed(uint8_t x, uint8_t y, uint8_t complete)
518 static uint8_t lx = 0, ly = 0xFF;
519 static uint8_t pixels = 0;
520 if ((lx != x) || ((ly & 0xF8) != (y & 0xF8)) || (complete))
531 pixels |= (1 << (y & 0x07));
538 uint8_t dx = x1 > x2 ? (x1 - x2): (x2 - x1);
539 uint8_t dy = y1 > y2 ? (y1 - y2): (y2 - y1);
554 x1 < x2 ? x1++: x1--;
556 ssd1306_putPixel_delayed( x1, y1, 0 );
558 ssd1306_putPixel_delayed( 0, 0, 1 );
574 if (y1 < y2) y1++;
else y1--;
585 for (uint8_t x = x1; x <= x2; x++)
594 uint8_t topPage = y1 >> 3;
595 uint8_t bottomPage = y2 >> 3;
596 uint8_t height = y2-y1;
599 if (topPage == bottomPage)
607 for ( y = (topPage + 1); y <= (bottomPage - 1); y++)
630 for(j=(h >> 3); j>0; j--)
648 for(j=(h >> 3); j>0; j--)
666 for(j=(h >> 3); j>0; j--)
693 uint8_t offsety = sprite->
y & 0x7;
698 for (uint8_t i=0; i < sprite->
w; i++)
708 for (uint8_t i=0; i < sprite->
w; i++)
714 sprite->
lx = sprite->
x;
715 sprite->
ly = sprite->
y;
721 uint8_t posy = sprite->
y >> 3;
722 uint8_t offsety = sprite->
y & 0x7;
725 for (uint8_t i=sprite->
w; i > 0; i--)
734 for (uint8_t i=sprite->
w; i > 0; i--)
745 uint8_t y1 = sprite->
ly >> 3;
746 uint8_t y2 = (sprite->
ly + 7) >> 3;
747 if (sprite->
ly < sprite->
y)
748 y2 =
min(y2, (uint8_t)((sprite->
y >> 3) - 1));
749 else if (sprite->
y + 8 > sprite->
ly)
750 y1 =
max(y1, (sprite->
ly + 7) >> 3);
751 for(uint8_t y = y1; y <= y2; y++)
755 for(uint8_t x = sprite->
w; x > 0; x--)
761 if (sprite->
lx != sprite->
x)
763 uint8_t x1 = sprite->
lx;
764 uint8_t x2 = sprite->
lx + sprite->
w - 1;
765 if (sprite->
x < sprite->
lx)
766 x1 =
max(x1, sprite->
x + sprite->
w);
768 x2 =
min((uint8_t)(sprite->
x - 1), x2);
769 for(uint8_t y = sprite->
ly >> 3; y <= (sprite->
ly + 7) >> 3; y++)
773 for(uint8_t x = x2 - x1 + 1; x > 0; x--)
784 return (
SPRITE){x,y,w,x,y,data,NULL};
uint8_t ssd1306_printFixed2x(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style)
void ssd1306_drawBitmap(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf)
void ssd1306_negativeMode()
void ssd1306_setContrast(uint8_t contrast)
const uint8_t * data
Pointer to PROGMEM data, representing sprite image.
void(* ssd1306_sendByte)(uint8_t data)
uint8_t ssd1306_printFixedN(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style, uint8_t factor)
void ssd1306_displayOff()
void(* ssd1306_dataStart)()
void(* ssd1306_endTransmission)()
uint8_t ssd1306_displayHeight()
void ssd1306_replaceSprite(SPRITE *sprite, const uint8_t *data)
void ssd1306_drawHLine(uint8_t x1, uint8_t y1, uint8_t x2)
void(* ssd1306_nextRamPage)()
void ssd1306_drawVLine(uint8_t x1, uint8_t y1, uint8_t y2)
void ssd1306_positiveMode()
const PROGMEM uint8_t ssd1306xled_font6x8[]
uint8_t ascii_offset
ascii offset
void ssd1306_putPixels(uint8_t x, uint8_t y, uint8_t pixels)
SPRITE ssd1306_createSprite(uint8_t x, uint8_t y, uint8_t w, const uint8_t *data)
void ssd1306_drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2)
void ssd1306_drawSpriteEx(uint8_t x, uint8_t y, uint8_t w, const uint8_t *sprite)
void ssd1306_sendCommand(uint8_t command)
void ssd1306_fillScreen(uint8_t fill_Data)
void ssd1306_drawRect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2)
void ssd1306_clearScreen()
uint8_t y
draw position Y on the screen
void ssd1306_clearBlock(uint8_t x, uint8_t y, uint8_t w, uint8_t h)
void ssd1306_setFixedFont(const uint8_t *progmemFont)
uint8_t width
width in pixels
uint8_t ssd1306_charF6x8_eol(uint8_t left, uint8_t y, const char ch[], EFontStyle style, uint8_t right)
void ssd1306_invertMode()
uint8_t x
draw position X on the screen
void ssd1306_setFont6x8(const uint8_t *progmemFont)
uint8_t ssd1306_displayWidth()
void ssd1306_drawSprite(SPRITE *sprite)
void ssd1306_eraseTrace(SPRITE *sprite)
void ssd1306_drawBuffer(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t *buf)
void ssd1306_eraseSprite(SPRITE *sprite)
void(* ssd1306_commandStart)()
void ssd1306_normalMode()
uint8_t ssd1306_charF12x16(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style)
void(* ssd1306_setRamBlock)(uint8_t x, uint8_t y, uint8_t w)
void ssd1306_putPixel(uint8_t x, uint8_t y)
uint8_t lx
last draw position X on the screen
uint8_t ssd1306_printFixed(uint8_t xpos, uint8_t y, const char ch[], EFontStyle style)
const uint8_t * data
font chars bits
void(* ssd1306_sendPixels)(uint8_t data)
uint8_t pages
height in pages
uint8_t ssd1306_charF6x8(uint8_t x, uint8_t y, const char ch[], EFontStyle style)
uint8_t ly
last draw position Y on the screen