oled displey

Committer:
docent
Date:
Tue Jul 23 12:32:26 2019 +0000
Revision:
0:cd4a2add97a0
for my students

Who changed what in which revision?

UserRevisionLine numberNew contents of line
docent 0:cd4a2add97a0 1 #ifndef TROYKA_OLED_H
docent 0:cd4a2add97a0 2 #define TROYKA_OLED_H
docent 0:cd4a2add97a0 3
docent 0:cd4a2add97a0 4 #include "mbed.h"
docent 0:cd4a2add97a0 5 //#include <Wire.h>
docent 0:cd4a2add97a0 6 #include "defaultFonts.h"
docent 0:cd4a2add97a0 7 #include "defaultImages.h"
docent 0:cd4a2add97a0 8
docent 0:cd4a2add97a0 9 #define DEC 10 //my
docent 0:cd4a2add97a0 10 // адрес дисплея
docent 0:cd4a2add97a0 11 #define SSD1306_ADDRESS 0x78 //0x3C
docent 0:cd4a2add97a0 12 // установка контрастности, за данной командой должен быть отправлен байт контрастности от 00 до FF (по умолчанию 0x7F)
docent 0:cd4a2add97a0 13 #define SSD1306_SET_CONTRAST 0x81
docent 0:cd4a2add97a0 14 // включить изображение
docent 0:cd4a2add97a0 15 #define SSD1306_RAM_ON 0xA4
docent 0:cd4a2add97a0 16 // выключить изображение
docent 0:cd4a2add97a0 17 #define SSD1306_RAM_OFF 0xA5
docent 0:cd4a2add97a0 18 // пиксель установленный в 1 будет светиться
docent 0:cd4a2add97a0 19 #define SSD1306_INVERT_OFF 0xA6
docent 0:cd4a2add97a0 20 // пиксель установленный в 1 будет выключен
docent 0:cd4a2add97a0 21 #define SSD1306_INVERT_ON 0xA7
docent 0:cd4a2add97a0 22 // выключить дисплей
docent 0:cd4a2add97a0 23 #define SSD1306_DISPLAY_OFF 0xAE
docent 0:cd4a2add97a0 24 // включить дисплей
docent 0:cd4a2add97a0 25 #define SSD1306_DISPLAY_ON 0xAF
docent 0:cd4a2add97a0 26 // пустая команда
docent 0:cd4a2add97a0 27 #define SSD1306_NOP 0xE3
docent 0:cd4a2add97a0 28
docent 0:cd4a2add97a0 29 // включить прокрутку
docent 0:cd4a2add97a0 30 #define SSD1306_SCROLL_ON 0x2F
docent 0:cd4a2add97a0 31 // выключить прокрутку
docent 0:cd4a2add97a0 32 #define SSD1306_SCROLL_OFF 0x2E
docent 0:cd4a2add97a0 33 // настройка непрерывной горизонтальной прокрутки вправо. За данной командой должны быть отправлены 6 байт настроек
docent 0:cd4a2add97a0 34 #define SSD1306_SCROLL_HORIZONTAL_RIGHT 0x26
docent 0:cd4a2add97a0 35 // настройка непрерывной горизонтальной прокрутки влево. За данной командой должны быть отправлены 6 байт настроек
docent 0:cd4a2add97a0 36 #define SSD1306_SCROLL_HORIZONTAL_LEFT 0x27
docent 0:cd4a2add97a0 37 // настройка непрерывной диагональной прокрутки вправо. За данной командой должны быть отправлены 5 байт настроек
docent 0:cd4a2add97a0 38 #define SSD1306_SCROLL_DIAGONAL_RIGHT 0x29
docent 0:cd4a2add97a0 39 // настройка непрерывной диагональной прокрутки влево. За данной командой должны быть отправлены 5 байт настроек
docent 0:cd4a2add97a0 40 #define SSD1306_SCROLL_DIAGONAL_LEFT 0x2A
docent 0:cd4a2add97a0 41 // настройка непрерывной вертикальной прокрутки. За данной командой должны быть отправлены 2 байта настроек
docent 0:cd4a2add97a0 42 #define SSD1306_SCROLL_VERTICAL 0xA3
docent 0:cd4a2add97a0 43
docent 0:cd4a2add97a0 44 // установка младшей части адреса колонки на странице
docent 0:cd4a2add97a0 45 // у данной команды младщие четыре бита должны быть изменены на младшие биты адреса
docent 0:cd4a2add97a0 46 // комадна предназначена только для режима страничной адресации
docent 0:cd4a2add97a0 47 #define SSD1306_ADDR_COLUMN_LBS 0x00
docent 0:cd4a2add97a0 48 // установка старшей части адреса колонки на странице
docent 0:cd4a2add97a0 49 // у данной команды младщие четыре бита должны быть изменены на старшие биты адреса
docent 0:cd4a2add97a0 50 // комадна предназначена только для режима страничной адресации
docent 0:cd4a2add97a0 51 #define SSD1306_ADDR_COLUMN_MBS 0x10
docent 0:cd4a2add97a0 52 // выбор режима адресации
docent 0:cd4a2add97a0 53 // за данной командой должен быть отправлен байт младшие биты которого определяют режим:
docent 0:cd4a2add97a0 54 // 00-горизонтальная (с переходом на новую страницу (строку))
docent 0:cd4a2add97a0 55 // 01-вертикальная (с переходом на новую колонку)
docent 0:cd4a2add97a0 56 // 10-страничная (только по выбранной странице)
docent 0:cd4a2add97a0 57 #define SSD1306_ADDR_MODE 0x20
docent 0:cd4a2add97a0 58 // установка адреса колонки
docent 0:cd4a2add97a0 59 // за данной командой должны быть отправлены два байта: начальный адрес и конечный адрес
docent 0:cd4a2add97a0 60 // так можно определить размер экрана в колонках по ширине
docent 0:cd4a2add97a0 61 #define SSD1306_ADDR_COLUMN 0x21
docent 0:cd4a2add97a0 62 // установка адреса страницы
docent 0:cd4a2add97a0 63 // за данной командой должны быть отправлены два байта: начальный адрес и конечный адрес
docent 0:cd4a2add97a0 64 // так можно определить размер экрана в строках по высоте
docent 0:cd4a2add97a0 65 #define SSD1306_ADDR_PAGE 0x22
docent 0:cd4a2add97a0 66 // установка номера страницы которая будет выбрана для режима страничной адресации
docent 0:cd4a2add97a0 67 // у данной команды младщие три бита должны быть изменены на номер страницы
docent 0:cd4a2add97a0 68 // комадна предназначена только для режима страничной адресации
docent 0:cd4a2add97a0 69 #define SSD1306_ADDR_ONE_PAGE 0xB0
docent 0:cd4a2add97a0 70
docent 0:cd4a2add97a0 71 // установить начальный адрес ОЗУ (смещение памяти)
docent 0:cd4a2add97a0 72 // у данной команды младщие шесть битов должны быть изменены на начальный адрес ОЗУ
docent 0:cd4a2add97a0 73 #define SSD1306_SET_START_LINE 0x40
docent 0:cd4a2add97a0 74 // установить режим строчной развёртки справа-налево
docent 0:cd4a2add97a0 75 #define SSD1306_SET_REMAP_R_TO_L 0xA0
docent 0:cd4a2add97a0 76 // установить режим строчной развёртки слева-направо
docent 0:cd4a2add97a0 77 #define SSD1306_SET_REMAP_L_TO_R 0xA1
docent 0:cd4a2add97a0 78 // установить multiplex ratio (количество используемых выводов COM для вывода данных на дисплей)
docent 0:cd4a2add97a0 79 // за данной командой должен быть отправлен один байт с указанием количества COM выводов (от 15 до 63)
docent 0:cd4a2add97a0 80 #define SSD1306_SET_MULTIPLEX_RATIO 0xA8
docent 0:cd4a2add97a0 81 // установить режим кадровой развёртки снизу-верх
docent 0:cd4a2add97a0 82 #define SSD1306_SET_REMAP_D_TO_T 0xC0
docent 0:cd4a2add97a0 83 // установить режим кадровой развёртки сверху-вниз
docent 0:cd4a2add97a0 84 #define SSD1306_SET_REMAP_T_TO_D 0xC8
docent 0:cd4a2add97a0 85 // установить смещение дисплея
docent 0:cd4a2add97a0 86 // за данной командой должен быть отправлен один байт с указанием вертикального сдвига чтения выходов COM (от 0 до 63).
docent 0:cd4a2add97a0 87 #define SSD1306_SET_DISPLAY_OFFSET 0xD3
docent 0:cd4a2add97a0 88 // установить тип аппаратной конфигурации COM выводов
docent 0:cd4a2add97a0 89 // за данной командой должен быть отправлен один байт, у которого:
docent 0:cd4a2add97a0 90 // четвёртый бит: 0-последовательная / 1-альтернативная
docent 0:cd4a2add97a0 91 // пятый бит: 0-отключить COM Left/Right remap / 1-включить COM Left/Right remap
docent 0:cd4a2add97a0 92 #define SSD1306_SET_COM_PINS 0xDA
docent 0:cd4a2add97a0 93
docent 0:cd4a2add97a0 94 // установить частоту обновления дисплея
docent 0:cd4a2add97a0 95 // за данной командой должен быть отправлен один байт, старшие четыре бита которого определяют частоту, а младшие делитель
docent 0:cd4a2add97a0 96 #define SSD1306_SET_DISPLAY_CLOCK 0xD5
docent 0:cd4a2add97a0 97 // установить фазы DC/DC преобразователя
docent 0:cd4a2add97a0 98 // за данной командой должен быть отправлен один байт, старшие четыре бита которого определяют период, а младшие период
docent 0:cd4a2add97a0 99 #define SSD1306_SET_PRECHARGE_PERIOD 0xD9
docent 0:cd4a2add97a0 100 // установить VcomH (влияет на яркость)
docent 0:cd4a2add97a0 101 // за данной командой должен быть отправлен один байт, старшие четыре бита которого определяют напряжение
docent 0:cd4a2add97a0 102 // пример: 0000 - VcomH=0.65Vcc, 0010 - VcomH=0.77Vcc, 0011 - VcomH=0.83Vcc и т.д.
docent 0:cd4a2add97a0 103 #define SSD1306_SET_VCOM_DESELECT 0xDB
docent 0:cd4a2add97a0 104 // управление DC/DC преобразователем
docent 0:cd4a2add97a0 105 // за данной командой должен быть отправлен один байт:
docent 0:cd4a2add97a0 106 // 0x10 - отключить (VCC подается извне), 0x14 - запустить внутренний DC/DC
docent 0:cd4a2add97a0 107 #define SSD1306_CHARGE_DCDC_PUMP 0x8D
docent 0:cd4a2add97a0 108
docent 0:cd4a2add97a0 109 // положение бита DC в командном байте
docent 0:cd4a2add97a0 110 // этот бит указывает что следующим байтом будет: 0-команда или 1-данные
docent 0:cd4a2add97a0 111 #define SSD1306_SHIFT_DC 0x06
docent 0:cd4a2add97a0 112 // положение бита CO в командном байте
docent 0:cd4a2add97a0 113 // этот бит указывает что после следующего байта (команды или данных) будет следовать (если будет): 0-байт данных или 1-новый командный байт
docent 0:cd4a2add97a0 114 #define SSD1306_SHIFT_CO 0x07
docent 0:cd4a2add97a0 115 // (CO=0, DC=0) => 0x00 контрольный байт после которого следует байт команды
docent 0:cd4a2add97a0 116 #define SSD1306_COMMAND (0 << SSD1306_SHIFT_CO) | (0 << SSD1306_SHIFT_DC)
docent 0:cd4a2add97a0 117 // (CO=0, DC=1) => 0x40 контрольный байт после которого следует байт данных
docent 0:cd4a2add97a0 118 #define SSD1306_DATA (0 << SSD1306_SHIFT_CO) | (1 << SSD1306_SHIFT_DC)
docent 0:cd4a2add97a0 119
docent 0:cd4a2add97a0 120 #define OLED_TOP 250
docent 0:cd4a2add97a0 121 #define OLED_BOTTOM 251
docent 0:cd4a2add97a0 122 #define OLED_LEFT 252
docent 0:cd4a2add97a0 123 #define OLED_RIGHT 253
docent 0:cd4a2add97a0 124 #define OLED_CENTER 254
docent 0:cd4a2add97a0 125 #define OLED_THIS 255
docent 0:cd4a2add97a0 126
docent 0:cd4a2add97a0 127 #define IMG_RAM 0
docent 0:cd4a2add97a0 128 #define IMG_ROM 1
docent 0:cd4a2add97a0 129
docent 0:cd4a2add97a0 130 #define TXT_CP866 0
docent 0:cd4a2add97a0 131 #define TXT_UTF8 1
docent 0:cd4a2add97a0 132 #define TXT_WIN1251 2
docent 0:cd4a2add97a0 133
docent 0:cd4a2add97a0 134 #define BLACK 0
docent 0:cd4a2add97a0 135 #define WHITE 1
docent 0:cd4a2add97a0 136 #define INVERSE 2
docent 0:cd4a2add97a0 137
docent 0:cd4a2add97a0 138 class TroykaOLED {
docent 0:cd4a2add97a0 139 public:
docent 0:cd4a2add97a0 140 TroykaOLED (I2C *i2c,uint8_t address = SSD1306_ADDRESS, uint8_t width = 128, uint8_t heigth = 64);
docent 0:cd4a2add97a0 141 void begin();// = &Wire);
docent 0:cd4a2add97a0 142 void update();
docent 0:cd4a2add97a0 143 void autoUpdate(bool stateAutoUpdate = true);
docent 0:cd4a2add97a0 144 void setBrigtness(uint8_t brigtness);
docent 0:cd4a2add97a0 145 void clearDisplay();
docent 0:cd4a2add97a0 146 void invertDisplay(bool stateInvert = true);
docent 0:cd4a2add97a0 147 void invertText(bool stateInvertText = true);
docent 0:cd4a2add97a0 148 void bgText(bool stateTextBG = true);
docent 0:cd4a2add97a0 149 void bgImage(bool stateImageBG = true);
docent 0:cd4a2add97a0 150 void setFont(const uint8_t* fontData);
docent 0:cd4a2add97a0 151 void setCoding(uint8_t codingName = false);
docent 0:cd4a2add97a0 152 void setCursor(int numX, int numY);
docent 0:cd4a2add97a0 153 void print(char* s, int x = OLED_THIS, int y = OLED_THIS);
docent 0:cd4a2add97a0 154 void print(const char* s, int x = OLED_THIS, int y = OLED_THIS);
docent 0:cd4a2add97a0 155 //void print(String s , int x = OLED_THIS, int y = OLED_THIS);
docent 0:cd4a2add97a0 156 void print(int8_t n, int x = OLED_THIS, int y = OLED_THIS, uint8_t base = DEC);
docent 0:cd4a2add97a0 157 void print(uint8_t n, int x = OLED_THIS, int y = OLED_THIS, uint8_t base = DEC);
docent 0:cd4a2add97a0 158 void print(int16_t n, int x = OLED_THIS, int y = OLED_THIS, uint8_t base = DEC);
docent 0:cd4a2add97a0 159 void print(uint16_t n, int x = OLED_THIS, int y = OLED_THIS, uint8_t base = DEC);
docent 0:cd4a2add97a0 160 void print(int32_t n, int x = OLED_THIS, int y = OLED_THIS, uint8_t base = DEC);
docent 0:cd4a2add97a0 161 void print(uint32_t n, int x = OLED_THIS, int y = OLED_THIS, uint8_t base = DEC);
docent 0:cd4a2add97a0 162 void print(double n, int x = OLED_THIS, int y = OLED_THIS, uint8_t digits = 2);
docent 0:cd4a2add97a0 163 void drawPixel(int x, int y, uint8_t color = WHITE);
docent 0:cd4a2add97a0 164 void drawLine(int x1, int y1, int x2, int y2, uint8_t color = WHITE);
docent 0:cd4a2add97a0 165 void drawLine(int x2, int y2, uint8_t color = WHITE);
docent 0:cd4a2add97a0 166 void drawRect(int x1, int y1, int x2, int y2, bool fill = false, uint8_t color = WHITE);
docent 0:cd4a2add97a0 167 void drawCircle(int x, int y, uint8_t r, bool fill = false, uint8_t color = WHITE);
docent 0:cd4a2add97a0 168 void drawImage(const uint8_t* image, int x = OLED_THIS, int y = OLED_THIS, uint8_t mem = IMG_ROM);
docent 0:cd4a2add97a0 169 bool getPixel(int x, int y);
docent 0:cd4a2add97a0 170 uint8_t getWidth() { return _width; }
docent 0:cd4a2add97a0 171 uint8_t getHeigth() { return _height; }
docent 0:cd4a2add97a0 172 uint8_t getFontWidth() { return _font.width; }
docent 0:cd4a2add97a0 173 uint8_t getFontHeight() { return _font.height; }
docent 0:cd4a2add97a0 174 uint8_t getImageWidth(const uint8_t* image, uint8_t mem = IMG_ROM);
docent 0:cd4a2add97a0 175 uint8_t getImageHeight(const uint8_t* image, uint8_t mem = IMG_ROM);
docent 0:cd4a2add97a0 176
docent 0:cd4a2add97a0 177 private:
docent 0:cd4a2add97a0 178 //TwoWire* _wire;
docent 0:cd4a2add97a0 179 I2C *_wire;
docent 0:cd4a2add97a0 180 uint8_t _i2cAddress;
docent 0:cd4a2add97a0 181 uint8_t _width;
docent 0:cd4a2add97a0 182 uint8_t _height;
docent 0:cd4a2add97a0 183 uint8_t _numX;
docent 0:cd4a2add97a0 184 uint8_t _numY;
docent 0:cd4a2add97a0 185 uint8_t _codingName;
docent 0:cd4a2add97a0 186 bool _stateInvert;
docent 0:cd4a2add97a0 187 bool _stateAutoUpdate;
docent 0:cd4a2add97a0 188 bool _stateImageBG;
docent 0:cd4a2add97a0 189 uint8_t *_bufferDisplay;
docent 0:cd4a2add97a0 190 struct {
docent 0:cd4a2add97a0 191 const uint8_t* fontData;
docent 0:cd4a2add97a0 192 uint8_t width;// = 0;
docent 0:cd4a2add97a0 193 uint8_t height;// = 0;
docent 0:cd4a2add97a0 194 uint8_t firstSymbol;// = 0;
docent 0:cd4a2add97a0 195 uint8_t sumSymbol;// = 0;
docent 0:cd4a2add97a0 196 uint8_t startSpace[3];
docent 0:cd4a2add97a0 197 uint8_t sumSpace[3];
docent 0:cd4a2add97a0 198 bool invert;// = false;
docent 0:cd4a2add97a0 199 bool background;// = true;
docent 0:cd4a2add97a0 200 bool setFont;// = false;
docent 0:cd4a2add97a0 201 } _font;
docent 0:cd4a2add97a0 202
docent 0:cd4a2add97a0 203 bool bitRead(uint8_t data, uint8_t bit);//my
docent 0:cd4a2add97a0 204 void _drawPixel(int x, int y, uint8_t color = WHITE);
docent 0:cd4a2add97a0 205 void _drawLine(int x1, int y1, int x2, int y2, uint8_t color = WHITE);
docent 0:cd4a2add97a0 206 void _print(char*, int x, int y);
docent 0:cd4a2add97a0 207 char _itoa(uint8_t num);
docent 0:cd4a2add97a0 208 char* _codingCP866(char* data);
docent 0:cd4a2add97a0 209 void _sendCommand(uint8_t command);
docent 0:cd4a2add97a0 210 void _sendData(uint8_t* data, uint8_t sum);
docent 0:cd4a2add97a0 211 void _sendBuffer();
docent 0:cd4a2add97a0 212 };
docent 0:cd4a2add97a0 213
docent 0:cd4a2add97a0 214 #endif // TROYKA_OLED_H