oled displey

TroykaOLED.h

Committer:
docent
Date:
2019-07-23
Revision:
0:cd4a2add97a0

File content as of revision 0:cd4a2add97a0:

#ifndef TROYKA_OLED_H
#define TROYKA_OLED_H

#include "mbed.h"
//#include <Wire.h>
#include "defaultFonts.h"
#include "defaultImages.h"

#define DEC 10 //my
// адрес дисплея
#define SSD1306_ADDRESS                0x78         //0x3C
// установка контрастности, за данной командой должен быть отправлен байт контрастности от 00 до FF (по умолчанию 0x7F)
#define SSD1306_SET_CONTRAST                    0x81
// включить  изображение
#define SSD1306_RAM_ON                          0xA4
// выключить изображение
#define SSD1306_RAM_OFF                         0xA5
// пиксель установленный в 1 будет светиться
#define SSD1306_INVERT_OFF                      0xA6
// пиксель установленный в 1 будет выключен
#define SSD1306_INVERT_ON                       0xA7
// выключить дисплей
#define SSD1306_DISPLAY_OFF                     0xAE
// включить  дисплей
#define SSD1306_DISPLAY_ON                      0xAF
// пустая команда
#define SSD1306_NOP                             0xE3

// включить  прокрутку
#define SSD1306_SCROLL_ON                       0x2F
// выключить  прокрутку
#define SSD1306_SCROLL_OFF                      0x2E
// настройка непрерывной горизонтальной прокрутки вправо. За данной командой должны быть отправлены 6 байт настроек
#define SSD1306_SCROLL_HORIZONTAL_RIGHT         0x26
// настройка непрерывной горизонтальной прокрутки влево. За данной командой должны быть отправлены 6 байт настроек
#define SSD1306_SCROLL_HORIZONTAL_LEFT          0x27
// настройка непрерывной диагональной прокрутки вправо. За данной командой должны быть отправлены 5 байт настроек
#define SSD1306_SCROLL_DIAGONAL_RIGHT           0x29
// настройка непрерывной диагональной прокрутки влево. За данной командой должны быть отправлены 5 байт настроек
#define SSD1306_SCROLL_DIAGONAL_LEFT            0x2A
// настройка непрерывной вертикальной прокрутки. За данной командой должны быть отправлены 2 байта настроек
#define SSD1306_SCROLL_VERTICAL                 0xA3

// установка младшей части адреса колонки на странице
// у данной команды младщие четыре бита должны быть изменены на младшие биты адреса
// комадна предназначена только для режима страничной адресации
#define SSD1306_ADDR_COLUMN_LBS                 0x00
// установка старшей части адреса колонки на странице
// у данной команды младщие четыре бита должны быть изменены на старшие биты адреса
// комадна предназначена только для режима страничной адресации
#define SSD1306_ADDR_COLUMN_MBS                 0x10
// выбор режима адресации 
// за данной командой должен быть отправлен байт младшие биты которого определяют режим:
// 00-горизонтальная (с переходом на новую страницу (строку))
// 01-вертикальная (с переходом на новую колонку) 
// 10-страничная (только по выбранной странице)
#define SSD1306_ADDR_MODE                       0x20
// установка адреса колонки
// за данной командой должны быть отправлены два байта: начальный адрес и конечный адрес
// так можно определить размер экрана в колонках по ширине
#define SSD1306_ADDR_COLUMN                     0x21
// установка адреса страницы
// за данной командой должны быть отправлены два байта: начальный адрес и конечный адрес
// так можно определить размер экрана в строках по высоте
#define SSD1306_ADDR_PAGE                       0x22
// установка номера страницы которая будет выбрана для режима страничной адресации
// у данной команды младщие три бита должны быть изменены на номер страницы
// комадна предназначена только для режима страничной адресации
#define SSD1306_ADDR_ONE_PAGE                   0xB0

