oled displey

Revision:
0:cd4a2add97a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TroykaOLED.h	Tue Jul 23 12:32:26 2019 +0000
@@ -0,0 +1,214 @@
+#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