SSD1306 OLED display driver  1.7.17
This library is developed to control SSD1306/SSD1331/SSD1351/IL9163/PCD8554 RGB i2c/spi LED displays
lcd_common.h
Go to the documentation of this file.
1 /*
2  MIT License
3 
4  Copyright (c) 2017-2019, Alexey Dynda
5 
6  Permission is hereby granted, free of charge, to any person obtaining a copy
7  of this software and associated documentation files (the "Software"), to deal
8  in the Software without restriction, including without limitation the rights
9  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  copies of the Software, and to permit persons to whom the Software is
11  furnished to do so, subject to the following conditions:
12 
13  The above copyright notice and this permission notice shall be included in all
14  copies or substantial portions of the Software.
15 
16  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  SOFTWARE.
23 */
28 #ifndef _LCD_COMMON_H_
29 #define _LCD_COMMON_H_
30 
31 #include "ssd1306_hal/io.h"
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
50 typedef enum
51 {
62 } lcd_type_t;
63 
69 typedef enum
70 {
76 
83 } lcd_mode_t;
84 
88 typedef struct
89 {
91  lcd_type_t type;
92 
94  lcduint_t width;
95 
97  lcduint_t height;
98 
114  void (*set_block)(lcduint_t x, lcduint_t y, lcduint_t w);
115 
122  void (*next_page)(void);
123 
128  void (*send_pixels1)(uint8_t data);
129 
135  void (*send_pixels_buffer1)(const uint8_t *buffer, uint16_t len);
136 
142  void (*send_pixels8)(uint8_t data);
143 
149  void (*send_pixels16)(uint16_t data);
150 
164  void (*set_mode)(lcd_mode_t mode);
165 } ssd1306_lcd_t;
166 
171 
176 #define s_displayHeight ssd1306_lcd.height
177 
182 #define s_displayWidth ssd1306_lcd.width
183 
188 #define g_lcd_type ssd1306_lcd.type
189 
197 void ssd1306_sendData(uint8_t data) __attribute__ ((deprecated));
198 
215 #define ssd1306_setRamBlock ssd1306_lcd.set_block
216 
224 #define ssd1306_nextRamPage ssd1306_lcd.next_page
225 
231 #define ssd1306_sendPixels ssd1306_lcd.send_pixels1
232 
239 #define ssd1306_sendPixelsBuffer ssd1306_lcd.send_pixels_buffer1
240 
247 #define ssd1306_sendPixel8 ssd1306_lcd.send_pixels8
248 
260 void ssd1306_configureI2cDisplay(const uint8_t *config, uint8_t configSize);
261 
275 void ssd1306_configureSpiDisplay(const uint8_t *config, uint8_t configSize);
276 
290 void ssd1306_setMode(lcd_mode_t mode);
291 
302 void ssd1306_resetController(int8_t rstPin, uint8_t delayMs);
303 
316 #define SSD1306_COMPAT_SPI_BLOCK_8BIT_CMDS(column_cmd, row_cmd) \
317  static uint8_t __s_column; \
318  static uint8_t __s_page; \
319  static void set_block_compat(lcduint_t x, lcduint_t y, lcduint_t w) \
320  { \
321  uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); \
322  __s_column = x; \
323  __s_page = y; \
324  ssd1306_intf.start(); \
325  ssd1306_spiDataMode(0); \
326  ssd1306_intf.send(column_cmd); \
327  ssd1306_intf.send(x); \
328  ssd1306_intf.send(rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1)); \
329  ssd1306_intf.send(row_cmd); \
330  ssd1306_intf.send(y<<3); \
331  ssd1306_intf.send(((y<<3) + 7) < ssd1306_lcd.height ? ((y<<3) + 7) : (ssd1306_lcd.height - 1)); \
332  ssd1306_spiDataMode(1); \
333  } \
334  static void next_page_compat(void) \
335  { \
336  ssd1306_intf.stop(); \
337  set_block_compat(__s_column,__s_page+1,0); \
338  } \
339 
340 
352 #define CONTROLLER_NATIVE_SPI_BLOCK_8BIT_CMDS(column_cmd, row_cmd) \
353  static void set_block_native(lcduint_t x, lcduint_t y, lcduint_t w) \
354  { \
355  uint8_t rx = w ? (x + w - 1) : (ssd1306_lcd.width - 1); \
356  ssd1306_intf.start(); \
357  ssd1306_spiDataMode(0); \
358  ssd1306_intf.send(column_cmd); \
359  ssd1306_intf.send(x); \
360  ssd1306_intf.send(rx < ssd1306_lcd.width ? rx : (ssd1306_lcd.width - 1)); \
361  ssd1306_intf.send(row_cmd); \
362  ssd1306_intf.send(y); \
363  ssd1306_intf.send(ssd1306_lcd.height - 1); \
364  ssd1306_spiDataMode(1); \
365  } \
366  static void next_page_native(void) \
367  { \
368  } \
369 
370 
376 #define SSD1306_COMPAT_SEND_PIXELS_RGB8_CMDS() \
377  extern uint16_t ssd1306_color; \
378  static void send_pixels_compat(uint8_t data) \
379  { \
380  for (uint8_t i=8; i>0; i--) \
381  { \
382  if ( data & 0x01 ) \
383  { \
384  ssd1306_intf.send( (uint8_t)ssd1306_color ); \
385  } \
386  else \
387  { \
388  ssd1306_intf.send( 0B00000000 ); \
389  } \
390  data >>= 1; \
391  } \
392  } \
393  static void send_pixels_buffer_compat(const uint8_t *buffer, uint16_t len) \
394  { \
395  while(len--) \
396  { \
397  send_pixels_compat(*buffer); \
398  buffer++; \
399  } \
400  }
401 
408 #define SSD1306_COMPAT_SEND_PIXELS_RGB16_CMDS() \
409  extern uint16_t ssd1306_color; \
410  static void send_pixels_compat16(uint8_t data) \
411  { \
412  for (uint8_t i=8; i>0; i--) \
413  { \
414  if ( data & 0x01 ) \
415  { \
416  ssd1306_intf.send( (uint8_t)(ssd1306_color >> 8 ) ); \
417  ssd1306_intf.send( (uint8_t)(ssd1306_color & 0xFF) ); \
418  } \
419  else \
420  { \
421  ssd1306_intf.send( 0B00000000 ); \
422  ssd1306_intf.send( 0B00000000 ); \
423  } \
424  data >>= 1; \
425  } \
426  } \
427  static void send_pixels_buffer_compat16(const uint8_t *buffer, uint16_t len) \
428  { \
429  while(len--) \
430  { \
431  send_pixels_compat16(*buffer); \
432  buffer++; \
433  } \
434  }
435 
436 
441 #ifdef __cplusplus
442 }
443 #endif
444 
445 #endif /* _LCD_COMMON_H_ */
void ssd1306_setMode(lcd_mode_t mode)
Sets library display mode for direct draw functions.
Definition: lcd_common.c:74
void ssd1306_configureSpiDisplay(const uint8_t *config, uint8_t configSize)
Sends configuration being passed to lcd display spi controller.
Definition: lcd_common.c:52
void ssd1306_configureI2cDisplay(const uint8_t *config, uint8_t configSize)
Sends configuration being passed to lcd display i2c/spi controller.
Definition: lcd_common.c:41
lcd_mode_t
Definition: lcd_common.h:69
void ssd1306_resetController(int8_t rstPin, uint8_t delayMs)
Does hardware reset for oled controller.
Definition: lcd_common.c:82
ssd1306_lcd_t ssd1306_lcd
Definition: lcd_common.c:32
lcduint_t height
Definition: lcd_common.h:97
void ssd1306_sendData(uint8_t data) __attribute__((deprecated))
Definition: lcd_common.c:34
lcduint_t width
Definition: lcd_common.h:94
lcd_type_t
Definition: lcd_common.h:50
lcd_type_t type
Definition: lcd_common.h:91