// установить начальный адрес ОЗУ (смещение памяти)
// у данной команды младщие шесть битов должны быть изменены на начальный адрес ОЗУ
#define SSD1306_SET_START_LINE                  0x40
// установить режим строчной развёртки справа-налево
#define SSD1306_SET_REMAP_R_TO_L                0xA0
// установить режим строчной развёртки слева-направо
#define SSD1306_SET_REMAP_L_TO_R                0xA1
// установить multiplex ratio (количество используемых выводов COM для вывода данных на дисплей)
// за данной командой должен быть отправлен один байт с указанием количества COM выводов (от 15 до 63)
#define SSD1306_SET_MULTIPLEX_RATIO             0xA8
// установить режим кадровой развёртки снизу-верх
#define SSD1306_SET_REMAP_D_TO_T                0xC0
// установить режим кадровой развёртки сверху-вниз
#define SSD1306_SET_REMAP_T_TO_D                0xC8
// установить смещение дисплея
// за данной командой должен быть отправлен один байт с указанием вертикального сдвига чтения выходов COM (от 0 до 63).
#define SSD1306_SET_DISPLAY_OFFSET              0xD3
// установить тип аппаратной конфигурации COM выводов
// за данной командой должен быть отправлен один байт, у которого:
// четвёртый бит: 0-последовательная / 1-альтернативная 
// пятый бит: 0-отключить COM Left/Right remap / 1-включить COM Left/Right remap
#define SSD1306_SET_COM_PINS                    0xDA

// установить частоту обновления дисплея
// за данной командой должен быть отправлен один байт, старшие четыре бита которого определяют частоту, а младшие делитель
#define SSD1306_SET_DISPLAY_CLOCK               0xD5
// установить фазы DC/DC преобразователя
// за данной командой должен быть отправлен один байт, старшие четыре бита которого определяют период, а младшие период
#define SSD1306_SET_PRECHARGE_PERIOD            0xD9
// установить VcomH (влияет на яркость)
// за данной командой должен быть отправлен один байт, старшие четыре бита которого определяют напряжение
// пример: 0000 - VcomH=0.65Vcc, 0010 - VcomH=0.77Vcc, 0011 - VcomH=0.83Vcc и т.д.
#define SSD1306_SET_VCOM_DESELECT               0xDB
// управление DC/DC преобразователем
// за данной командой должен быть отправлен один байт:
// 0x10 - отключить (VCC подается извне), 0x14 - запустить внутренний DC/DC
#define SSD1306_CHARGE_DCDC_PUMP                0x8D

// положение бита DC в командном байте
// этот бит указывает что следующим байтом будет: 0-команда или 1-данные
#define SSD1306_SHIFT_DC                        0x06
// положение бита CO в командном байте
// этот бит указывает что после следующего байта (команды или данных) будет следовать (если будет): 0-байт данных или 1-новый командный байт
#define SSD1306_SHIFT_CO                        0x07
// (CO=0, DC=0) => 0x00 контрольный байт после которого следует байт команды
#define SSD1306_COMMAND                         (0 << SSD1306_SHIFT_CO) | (0 << SSD1306_SHIFT_DC)
// (CO=0, DC=1) => 0x40 контрольный байт после которого следует байт данных
#define SSD1306_DATA                            (0 << SSD1306_SHIFT_CO) | (1 << SSD1306_SHIFT_DC)

#define OLED_TOP                                250
#define OLED_BOTTOM                             251
#define OLED_LEFT                               252
#define OLED_RIGHT                              253
#define OLED_CENTER                             254
#define OLED_THIS                               255

#define IMG_RAM                                 0
#define IMG_ROM                                 1

#define TXT_CP866                               0
#define TXT_UTF8                                1
#define TXT_WIN1251                             2

#define BLACK                                   0
#define WHITE                                   1
#define INVERSE                                 2

