void ssd1306_init(ssd1306_t *ssd, i2c_dev_t *i2c_dev) { assert(ssd); assert(i2c_dev); ssd->i2c_dev = i2c_dev; ssd->width = 128; ssd->height = 64; ssd->buf = (uint8_t *)malloc((ssd->width * ssd->height / 8)); ssd1306_cmd1(ssd, SSD_DISPLAY_OFF); ssd1306_cmd2(ssd, SSD1306_SETDISPLAYCLOCKDIV, 0x80); ssd1306_cmd2(ssd, SSD1306_SETMULTIPLEX, 0x3F); ssd1306_cmd2(ssd, SSD1306_SETDISPLAYOFFSET, 0x00); ssd1306_cmd1(ssd, SSD1306_SETSTARTLINE); ssd1306_cmd2(ssd, SSD1306_CHARGEPUMP, 0x14); ssd1306_cmd2(ssd, SSD1306_MEMORYMODE, 0x00); ssd1306_cmd1(ssd, SSD1306_SEGREMAP | 0x1); ssd1306_cmd1(ssd, SSD1306_COMSCANDEC); ssd1306_cmd2(ssd, SSD1306_SETCOMPINS, 0x12); ssd1306_cmd2(ssd, SSD_SET_CONTRAST, 0xCF); ssd1306_cmd2(ssd, SSD1306_SETPRECHARGE, 0xF1); ssd1306_cmd2(ssd, SSD1306_SETVCOMDETECT, 0x40); ssd1306_cmd1(ssd, SSD1306_DISPLAYALLON_RESUME); ssd1306_cmd1(ssd, SSD1306_Normal_Display); ssd1306_cmd3(ssd, 0x21, 0, 127); ssd1306_cmd3(ssd, 0x22, 0, 7); ssd1306_cmd1(ssd, SSD_DEACTIVATE_SCROLL); ssd1306_clear(ssd); ssd1306_update(ssd); ssd1306_cmd1(ssd, SSD_DISPLAY_ON); }
void blit(char *data) { for (int x = 0; x < ssd.width; x++) for (int y = 0; y < ssd.height; y++) ssd1306_set_pixel(&ssd, x, y, data[x + y * ssd.width]); ssd1306_update(&ssd); }
void ssd1306_init(I2C_HandleTypeDef* hi2c) { ssd1306_sendCmd(hi2c, SSD1306_DISPLAY_OFF); ssd1306_sendCmd(hi2c, SSD1306_SET_DISPLAY_CLOCK_DIV_RATIO); ssd1306_sendCmd(hi2c, 0x80); ssd1306_sendCmd(hi2c, SSD1306_SET_MULTIPLEX_RATIO); ssd1306_sendCmd(hi2c, 0x3F); ssd1306_sendCmd(hi2c, SSD1306_SET_DISPLAY_OFFSET); ssd1306_sendCmd(hi2c, 0x0); ssd1306_sendCmd(hi2c, SSD1306_SET_START_LINE | 0x0); ssd1306_sendCmd(hi2c, SSD1306_CHARGE_PUMP); ssd1306_sendCmd(hi2c, 0x14); ssd1306_sendCmd(hi2c, SSD1306_MEMORY_ADDR_MODE); ssd1306_sendCmd(hi2c, 0x00); ssd1306_sendCmd(hi2c, SSD1306_SET_SEGMENT_REMAP | 0x1); ssd1306_sendCmd(hi2c, SSD1306_COM_SCAN_DIR_DEC); ssd1306_sendCmd(hi2c, SSD1306_SET_COM_PINS); ssd1306_sendCmd(hi2c, 0x12); ssd1306_sendCmd(hi2c, SSD1306_SET_CONTRAST_CONTROL); ssd1306_sendCmd(hi2c, 0xCF); ssd1306_sendCmd(hi2c, SSD1306_SET_PRECHARGE_PERIOD); ssd1306_sendCmd(hi2c, 0xF1); ssd1306_sendCmd(hi2c, SSD1306_SET_VCOM_DESELECT); ssd1306_sendCmd(hi2c, 0x40); ssd1306_sendCmd(hi2c, SSD1306_DISPLAY_ALL_ON_RESUME); ssd1306_sendCmd(hi2c, SSD1306_NORMAL_DISPLAY); ssd1306_sendCmd(hi2c, SSD1306_DISPLAY_ON); ssd1306_clear(); ssd1306_update(hi2c); }
void update(void) { ASSERT_INIT(); ssd1306_update(&ssd); }