From 2a590986e1ee2aca934181e0ced958c520e97332 Mon Sep 17 00:00:00 2001 From: Maxwell Beck Date: Mon, 26 Oct 2026 20:32:56 -0500 Subject: ssd1306 driver sketch --- src/ssd1306.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/ssd1306.c (limited to 'src/ssd1306.c') diff --git a/src/ssd1306.c b/src/ssd1306.c new file mode 100644 index 0000000..c766d5f --- /dev/null +++ b/src/ssd1306.c @@ -0,0 +1,75 @@ +#include "ssd1306.h" + +#include +#include + +int ssd_init(ssd1306_t *display, i2c_inst_t *i2c, uint8_t addr) { + display->i2c = i2c; + display->addr = addr; + display->len = 0; + + return PICO_OK; +} + +int ssd_push(ssd1306_t *display, uint8_t byte) { + if (display->len < SSD1306_BUFFER_LEN) { + display->buf[display->len] = byte; + display->len++; + return PICO_OK; + } else { + return PICO_ERROR_BUFFER_TOO_SMALL; + } +} + +int ssd_send(ssd1306_t *display) { + int ret = i2c_write_blocking( + display->i2c, + display->addr, + display->buf, + display->len, + false + ); + display->len = 0; + + return ret; +} + +int ssd_power_on(ssd1306_t *display) { + ssd_push(display, SSD1306_CTRL_CMD); + + ssd_push(display, SSD1306_DISPLAY_OFF); + + ssd_push(display, SSD1306_SET_CLOCK_DIV); + ssd_push(display, 0x80); + + ssd_push(display, SSD1306_SET_MULTIPLEX); + ssd_push(display, 0x1f); + + ssd_push(display, SSD1306_START_LINE(0)); + + ssd_push(display, SSD1306_SET_CHARGE_PUMP); + ssd_push(display, SSD1306_CHARGE_PUMP_ON); + + ssd_push(display, SSD1306_SET_MEMORY_MODE); + ssd_push(display, SSD1306_MEM_MODE_HORIZONTAL); + + ssd_push(display, SSD1306_SEG_REMAP_COL127); + ssd_push(display, SSD1306_COM_SCAN_REMAP); + ssd_push(display, SSD1306_COM_PINS_SEQUENTIAL); + + ssd_push(display, SSD1306_SET_CONTRAST); + ssd_push(display, 0xcf); + + ssd_push(display, SSD1306_SET_PRECHARGE); + ssd_push(display, 0xf1); + + ssd_push(display, SSD1306_SET_VCOMH); + ssd_push(display, SSD1306_VCOMH_0_77); + + ssd_push(display, SSD1306_ENTIRE_DISPLAY_RESUME); + ssd_push(display, SSD1306_NORMAL_DISPLAY); + ssd_push(display, SSD1306_SCROLL_DEACTIVATE); + ssd_push(display, SSD1306_DISPLAY_ON); + + return ssd_send(display); +} -- cgit v1.3.1