class TroykaOLED {
public:
    TroykaOLED (I2C *i2c,uint8_t address = SSD1306_ADDRESS, uint8_t width = 128, uint8_t heigth = 64);
    void begin();// = &Wire);
    void update();
    void autoUpdate(bool stateAutoUpdate = true);
    void setBrigtness(uint8_t brigtness);
    void clearDisplay();
    void invertDisplay(bool stateInvert = true);
    void invertText(bool stateInvertText = true);
    void bgText(bool stateTextBG = true);
    void bgImage(bool stateImageBG = true);
    void setFont(const uint8_t* fontData);
    void setCoding(uint8_t codingName = false);
    void setCursor(int numX, int numY);
    void print(char* s, int x = OLED_THIS, int y = OLED_THIS);
    void print(const char* s, int x = OLED_THIS, int y = OLED_THIS);
    //void print(String s , int x = OLED_THIS, int y = OLED_THIS);
    void print(int8_t n, int x = OLED_THIS, int y = OLED_THIS, uint8_t base = DEC);
    void print(uint8_t n, int x = OLED_THIS, int y = OLED_THIS, uint8_t base = DEC);
    void print(int16_t n, int x = OLED_THIS, int y = OLED_THIS, uint8_t base = DEC);
    void print(uint16_t n, int x = OLED_THIS, int y = OLED_THIS, uint8_t base = DEC);
    void print(int32_t n, int x = OLED_THIS, int y = OLED_THIS, uint8_t base = DEC);
    void print(uint32_t n, int x = OLED_THIS, int y = OLED_THIS, uint8_t base = DEC);
    void print(double n, int x = OLED_THIS, int y = OLED_THIS, uint8_t digits = 2);
    void drawPixel(int x, int y, uint8_t color = WHITE); 
    void drawLine(int x1, int y1, int x2, int y2, uint8_t color = WHITE);
    void drawLine(int x2, int y2, uint8_t color = WHITE);
    void drawRect(int x1, int y1, int x2, int y2, bool fill = false, uint8_t color = WHITE);
    void drawCircle(int x, int y, uint8_t r, bool fill = false, uint8_t color = WHITE);
    void drawImage(const uint8_t* image, int x = OLED_THIS, int y = OLED_THIS, uint8_t mem = IMG_ROM);
    bool getPixel(int x, int y);
    uint8_t getWidth() { return _width; }
    uint8_t getHeigth() { return _height; }
    uint8_t getFontWidth() { return _font.width; }
    uint8_t getFontHeight() {  return _font.height; } 
    uint8_t getImageWidth(const uint8_t* image, uint8_t mem = IMG_ROM);
    uint8_t getImageHeight(const uint8_t* image, uint8_t mem = IMG_ROM);

private:
    //TwoWire* _wire;
    I2C    *_wire;
    uint8_t _i2cAddress;
    uint8_t _width;
    uint8_t _height;
    uint8_t _numX;
    uint8_t _numY;
    uint8_t _codingName;
    bool _stateInvert;
    bool _stateAutoUpdate;
    bool _stateImageBG;
    uint8_t *_bufferDisplay;
    struct {
        const uint8_t* fontData;
        uint8_t width;// = 0;
        uint8_t height;// = 0;
        uint8_t firstSymbol;// = 0;
        uint8_t sumSymbol;// = 0;
        uint8_t startSpace[3];
        uint8_t sumSpace[3];
        bool invert;// = false;
        bool background;// = true;
        bool setFont;// = false;
    } _font;

    bool bitRead(uint8_t data, uint8_t bit);//my
    void _drawPixel(int x, int y, uint8_t color = WHITE);
    void _drawLine(int x1, int y1, int x2, int y2, uint8_t color = WHITE);
    void _print(char*, int x, int y);
    char _itoa(uint8_t num);
    char* _codingCP866(char* data);
    void _sendCommand(uint8_t command);
    void _sendData(uint8_t* data, uint8_t sum);
    void _sendBuffer();
};

#endif // TROYKA_OLED_H