Кто то работал с OLED (SSD1306) на чистом C?

  • Все темы в "разделе помощи" были преобразованы в ВОПРОСЫ. У вопроса можно выбрать ответ юзера в качестве лучшего ответа, и статус темы автоматически сменится на РЕШЕНО. Если ваш вопрос был решён - просьба пометить ответ, тем самым показав остальным, что он не актуален!

qbaddev

✩✩✩✩✩✩✩
23 Апр 2020
45
7
yavarenikya@gmail.com
Пишу в Atmel Studio, работаю с дисплеем через I2C.
Написал примитивный код по готовым библиотекам и даташиту (кривому).

При отправке команд на отрисовку пикселей, они рисуются тольков опредленных координатах по Y.
Текст работает отлично.

(I2C - полный аналог Wire, просто на чистом си)
Код:
    I2C_beginTransmission(OLED_ADDRESS);
    I2C_write(OLED_COMMAND_MODE);
    I2C_write(0x21); I2C_write(x); I2C_write(127);
    I2C_write(0x22); I2C_write(y / 8); I2C_write(3);
    I2C_endTransmission();
  
    I2C_beginTransmission(OLED_ADDRESS);
    I2C_write(OLED_DATA_MODE);
    I2C_write(1 << (y % 8));
    I2C_endTransmission();
Пишу в Atmel Studio, работаю с дисплеем через I2C.
Написал примитивный код по готовым библиотекам и даташиту (кривому).

При отправке команд на отрисовку пикселей, они рисуются тольков опредленных координатах по Y.
Текст работает отлично.

Код:
    I2C_beginTransmission(OLED_ADDRESS);
    I2C_write(OLED_COMMAND_MODE);
    I2C_write(0x21); I2C_write(x); I2C_write(127);
    I2C_write(0x22); I2C_write(y / 8); I2C_write(3);
    I2C_endTransmission();
   
    I2C_beginTransmission(OLED_ADDRESS);
    I2C_write(OLED_DATA_MODE);
    I2C_write(1 << (y % 8));
    I2C_endTransmission();
В реальности горизонтально линии не прирывыстые.
 

Вложения

qbaddev

✩✩✩✩✩✩✩
23 Апр 2020
45
7
yavarenikya@gmail.com
Я работал.
Там система инициализации - не пара строк.
ssd1306.h:
#include "font.h"

#define OLED_ADDRESS            0x3c
#define OLED_COMMAND_MODE       0x00
#define OLED_ONE_COMMAND_MODE   0x80
#define OLED_DATA_MODE          0x40
#define OLED_ONE_DATA_MODE      0xC0

#define OLED_W 128
#define OLED_H 32

void OLED_init();
void OLED_clear();
void OLED_setCursor(unsigned char row, unsigned char line);
void OLED_print(const char *string);

void OLED_sendCmd(unsigned char state);
void OLED_sendChar(char data);
void OLED_pixel(byte x, byte y);


static const uint8_t _oled_init[] PROGMEM = {
    0xAE,    //
    0xD5,    // CLOCK_DIV_RATIO
    0x80,
    0x8D,    // Charge pump
    0x14,
    0x20,    // Memory mode
    0x01,    // Vertical _addressing
    0xA1,    // Flip horizontally
    0xC8,    // Flip vertically
    0x81,    // Set contrast
    0xCF,    // brighter
    0xDB,    //
    0x40,    // brighter
    0xAF,    //
};

void OLED_init() {
    I2C_init();
    
    /*
    OLED_sendCmd(0xae);
    OLED_sendCmd(0xa1);
    OLED_sendCmd(0xaf);*/
    
    I2C_beginTransmission(OLED_ADDRESS);
    I2C_write(OLED_COMMAND_MODE);
    for (uint8_t i = 0; i < 15; i++) I2C_write(pgm_read_byte(&_oled_init[i]));
    
    I2C_write(0xDA);
    I2C_write(0x02);
    
    I2C_write(0xA8);
    I2C_write(0x1F);
    
    I2C_endTransmission();
    
    delay(10);
    OLED_clear();
}

