22 #include "intf/ssd1306_interface.h" 24 #include "i2c/ssd1306_i2c.h" 25 #include "lcd/ssd1306_128x64.h" 26 #include "lcd/ssd1306_128x32.h" 27 #include "intf/ssd1306_commands.h" 29 static uint8_t s_displayHeight;
30 static uint8_t s_invertByte = 0x00000000;
31 const uint8_t *s_font6x8 = ssd1306xled_font6x8;
35 return s_displayHeight;
39 void ssd1306_i2cInit()
41 ssd1306_startTransmission = ssd1306_i2cStart;
42 ssd1306_endTransmission = ssd1306_i2cStop;
43 ssd1306_sendByte = ssd1306_i2cSendByte;
49 ssd1306_endTransmission();
51 for( uint8_t i=0; i<s_oled128x64_dataLength; i++)
53 ssd1306_sendCommand(pgm_read_byte(&s_oled128x64_initData[i]));
60 ssd1306_endTransmission();
62 for( uint8_t i=0; i<s_oled128x32_dataLength; i++)
64 ssd1306_sendCommand(pgm_read_byte(&s_oled128x32_initData[i]));
68 void ssd1306_setRamBlock(uint8_t x, uint8_t y, uint8_t w)
70 ssd1306_startTransmission();
71 ssd1306_sendByte(0x00);
72 ssd1306_sendByte(SSD1306_COLUMNADDR);
74 ssd1306_sendByte(x + w - 1);
75 ssd1306_sendByte(0xb0+y);
76 ssd1306_sendByte((x>>4) | 0x10);
77 ssd1306_sendByte(x&0x0f);
78 ssd1306_endTransmission();
83 ssd1306_startTransmission();
84 ssd1306_sendByte(0x00);
85 ssd1306_sendByte(0xb0+y);
86 ssd1306_sendByte((x>>4) | 0x10);
87 ssd1306_sendByte(x&0x0f);
88 ssd1306_endTransmission();
94 ssd1306_sendByte( data );
95 ssd1306_endTransmission();
101 fill_Data ^= s_invertByte;
102 ssd1306_setRamBlock(0, 0, 128);
104 for(uint8_t m=0; m<(s_displayHeight >> 3); m++)
106 for(uint8_t n=0; n<128; n++)
108 ssd1306_sendByte(fill_Data);
111 ssd1306_endTransmission();
116 ssd1306_setRamBlock(0, 0, 128);
118 for(uint8_t m=0;m<(s_displayHeight >> 3);m++)
120 for(uint8_t n=0;n<128;n++)
122 ssd1306_sendByte(s_invertByte);
125 ssd1306_endTransmission();
131 ssd1306_sendCommand(SSD1306_DISPLAYOFF);
137 ssd1306_sendCommand(SSD1306_DISPLAYON);
143 ssd1306_setRamBlock(0, 0, 128);
158 if ( style == STYLE_NORMAL )
160 data = pgm_read_byte(&s_font6x8[c*6+i]);
162 else if ( style == STYLE_BOLD )
164 uint8_t temp = pgm_read_byte(&s_font6x8[c*6+i]);
170 uint8_t temp = pgm_read_byte(&s_font6x8[c*6+i + 1]);
171 data = (temp & 0xF0) | ldata;
172 ldata = (temp & 0x0F);
174 ssd1306_sendByte(data^s_invertByte);
179 ssd1306_endTransmission();
184 s_font6x8 = progmemFont;
189 ssd1306_setRamBlock(0, y >> 3, 128);
192 ssd1306_sendByte((1 << (y & 0x07))^s_invertByte);
193 ssd1306_endTransmission();
198 ssd1306_setRamBlock(0, 0, 128);
201 ssd1306_sendByte(pixels^s_invertByte);
202 ssd1306_endTransmission();
207 ssd1306_setRamBlock(x1, y1 >> 3, x2 - x1 + 1);
209 for (uint8_t x = x1; x <= x2; x++)
211 ssd1306_sendByte((1 << (y1 & 0x07))^s_invertByte);
213 ssd1306_endTransmission();
218 ssd1306_setRamBlock(x1, y1 >> 3, 1);
220 ssd1306_sendByte( (0xFF << (y1 & 0x07))^s_invertByte );
221 for ( uint8_t y = ((y1 >> 3) + 1); y <= ((y2 >> 3) - 1); y++)
223 ssd1306_sendByte( 0xFF^s_invertByte );
225 ssd1306_sendByte( (0xFF >> (0x07 - (y2 & 0x07)))^s_invertByte );
226 ssd1306_endTransmission();
240 ssd1306_setRamBlock(x, y, w);
242 for(j=0; j<(h >> 3); j++)
246 ssd1306_sendByte(s_invertByte^*buf++);
249 ssd1306_endTransmission();
255 ssd1306_setRamBlock(x, y, w);
257 for(j=0; j<(h >> 3); j++)
261 ssd1306_sendByte(s_invertByte^pgm_read_byte(buf++));
264 ssd1306_endTransmission();
271 ssd1306_setRamBlock(x, y, w);
273 for(j=0; j<(h >> 3); j++)
277 ssd1306_sendByte(s_invertByte);
280 ssd1306_endTransmission();
291 ssd1306_sendByte(s_invertByte^pgm_read_byte(&sprite[i]));
293 ssd1306_endTransmission();
299 uint8_t posy = sprite->
y >> 3;
300 uint8_t offsety = sprite->
y & 0x7;
301 if (posy < (s_displayHeight >> 3))
305 for (uint8_t i=0; i < sprite->
w; i++)
307 ssd1306_sendByte( s_invertByte^(pgm_read_byte( &sprite->
data[i] ) << offsety) );
309 ssd1306_endTransmission();
311 if (offsety && (posy + 1 < (s_displayHeight >> 3)))
315 for (uint8_t i=0; i < sprite->
w; i++)
317 ssd1306_sendByte( s_invertByte^(pgm_read_byte( &sprite->
data[i] ) >> (8 - offsety)) );
320 ssd1306_endTransmission();
321 sprite->
lx = sprite->
x;
322 sprite->
ly = sprite->
y;
328 uint8_t posy = sprite->
y >> 3;
329 uint8_t offsety = sprite->
y & 0x7;
332 for (uint8_t i=0; i < sprite->
w; i++)
334 ssd1306_sendByte( s_invertByte );
336 ssd1306_endTransmission();
341 for (uint8_t i=0; i < sprite->
w; i++)
343 ssd1306_sendByte( s_invertByte );
346 ssd1306_endTransmission();
352 uint8_t y1 = sprite->
ly >> 3;
353 uint8_t y2 = (sprite->
ly + 7) >> 3;
354 if (sprite->
ly < sprite->
y)
355 y2 = min(y2, (uint8_t)((sprite->
y >> 3) - 1));
357 y1 = max(y1, (sprite->
ly + 7) >> 3);
358 for(uint8_t y = y1; y <= y2; y++)
362 for(uint8_t x = sprite->
lx; x < sprite->lx + sprite->
w; x++)
364 ssd1306_sendByte( s_invertByte );
366 ssd1306_endTransmission();
368 if (sprite->
lx != sprite->
x)
370 uint8_t x1 = sprite->
lx;
371 uint8_t x2 = sprite->
lx + sprite->
w - 1;
372 if (sprite->
x < sprite->
lx)
373 x1 = max(x1, sprite->
x + sprite->
w);
375 x2 = min((uint8_t)(sprite->
x - 1), x2);
376 for(uint8_t y = sprite->
ly >> 3; y <= (sprite->
ly + 7) >> 3; y++)
380 for(uint8_t x = x1; x <= x2; x++)
382 ssd1306_sendByte( s_invertByte );
384 ssd1306_endTransmission();
391 return {x,y,w,x,y,data,
nullptr};
401 ssd1306_sendCommand(SSD1306_INVERTDISPLAY);
406 ssd1306_sendCommand(SSD1306_NORMALDISPLAY);
void ssd1306_charF6x8(uint8_t x, 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()
const uint8_t * data
Pointer to PROGMEM data, representing sprite image.
void ssd1306_displayOff()
void ssd1306_128x32_i2c_init()
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_setFont6x8(const uint8_t *progmemFont)
void ssd1306_drawVLine(uint8_t x1, uint8_t y1, uint8_t y2)
void ssd1306_128x64_i2c_init()
void ssd1306_positiveMode()
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_drawSpriteEx(uint8_t x, uint8_t y, uint8_t w, const uint8_t *sprite)
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_invertMode()
uint8_t x
draw position X on the screen
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_sendData(uint8_t data)
void ssd1306_setPos(uint8_t x, uint8_t y)
void ssd1306_normalMode()
void ssd1306_putPixel(uint8_t x, uint8_t y)
uint8_t lx
last draw position X on the screen
uint8_t ly
last draw position Y on the screen