/* * File: oled.c * Author: www.hetenko.org * Created on 2017/04/08, 10:32 * * Original Author Nicolas Pannwitz (http://pic-projekte.de) */ #include #include #include #include "oled.h" #include "font25x32.h" void oled_command(unsigned char command) { TinyI2C_start(); TinyI2C_write(SSD1306_DEFAULT_ADDRESS); TinyI2C_write(0x00); TinyI2C_write(command); TinyI2C_stop(); } void oled_init(void) { // Turn display off oled_command(SSD1306_DISPLAYOFF); oled_command(SSD1306_SETDISPLAYCLOCKDIV); oled_command(0x80); oled_command(SSD1306_SETMULTIPLEX); oled_command(0x3F); oled_command(SSD1306_SETDISPLAYOFFSET); oled_command(0x00); oled_command(SSD1306_SETSTARTLINE | 0x00); // We use internal charge pump oled_command(SSD1306_CHARGEPUMP); oled_command(0x14); // Horizontal memory mode oled_command(SSD1306_MEMORYMODE); oled_command(0x00); oled_command(SSD1306_SEGREMAP | 0x01); oled_command(SSD1306_COMSCANDEC); oled_command(SSD1306_SETCOMPINS); oled_command(0x12); // Max contrast oled_command(SSD1306_SETCONTRAST); oled_command(0x4f); oled_command(SSD1306_SETPRECHARGE); oled_command(0xF1); oled_command(SSD1306_SETVCOMDETECT); oled_command(0x40); oled_command(SSD1306_DISPLAYALLON_RESUME); // Non-inverted display oled_command(SSD1306_NORMALDISPLAY); // oled_command(SSD1306_INVERTDISPLAY); // Turn display back on oled_command(SSD1306_DISPLAYON); } void oled_invert(unsigned char inverted) { if(inverted) oled_command(SSD1306_INVERTDISPLAY); else oled_command(SSD1306_NORMALDISPLAY); } void oled_clear(void) { unsigned int i; TinyI2C_start(); TinyI2C_write(SSD1306_DEFAULT_ADDRESS); TinyI2C_write(0x00); TinyI2C_write(SSD1306_SETPAGEADDRESS); TinyI2C_write(SSD1306_COLUMNADDR); TinyI2C_write(SSD1306_SETLOWCOLUMN); TinyI2C_write(0x7F); TinyI2C_stop(); TinyI2C_start(); TinyI2C_write(SSD1306_DEFAULT_ADDRESS); TinyI2C_write(0x40); for(i = 0; i < (SSD1306_WIDTH * SSD1306_HEIGHT / 8); i++) TinyI2C_write(0x00); TinyI2C_stop(); } void oled_char(unsigned int x, unsigned int y, unsigned int fIndex) { unsigned char width; unsigned char height; unsigned char loop; unsigned char i, j; width = FONT_WIDTH; height = FONT_HEIGHT; loop = FONT_HEIGHT / 8; for(i = 0; i < loop; i++) { TinyI2C_start(); TinyI2C_write(SSD1306_DEFAULT_ADDRESS); TinyI2C_write(0x00); TinyI2C_write(SSD1306_MEMORYMODE); TinyI2C_write(0x02); TinyI2C_write(SSD1306_SETPAGEADDRESS | y + i); TinyI2C_write(SSD1306_SETLOWCOLUMN | (x & 0xF)); TinyI2C_write(SSD1306_SETHIGHCOLUMN | ((x >> 4) & 0xF)); TinyI2C_stop(); TinyI2C_start(); TinyI2C_write(SSD1306_DEFAULT_ADDRESS); TinyI2C_write(0x40); for(j = 0; j < width; j++) TinyI2C_write(pgm_read_byte(&font[fIndex + j * loop + i + 1])); TinyI2C_stop(); } } void oled_string(unsigned int x, unsigned int y, const char *pS) { unsigned int lIndex, k; unsigned char width; unsigned char height; width = FONT_WIDTH; height = FONT_HEIGHT; while(*pS) { lIndex = 0; for(k = 0; k < (*pS - ' '); k++) lIndex += (height / 8) * width + 1; oled_char(x, y, lIndex); x += width; pS++; } }