void OLED_clear() {
    /*unsigned char i, k;
    for(k = 0; k < 2; k++) {
        OLED_setCursor(0, k);
        for(i = 0; i < 128; i++) {//clear all COL
            OLED_sendChar(0);
        }
    }*/
    I2C_beginTransmission(OLED_ADDRESS);
    I2C_write(OLED_COMMAND_MODE);
    I2C_write(0x21); I2C_write(0); I2C_write(127);
    I2C_write(0x22); I2C_write(0); I2C_write(3);
    I2C_endTransmission();
    for (int i = 0; i < 32; i++) {
        I2C_beginTransmission(OLED_ADDRESS);
        I2C_write(OLED_DATA_MODE);
        for (int i = 0; i < 32; i++) I2C_write(0);
        I2C_endTransmission();
    }
}

void OLED_setCursor(unsigned char row, unsigned char line) {
    unsigned char realrow = row;
    OLED_sendCmd(0xb1 + line);
    OLED_sendCmd(0x00 + (8 * realrow & 0x0f));
    OLED_sendCmd(0x10 + ((8 * realrow >> 4) & 0x07));
}

void OLED_print(const char *string) {
    char i = 0;
    while(*string) {
        for(i=0;i<8;i++) {
            OLED_sendChar(pgm_read_byte_near(OLED_Font + (*string - 0x20) * 8 + i));
        }
        *string++;
    }
}

void OLED_sendCmd(unsigned char state) {
    I2C_beginTransmission(OLED_ADDRESS);
    I2C_write(OLED_ONE_COMMAND_MODE);
    I2C_write(state);
    I2C_endTransmission();
}

void OLED_sendChar(char data) {
    I2C_beginTransmission(OLED_ADDRESS);
    I2C_write(0x40);
    I2C_write(data);
    I2C_endTransmission();
}

void OLED_pixel(byte x, byte y) {
    I2C_beginTransmission(OLED_ADDRESS);
    I2C_write(OLED_COMMAND_MODE);
    I2C_write(0x21); I2C_write(x); I2C_write(127);
    I2C_write(0x22); I2C_write(y / 8); I2C_write(3);
    I2C_endTransmission();
    
    I2C_beginTransmission(OLED_ADDRESS);
    I2C_write(OLED_DATA_MODE);
    I2C_write(1 << (y % 8));
    I2C_endTransmission();
}
 

Эдуард Анисимов

★★★✩✩✩✩
23 Сен 2019
677
181
54
Марий-Эл
Лучше не связываться с этим дисплеем.
Организация памяти дурная. Работать с ним сложно. Очень маленький.
И за те деньги, что он стоит, можно купить 1.8" цветной дисплей.
 

qbaddev

✩✩✩✩✩✩✩
23 Апр 2020
45
7
yavarenikya@gmail.com
Лучше не связываться с этим дисплеем.
Организация памяти дурная. Работать с ним сложно. Очень маленький.
И за те деньги, что он стоит, можно купить 1.8" цветной дисплей.
Насчет 1.8" - не правда. Где ты так дешево найдешь?
Да и скорость поменьше будет. Этот дисплей поговаривают до 35 FPS выдает.

И еще, он уже есть. А делать нечего...
 

Эдуард Анисимов

★★★✩✩✩✩
23 Сен 2019
677
181
54
Марий-Эл
Этот дисплей поговаривают до 35 FPS выдает
На лифте тоже много чего написано. Тем не менее он железный и поднимается на тросе.
Такую скорость можно получить только выводя готовые картинки.
Посчитай, сколько байт нужно ему пихнуть для вывода картинки, посчитай сколько выдерживает интерфейс. И ты узнаешь чистое время вывода, без пересчёта картинки, а если начнёшь её ещё и считать.....
На любом дисплее можно получить что то приличное, но придётся забыть про библиотеки.
Wfvgat пока не доступен. Поэтому скину скриншот
1594662549665.png
Ну и как разница в цене?
Прямо огромная?
А цветным работать проще и быстрее.
 
  • Лойс +1
Реакции: qbaddev

qbaddev

✩✩✩✩✩✩✩
23 Апр 2020
45
7
yavarenikya@gmail.com
На лифте тоже много чего написано. Тем не менее он железный и поднимается на тросе.
Такую скорость можно получить только выводя готовые картинки.
Посчитай, сколько байт нужно ему пихнуть для вывода картинки, посчитай сколько выдерживает интерфейс. И ты узнаешь чистое время вывода, без пересчёта картинки, а если начнёшь её ещё и считать.....
На любом дисплее можно получить что то приличное, но придётся забыть про библиотеки.
Wfvgat пока не доступен. Поэтому скину скриншот
Посмотреть вложение 14840
Ну и как разница в цене?
Прямо огромная?
А цветным работать проще и быстрее.
Плохой с меня сыщик!