oled displey
TroykaOLED.h@0:cd4a2add97a0, 2019-07-23 (annotated)
- Committer:
- docent
- Date:
- Tue Jul 23 12:32:26 2019 +0000
- Revision:
- 0:cd4a2add97a0
for my students
Who changed what in which revision?
User | Revision | Line number | New 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 |