A derived version of the BSD licensed Adafrut GFX library for the SSD1351 controller for an OLED 128x 96or 128x128 display using SPI

Fork of Adafruit_GFX by Neal Horman

/media/uploads/Dzhafarkhanov/1673-09.jpg

You can print russian. (font edited).

class SPIPreInit : public SPI { public: SPIPreInit(PinName mosi, PinName miso, PinName clk) : SPI(mosi,miso,clk) { format(8,3); frequency(25000000); }; }; SPIPreInit gSpi(PB_15,NC,PB_13); PinName mosi(sda), PinName miso, PinName clk(scl) Adafruit_SSD1351_Spi oled(gSpi,PB_14,PB_1,PB_2); PinName DC, PinName RST, PinName CS

Committer:
Dzhafarkhanov
Date:
Wed Feb 24 12:24:42 2016 +0000
Revision:
17:56015e4834e6
Parent:
Adafruit_SSD1306.cpp@16:7fb1d4d3525d
SSD1351;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nkhorman 0:c3dcd4c4983a 1 /*********************************************************************
Dzhafarkhanov 17:56015e4834e6 2 This is a library for our Monochrome OLEDs based on SSD1351 drivers
nkhorman 0:c3dcd4c4983a 3
nkhorman 0:c3dcd4c4983a 4 Pick one up today in the adafruit shop!
nkhorman 0:c3dcd4c4983a 5 ------> http://www.adafruit.com/category/63_98
nkhorman 0:c3dcd4c4983a 6
nkhorman 0:c3dcd4c4983a 7 These displays use SPI to communicate, 4 or 5 pins are required to
nkhorman 0:c3dcd4c4983a 8 interface
nkhorman 0:c3dcd4c4983a 9
nkhorman 0:c3dcd4c4983a 10 Adafruit invests time and resources providing this open source code,
nkhorman 0:c3dcd4c4983a 11 please support Adafruit and open-source hardware by purchasing
nkhorman 0:c3dcd4c4983a 12 products from Adafruit!
nkhorman 0:c3dcd4c4983a 13
nkhorman 0:c3dcd4c4983a 14 Written by Limor Fried/Ladyada for Adafruit Industries.
nkhorman 0:c3dcd4c4983a 15 BSD license, check license.txt for more information
nkhorman 0:c3dcd4c4983a 16 All text above, and the splash screen below must be included in any redistribution
nkhorman 0:c3dcd4c4983a 17 *********************************************************************/
nkhorman 0:c3dcd4c4983a 18
nkhorman 0:c3dcd4c4983a 19 /*
nkhorman 9:ddb97c9850a2 20 * Modified by Neal Horman 7/14/2012 for use in mbed
nkhorman 0:c3dcd4c4983a 21 */
nkhorman 0:c3dcd4c4983a 22
nkhorman 0:c3dcd4c4983a 23 #include "mbed.h"
Dzhafarkhanov 17:56015e4834e6 24 #include "Adafruit_SSD1351.h"
Dzhafarkhanov 17:56015e4834e6 25
Dzhafarkhanov 17:56015e4834e6 26 #ifndef _BV
Dzhafarkhanov 17:56015e4834e6 27 #define _BV(bit) (1<<(bit))
Dzhafarkhanov 17:56015e4834e6 28 #endif
Dzhafarkhanov 17:56015e4834e6 29
Dzhafarkhanov 17:56015e4834e6 30
Dzhafarkhanov 17:56015e4834e6 31 #define SSD1351_COLORORDER_BGR
Dzhafarkhanov 17:56015e4834e6 32
Dzhafarkhanov 17:56015e4834e6 33
Dzhafarkhanov 17:56015e4834e6 34
Dzhafarkhanov 17:56015e4834e6 35
Dzhafarkhanov 17:56015e4834e6 36 // Timing Delays
Dzhafarkhanov 17:56015e4834e6 37 #define SSD1351_DELAYS_HWFILL (3)
Dzhafarkhanov 17:56015e4834e6 38 #define SSD1351_DELAYS_HWLINE (1)
Dzhafarkhanov 17:56015e4834e6 39
Dzhafarkhanov 17:56015e4834e6 40 //old
Dzhafarkhanov 17:56015e4834e6 41 #define SSD1351_SETHIGHCOLUMN 0x10
nkhorman 0:c3dcd4c4983a 42
Dzhafarkhanov 17:56015e4834e6 43 // SSD1351 Commands
Dzhafarkhanov 17:56015e4834e6 44 #define SSD1351_CMD_SETCOLUMN 0x15
Dzhafarkhanov 17:56015e4834e6 45 #define SSD1351_CMD_SETROW 0x75
Dzhafarkhanov 17:56015e4834e6 46 #define SSD1351_CMD_WRITERAM 0x5C
Dzhafarkhanov 17:56015e4834e6 47 #define SSD1351_CMD_READRAM 0x5D
Dzhafarkhanov 17:56015e4834e6 48 #define SSD1351_CMD_SETREMAP 0xA0
Dzhafarkhanov 17:56015e4834e6 49 #define SSD1351_CMD_STARTLINE 0xA1 //Set display start line
Dzhafarkhanov 17:56015e4834e6 50 #define SSD1351_CMD_DISPLAYOFFSET 0xA2
Dzhafarkhanov 17:56015e4834e6 51 #define SSD1351_CMD_DISPLAYALLOFF 0xA4
Dzhafarkhanov 17:56015e4834e6 52 #define SSD1351_CMD_DISPLAYALLON 0xA5
Dzhafarkhanov 17:56015e4834e6 53 #define SSD1351_CMD_NORMALDISPLAY 0xA6
Dzhafarkhanov 17:56015e4834e6 54 #define SSD1351_CMD_INVERTDISPLAY 0xA7
Dzhafarkhanov 17:56015e4834e6 55 #define SSD1351_CMD_FUNCTIONSELECT 0xAB
Dzhafarkhanov 17:56015e4834e6 56 #define SSD1351_CMD_DISPLAYOFF 0xAE
Dzhafarkhanov 17:56015e4834e6 57 #define SSD1351_CMD_DISPLAYON 0xAF
Dzhafarkhanov 17:56015e4834e6 58 #define SSD1351_CMD_PRECHARGE 0xB1
Dzhafarkhanov 17:56015e4834e6 59 #define SSD1351_CMD_DISPLAYENHANCE 0xB2
Dzhafarkhanov 17:56015e4834e6 60 #define SSD1351_CMD_CLOCKDIV 0xB3
Dzhafarkhanov 17:56015e4834e6 61 #define SSD1351_CMD_SETVSL 0xB4
Dzhafarkhanov 17:56015e4834e6 62 #define SSD1351_CMD_SETGPIO 0xB5
Dzhafarkhanov 17:56015e4834e6 63 #define SSD1351_CMD_PRECHARGE2 0xB6
Dzhafarkhanov 17:56015e4834e6 64 #define SSD1351_CMD_SETGRAY 0xB8
Dzhafarkhanov 17:56015e4834e6 65 #define SSD1351_CMD_USELUT 0xB9
Dzhafarkhanov 17:56015e4834e6 66 #define SSD1351_CMD_PRECHARGELEVEL 0xBB
Dzhafarkhanov 17:56015e4834e6 67 #define SSD1351_CMD_VCOMH 0xBE
Dzhafarkhanov 17:56015e4834e6 68 #define SSD1351_CMD_CONTRASTABC 0xC1
Dzhafarkhanov 17:56015e4834e6 69 #define SSD1351_CMD_CONTRASTMASTER 0xC7
Dzhafarkhanov 17:56015e4834e6 70 #define SSD1351_CMD_MUXRATIO 0xCA
Dzhafarkhanov 17:56015e4834e6 71 #define SSD1351_CMD_COMMANDLOCK 0xFD
Dzhafarkhanov 17:56015e4834e6 72 #define SSD1351_CMD_HORIZSCROLL 0x96
Dzhafarkhanov 17:56015e4834e6 73 #define SSD1351_CMD_STOPSCROLL 0x9E
Dzhafarkhanov 17:56015e4834e6 74 #define SSD1351_CMD_STARTSCROLL 0x9F
nkhorman 0:c3dcd4c4983a 75
Dzhafarkhanov 17:56015e4834e6 76
Dzhafarkhanov 17:56015e4834e6 77
Dzhafarkhanov 17:56015e4834e6 78
Dzhafarkhanov 17:56015e4834e6 79 void Adafruit_SSD1351::begin(void)//oled init
nkhorman 0:c3dcd4c4983a 80 {
nkhorman 0:c3dcd4c4983a 81 rst = 1;
nkhorman 0:c3dcd4c4983a 82 // VDD (3.3V) goes high at start, lets just chill for a ms
Dzhafarkhanov 17:56015e4834e6 83 wait_ms(10);
nkhorman 0:c3dcd4c4983a 84 // bring reset low
nkhorman 0:c3dcd4c4983a 85 rst = 0;
nkhorman 0:c3dcd4c4983a 86 // wait 10ms
nkhorman 0:c3dcd4c4983a 87 wait_ms(10);
nkhorman 0:c3dcd4c4983a 88 // bring out of reset
nkhorman 0:c3dcd4c4983a 89 rst = 1;
Dzhafarkhanov 17:56015e4834e6 90 // turn on VCC (13V?)
Dzhafarkhanov 17:56015e4834e6 91 wait_ms(10);
Dzhafarkhanov 17:56015e4834e6 92
Dzhafarkhanov 17:56015e4834e6 93
Dzhafarkhanov 17:56015e4834e6 94 // Initialization Sequence
Dzhafarkhanov 17:56015e4834e6 95 writeCommand(SSD1351_CMD_COMMANDLOCK); // set command lock
Dzhafarkhanov 17:56015e4834e6 96 writeData(0x12);
Dzhafarkhanov 17:56015e4834e6 97 writeCommand(SSD1351_CMD_COMMANDLOCK); // set command lock
Dzhafarkhanov 17:56015e4834e6 98 writeData(0xB1);
Dzhafarkhanov 17:56015e4834e6 99
Dzhafarkhanov 17:56015e4834e6 100 writeCommand(SSD1351_CMD_DISPLAYOFF); // 0xAE
Dzhafarkhanov 17:56015e4834e6 101
Dzhafarkhanov 17:56015e4834e6 102 writeCommand(SSD1351_CMD_CLOCKDIV); // 0xB3
Dzhafarkhanov 17:56015e4834e6 103 writeCommand(0xF1); // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio (A[3:0]+1 = 1..16)
Dzhafarkhanov 17:56015e4834e6 104
Dzhafarkhanov 17:56015e4834e6 105 writeCommand(SSD1351_CMD_MUXRATIO);
Dzhafarkhanov 17:56015e4834e6 106 writeData(127);
Dzhafarkhanov 17:56015e4834e6 107
Dzhafarkhanov 17:56015e4834e6 108 writeCommand(SSD1351_CMD_SETREMAP);
Dzhafarkhanov 17:56015e4834e6 109 writeData(0x74);
Dzhafarkhanov 17:56015e4834e6 110
Dzhafarkhanov 17:56015e4834e6 111 writeCommand(SSD1351_CMD_SETCOLUMN);
Dzhafarkhanov 17:56015e4834e6 112 writeData(0x00);
Dzhafarkhanov 17:56015e4834e6 113 writeData(0x7F);
Dzhafarkhanov 17:56015e4834e6 114 writeCommand(SSD1351_CMD_SETROW);
Dzhafarkhanov 17:56015e4834e6 115 writeData(0x00);
Dzhafarkhanov 17:56015e4834e6 116 writeData(0x7F);
nkhorman 9:ddb97c9850a2 117
Dzhafarkhanov 17:56015e4834e6 118 writeCommand(SSD1351_CMD_STARTLINE); // 0xA1
Dzhafarkhanov 17:56015e4834e6 119
Dzhafarkhanov 17:56015e4834e6 120 if (height() == 96) {
Dzhafarkhanov 17:56015e4834e6 121 writeData(96);
Dzhafarkhanov 17:56015e4834e6 122 } else {
Dzhafarkhanov 17:56015e4834e6 123 writeData(0);
Dzhafarkhanov 17:56015e4834e6 124 }
nkhorman 9:ddb97c9850a2 125
Dzhafarkhanov 17:56015e4834e6 126 writeCommand(SSD1351_CMD_DISPLAYOFFSET); // 0xA2
Dzhafarkhanov 17:56015e4834e6 127 writeData(0x00);
nkhorman 9:ddb97c9850a2 128
Dzhafarkhanov 17:56015e4834e6 129 writeCommand(SSD1351_CMD_SETGPIO);
Dzhafarkhanov 17:56015e4834e6 130 writeData(0x00);
Dzhafarkhanov 17:56015e4834e6 131
Dzhafarkhanov 17:56015e4834e6 132 writeCommand(SSD1351_CMD_FUNCTIONSELECT);
Dzhafarkhanov 17:56015e4834e6 133 writeData(0x01); // internal (diode drop)
Dzhafarkhanov 17:56015e4834e6 134 //writeData(0x01); // external bias
nkhorman 9:ddb97c9850a2 135
Dzhafarkhanov 17:56015e4834e6 136 // writeCommand(SSSD1351_CMD_SETPHASELENGTH);
Dzhafarkhanov 17:56015e4834e6 137 // writeData(0x32);
Dzhafarkhanov 17:56015e4834e6 138
Dzhafarkhanov 17:56015e4834e6 139 writeCommand(SSD1351_CMD_PRECHARGE); // 0xB1
Dzhafarkhanov 17:56015e4834e6 140 writeCommand(0x32);
Dzhafarkhanov 17:56015e4834e6 141
Dzhafarkhanov 17:56015e4834e6 142 writeCommand(SSD1351_CMD_VCOMH); // 0xBE
Dzhafarkhanov 17:56015e4834e6 143 writeCommand(0x05);
chrta 4:853097cfa773 144
Dzhafarkhanov 17:56015e4834e6 145 writeCommand(SSD1351_CMD_NORMALDISPLAY); // 0xA6
nkhorman 9:ddb97c9850a2 146
Dzhafarkhanov 17:56015e4834e6 147 writeCommand(SSD1351_CMD_CONTRASTABC);
Dzhafarkhanov 17:56015e4834e6 148 writeData(0xC8); //0x8A //0xC8)
Dzhafarkhanov 17:56015e4834e6 149 writeData(0x80);//0x51 //0x80
Dzhafarkhanov 17:56015e4834e6 150 writeData(0xC8);// 0x8A //0xC8
Dzhafarkhanov 17:56015e4834e6 151
Dzhafarkhanov 17:56015e4834e6 152 writeCommand(SSD1351_CMD_CONTRASTMASTER);
Dzhafarkhanov 17:56015e4834e6 153 writeData(0x0F);
nkhorman 9:ddb97c9850a2 154
Dzhafarkhanov 17:56015e4834e6 155 writeCommand(SSD1351_CMD_SETVSL );
Dzhafarkhanov 17:56015e4834e6 156 writeData(0xA0);
Dzhafarkhanov 17:56015e4834e6 157 writeData(0xB5);
Dzhafarkhanov 17:56015e4834e6 158 writeData(0x55);
Dzhafarkhanov 17:56015e4834e6 159
Dzhafarkhanov 17:56015e4834e6 160 writeCommand(SSD1351_CMD_PRECHARGE2);
Dzhafarkhanov 17:56015e4834e6 161 writeData(0x01);
Dzhafarkhanov 17:56015e4834e6 162
Dzhafarkhanov 17:56015e4834e6 163 writeCommand(SSD1351_CMD_DISPLAYON); //--turn on oled panel
Dzhafarkhanov 17:56015e4834e6 164 }
nkhorman 9:ddb97c9850a2 165
Dzhafarkhanov 17:56015e4834e6 166 void Adafruit_SSD1351::invert(bool v) {
Dzhafarkhanov 17:56015e4834e6 167 if (v) {
Dzhafarkhanov 17:56015e4834e6 168 writeCommand(SSD1351_CMD_INVERTDISPLAY);
Dzhafarkhanov 17:56015e4834e6 169 } else {
Dzhafarkhanov 17:56015e4834e6 170 writeCommand(SSD1351_CMD_NORMALDISPLAY);
Dzhafarkhanov 17:56015e4834e6 171 }
Dzhafarkhanov 17:56015e4834e6 172 }
nkhorman 9:ddb97c9850a2 173
Dzhafarkhanov 17:56015e4834e6 174 void Adafruit_SSD1351::goTo(int x, int y) {
Dzhafarkhanov 17:56015e4834e6 175 if ((x >= width()) || (y >= height())) return;
Dzhafarkhanov 17:56015e4834e6 176
Dzhafarkhanov 17:56015e4834e6 177 // set x and y coordinate
Dzhafarkhanov 17:56015e4834e6 178 writeCommand(SSD1351_CMD_SETCOLUMN);
Dzhafarkhanov 17:56015e4834e6 179 writeData(x);
Dzhafarkhanov 17:56015e4834e6 180 writeData(width()-1);
nkhorman 9:ddb97c9850a2 181
Dzhafarkhanov 17:56015e4834e6 182 writeCommand(SSD1351_CMD_SETROW);
Dzhafarkhanov 17:56015e4834e6 183 writeData(y);
Dzhafarkhanov 17:56015e4834e6 184 writeData(height()-1);
Dzhafarkhanov 17:56015e4834e6 185 writeCommand(SSD1351_CMD_WRITERAM);
Dzhafarkhanov 17:56015e4834e6 186 }
nkhorman 9:ddb97c9850a2 187
Dzhafarkhanov 17:56015e4834e6 188 uint16_t Adafruit_SSD1351::Color565(uint8_t r, uint8_t g, uint8_t b) {
Dzhafarkhanov 17:56015e4834e6 189 uint16_t c;
Dzhafarkhanov 17:56015e4834e6 190 c = r >> 3;
Dzhafarkhanov 17:56015e4834e6 191 c <<= 6;
Dzhafarkhanov 17:56015e4834e6 192 c |= g >> 2;
Dzhafarkhanov 17:56015e4834e6 193 c <<= 5;
Dzhafarkhanov 17:56015e4834e6 194 c |= b >> 3;
Dzhafarkhanov 17:56015e4834e6 195
Dzhafarkhanov 17:56015e4834e6 196 return c;
Dzhafarkhanov 17:56015e4834e6 197 }
Dzhafarkhanov 17:56015e4834e6 198
Dzhafarkhanov 17:56015e4834e6 199 void Adafruit_SSD1351::fillScreen(uint16_t fillcolor) {
Dzhafarkhanov 17:56015e4834e6 200 fillRect(0, 0, width(), height(), fillcolor);
nkhorman 0:c3dcd4c4983a 201 }
nkhorman 0:c3dcd4c4983a 202
Dzhafarkhanov 17:56015e4834e6 203 // Draw a filled rectangle with no rotation.
Dzhafarkhanov 17:56015e4834e6 204 void Adafruit_SSD1351::rawFillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t fillcolor) {
Dzhafarkhanov 17:56015e4834e6 205 // Bounds check
Dzhafarkhanov 17:56015e4834e6 206 if ((x >= width()) || (y >= height()))
Dzhafarkhanov 17:56015e4834e6 207 return;
Dzhafarkhanov 17:56015e4834e6 208
Dzhafarkhanov 17:56015e4834e6 209 // Y bounds check
Dzhafarkhanov 17:56015e4834e6 210 if (y+h > height())
Dzhafarkhanov 17:56015e4834e6 211 {
Dzhafarkhanov 17:56015e4834e6 212 h = height() - y - 1;
Dzhafarkhanov 17:56015e4834e6 213 }
Dzhafarkhanov 17:56015e4834e6 214
Dzhafarkhanov 17:56015e4834e6 215 // X bounds check
Dzhafarkhanov 17:56015e4834e6 216 if (x+w > width())
Dzhafarkhanov 17:56015e4834e6 217 {
Dzhafarkhanov 17:56015e4834e6 218 w = width() - x - 1;
Dzhafarkhanov 17:56015e4834e6 219 }
Dzhafarkhanov 17:56015e4834e6 220
Dzhafarkhanov 17:56015e4834e6 221 /*
Dzhafarkhanov 17:56015e4834e6 222 Serial.print(x); Serial.print(", ");
Dzhafarkhanov 17:56015e4834e6 223 Serial.print(y); Serial.print(", ");
Dzhafarkhanov 17:56015e4834e6 224 Serial.print(w); Serial.print(", ");
Dzhafarkhanov 17:56015e4834e6 225 Serial.print(h); Serial.println(", ");
Dzhafarkhanov 17:56015e4834e6 226 */
Dzhafarkhanov 17:56015e4834e6 227
Dzhafarkhanov 17:56015e4834e6 228 // set location
Dzhafarkhanov 17:56015e4834e6 229 writeCommand(SSD1351_CMD_SETCOLUMN);
Dzhafarkhanov 17:56015e4834e6 230 writeData(x);
Dzhafarkhanov 17:56015e4834e6 231 writeData(x+w-1);
Dzhafarkhanov 17:56015e4834e6 232 writeCommand(SSD1351_CMD_SETROW);
Dzhafarkhanov 17:56015e4834e6 233 writeData(y);
Dzhafarkhanov 17:56015e4834e6 234 writeData(y+h-1);
Dzhafarkhanov 17:56015e4834e6 235 // fill!
Dzhafarkhanov 17:56015e4834e6 236 writeCommand(SSD1351_CMD_WRITERAM);
Dzhafarkhanov 17:56015e4834e6 237
Dzhafarkhanov 17:56015e4834e6 238 for (uint16_t i=0; i < w*h; i++) {
Dzhafarkhanov 17:56015e4834e6 239 writeData(fillcolor >> 8);
Dzhafarkhanov 17:56015e4834e6 240 writeData(fillcolor);
Dzhafarkhanov 17:56015e4834e6 241 }
Dzhafarkhanov 17:56015e4834e6 242 }
Dzhafarkhanov 17:56015e4834e6 243
Dzhafarkhanov 17:56015e4834e6 244
Dzhafarkhanov 17:56015e4834e6 245 void Adafruit_SSD1351::fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t fillcolor) {
Dzhafarkhanov 17:56015e4834e6 246 // Transform x and y based on current rotation.
Dzhafarkhanov 17:56015e4834e6 247 switch (getRotation()) {
Dzhafarkhanov 17:56015e4834e6 248 case 0: // No rotation
Dzhafarkhanov 17:56015e4834e6 249 rawFillRect(x, y, w, h, fillcolor);
Dzhafarkhanov 17:56015e4834e6 250 break;
Dzhafarkhanov 17:56015e4834e6 251 case 1: // Rotated 90 degrees clockwise.
Dzhafarkhanov 17:56015e4834e6 252 swap(x, y);
Dzhafarkhanov 17:56015e4834e6 253 x = _rawWidth - x - h;
Dzhafarkhanov 17:56015e4834e6 254 rawFillRect(x, y, h, w, fillcolor);
Dzhafarkhanov 17:56015e4834e6 255 break;
Dzhafarkhanov 17:56015e4834e6 256 case 2: // Rotated 180 degrees clockwise.
Dzhafarkhanov 17:56015e4834e6 257 x = _rawWidth - x - w;
Dzhafarkhanov 17:56015e4834e6 258 y = _rawHeight - y - h;
Dzhafarkhanov 17:56015e4834e6 259 rawFillRect(x, y, w, h, fillcolor);
Dzhafarkhanov 17:56015e4834e6 260 break;
Dzhafarkhanov 17:56015e4834e6 261 case 3: // Rotated 270 degrees clockwise.
Dzhafarkhanov 17:56015e4834e6 262 swap(x, y);
Dzhafarkhanov 17:56015e4834e6 263 y = _rawHeight - y - w;
Dzhafarkhanov 17:56015e4834e6 264 rawFillRect(x, y, h, w, fillcolor);
Dzhafarkhanov 17:56015e4834e6 265 break;
Dzhafarkhanov 17:56015e4834e6 266 }
Dzhafarkhanov 17:56015e4834e6 267 }
Dzhafarkhanov 17:56015e4834e6 268
Dzhafarkhanov 17:56015e4834e6 269 // Draw a horizontal line ignoring any screen rotation.
Dzhafarkhanov 17:56015e4834e6 270 void Adafruit_SSD1351::rawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
Dzhafarkhanov 17:56015e4834e6 271 // Bounds check
Dzhafarkhanov 17:56015e4834e6 272 if ((x >= width()) || (y >= height()))
Dzhafarkhanov 17:56015e4834e6 273 return;
Dzhafarkhanov 17:56015e4834e6 274
Dzhafarkhanov 17:56015e4834e6 275 // X bounds check
Dzhafarkhanov 17:56015e4834e6 276 if (x+w > width())
Dzhafarkhanov 17:56015e4834e6 277 {
Dzhafarkhanov 17:56015e4834e6 278 w = width() - x - 1;
Dzhafarkhanov 17:56015e4834e6 279 }
Dzhafarkhanov 17:56015e4834e6 280
Dzhafarkhanov 17:56015e4834e6 281 if (w < 0) return;
Dzhafarkhanov 17:56015e4834e6 282
Dzhafarkhanov 17:56015e4834e6 283 // set location
Dzhafarkhanov 17:56015e4834e6 284 writeCommand(SSD1351_CMD_SETCOLUMN);
Dzhafarkhanov 17:56015e4834e6 285 writeData(x);
Dzhafarkhanov 17:56015e4834e6 286 writeData(x+w-1);
Dzhafarkhanov 17:56015e4834e6 287 writeCommand(SSD1351_CMD_SETROW);
Dzhafarkhanov 17:56015e4834e6 288 writeData(y);
Dzhafarkhanov 17:56015e4834e6 289 writeData(y);
Dzhafarkhanov 17:56015e4834e6 290 // fill!
Dzhafarkhanov 17:56015e4834e6 291 writeCommand(SSD1351_CMD_WRITERAM);
Dzhafarkhanov 17:56015e4834e6 292
Dzhafarkhanov 17:56015e4834e6 293 for (uint16_t i=0; i < w; i++) {
Dzhafarkhanov 17:56015e4834e6 294 writeData(color >> 8);
Dzhafarkhanov 17:56015e4834e6 295 writeData(color);
Dzhafarkhanov 17:56015e4834e6 296 }
Dzhafarkhanov 17:56015e4834e6 297 }
Dzhafarkhanov 17:56015e4834e6 298
Dzhafarkhanov 17:56015e4834e6 299 // Draw a vertical line ignoring any screen rotation.
Dzhafarkhanov 17:56015e4834e6 300 void Adafruit_SSD1351::rawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
Dzhafarkhanov 17:56015e4834e6 301 // Bounds check
Dzhafarkhanov 17:56015e4834e6 302 if ((x >= width()) || (y >= height()))
Dzhafarkhanov 17:56015e4834e6 303 return;
Dzhafarkhanov 17:56015e4834e6 304
Dzhafarkhanov 17:56015e4834e6 305 // X bounds check
Dzhafarkhanov 17:56015e4834e6 306 if (y+h > height())
Dzhafarkhanov 17:56015e4834e6 307 {
Dzhafarkhanov 17:56015e4834e6 308 h = height() - y - 1;
Dzhafarkhanov 17:56015e4834e6 309 }
Dzhafarkhanov 17:56015e4834e6 310
Dzhafarkhanov 17:56015e4834e6 311 if (h < 0) return;
Dzhafarkhanov 17:56015e4834e6 312
Dzhafarkhanov 17:56015e4834e6 313 // set location
Dzhafarkhanov 17:56015e4834e6 314 writeCommand(SSD1351_CMD_SETCOLUMN);
Dzhafarkhanov 17:56015e4834e6 315 writeData(x);
Dzhafarkhanov 17:56015e4834e6 316 writeData(x);
Dzhafarkhanov 17:56015e4834e6 317 writeCommand(SSD1351_CMD_SETROW);
Dzhafarkhanov 17:56015e4834e6 318 writeData(y);
Dzhafarkhanov 17:56015e4834e6 319 writeData(y+h-1);
Dzhafarkhanov 17:56015e4834e6 320 // fill!
Dzhafarkhanov 17:56015e4834e6 321 writeCommand(SSD1351_CMD_WRITERAM);
Dzhafarkhanov 17:56015e4834e6 322
Dzhafarkhanov 17:56015e4834e6 323 for (uint16_t i=0; i < h; i++) {
Dzhafarkhanov 17:56015e4834e6 324 writeData(color >> 8);
Dzhafarkhanov 17:56015e4834e6 325 writeData(color);
Dzhafarkhanov 17:56015e4834e6 326 }
Dzhafarkhanov 17:56015e4834e6 327 }
Dzhafarkhanov 17:56015e4834e6 328
Dzhafarkhanov 17:56015e4834e6 329 void Adafruit_SSD1351::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
Dzhafarkhanov 17:56015e4834e6 330 // Transform x and y based on current rotation.
Dzhafarkhanov 17:56015e4834e6 331 switch (getRotation()) {
Dzhafarkhanov 17:56015e4834e6 332 case 0: // No rotation
Dzhafarkhanov 17:56015e4834e6 333 rawFastVLine(x, y, h, color);
Dzhafarkhanov 17:56015e4834e6 334 break;
Dzhafarkhanov 17:56015e4834e6 335 case 1: // Rotated 90 degrees clockwise.
Dzhafarkhanov 17:56015e4834e6 336 swap(x, y);
Dzhafarkhanov 17:56015e4834e6 337 x = _rawWidth - x - h;
Dzhafarkhanov 17:56015e4834e6 338 rawFastHLine(x, y, h, color);
Dzhafarkhanov 17:56015e4834e6 339 break;
Dzhafarkhanov 17:56015e4834e6 340 case 2: // Rotated 180 degrees clockwise.
Dzhafarkhanov 17:56015e4834e6 341 x = _rawWidth - x - 1;
Dzhafarkhanov 17:56015e4834e6 342 y = _rawHeight - y - h;
Dzhafarkhanov 17:56015e4834e6 343 rawFastVLine(x, y, h, color);
Dzhafarkhanov 17:56015e4834e6 344 break;
Dzhafarkhanov 17:56015e4834e6 345 case 3: // Rotated 270 degrees clockwise.
Dzhafarkhanov 17:56015e4834e6 346 swap(x, y);
Dzhafarkhanov 17:56015e4834e6 347 y = _rawHeight - y - 1;
Dzhafarkhanov 17:56015e4834e6 348 rawFastHLine(x, y, h, color);
Dzhafarkhanov 17:56015e4834e6 349 break;
Dzhafarkhanov 17:56015e4834e6 350 }
Dzhafarkhanov 17:56015e4834e6 351 }
Dzhafarkhanov 17:56015e4834e6 352
Dzhafarkhanov 17:56015e4834e6 353 void Adafruit_SSD1351::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
Dzhafarkhanov 17:56015e4834e6 354 // Transform x and y based on current rotation.
Dzhafarkhanov 17:56015e4834e6 355 switch (getRotation()) {
Dzhafarkhanov 17:56015e4834e6 356 case 0: // No rotation.
Dzhafarkhanov 17:56015e4834e6 357 rawFastHLine(x, y, w, color);
Dzhafarkhanov 17:56015e4834e6 358 break;
Dzhafarkhanov 17:56015e4834e6 359 case 1: // Rotated 90 degrees clockwise.
Dzhafarkhanov 17:56015e4834e6 360 swap(x, y);
Dzhafarkhanov 17:56015e4834e6 361 x = _rawWidth - x - 1;
Dzhafarkhanov 17:56015e4834e6 362 rawFastVLine(x, y, w, color);
Dzhafarkhanov 17:56015e4834e6 363 break;
Dzhafarkhanov 17:56015e4834e6 364 case 2: // Rotated 180 degrees clockwise.
Dzhafarkhanov 17:56015e4834e6 365 x = _rawWidth - x - w;
Dzhafarkhanov 17:56015e4834e6 366 y = _rawHeight - y - 1;
Dzhafarkhanov 17:56015e4834e6 367 rawFastHLine(x, y, w, color);
Dzhafarkhanov 17:56015e4834e6 368 break;
Dzhafarkhanov 17:56015e4834e6 369 case 3: // Rotated 270 degrees clockwise.
Dzhafarkhanov 17:56015e4834e6 370 swap(x, y);
Dzhafarkhanov 17:56015e4834e6 371 y = _rawHeight - y - w;
Dzhafarkhanov 17:56015e4834e6 372 rawFastVLine(x, y, w, color);
Dzhafarkhanov 17:56015e4834e6 373 break;
Dzhafarkhanov 17:56015e4834e6 374 }
Dzhafarkhanov 17:56015e4834e6 375 }
Dzhafarkhanov 17:56015e4834e6 376
Dzhafarkhanov 17:56015e4834e6 377
Dzhafarkhanov 17:56015e4834e6 378 void Adafruit_SSD1351::setContrastControl(uint8_t contrast) {
Dzhafarkhanov 17:56015e4834e6 379
Dzhafarkhanov 17:56015e4834e6 380 writeCommand(SSD1351_CMD_CONTRASTMASTER);
Dzhafarkhanov 17:56015e4834e6 381 //writeData(0x0F);
Dzhafarkhanov 17:56015e4834e6 382 writeData(contrast);
Dzhafarkhanov 17:56015e4834e6 383
Dzhafarkhanov 17:56015e4834e6 384 }
Dzhafarkhanov 17:56015e4834e6 385
Dzhafarkhanov 17:56015e4834e6 386
Dzhafarkhanov 17:56015e4834e6 387
Dzhafarkhanov 17:56015e4834e6 388
Dzhafarkhanov 17:56015e4834e6 389
Dzhafarkhanov 17:56015e4834e6 390
nkhorman 9:ddb97c9850a2 391 // Set a single pixel
Dzhafarkhanov 17:56015e4834e6 392 void Adafruit_SSD1351::drawPixel(int16_t x, int16_t y, uint16_t color)
nkhorman 0:c3dcd4c4983a 393 {
Dzhafarkhanov 17:56015e4834e6 394 if ((x < 0) || (x >= width()) || (y < 0) || (y >= height())) // Bounds check.
nkhorman 0:c3dcd4c4983a 395 return;
nkhorman 0:c3dcd4c4983a 396
nkhorman 0:c3dcd4c4983a 397 // check rotation, move pixel around if necessary
nkhorman 0:c3dcd4c4983a 398 switch (getRotation())
nkhorman 0:c3dcd4c4983a 399 {
Dzhafarkhanov 17:56015e4834e6 400 case 1: // Rotated 90 degrees clockwise.
nkhorman 0:c3dcd4c4983a 401 swap(x, y);
nkhorman 0:c3dcd4c4983a 402 x = _rawWidth - x - 1;
nkhorman 0:c3dcd4c4983a 403 break;
Dzhafarkhanov 17:56015e4834e6 404 case 2: // Rotated 180 degrees clockwise.
nkhorman 0:c3dcd4c4983a 405 x = _rawWidth - x - 1;
nkhorman 0:c3dcd4c4983a 406 y = _rawHeight - y - 1;
nkhorman 0:c3dcd4c4983a 407 break;
Dzhafarkhanov 17:56015e4834e6 408 case 3: // Rotated 270 degrees clockwise.
nkhorman 0:c3dcd4c4983a 409 swap(x, y);
nkhorman 0:c3dcd4c4983a 410 y = _rawHeight - y - 1;
nkhorman 0:c3dcd4c4983a 411 break;
nkhorman 0:c3dcd4c4983a 412 }
nkhorman 0:c3dcd4c4983a 413
nkhorman 0:c3dcd4c4983a 414 {
Dzhafarkhanov 17:56015e4834e6 415
Dzhafarkhanov 17:56015e4834e6 416 }
nkhorman 0:c3dcd4c4983a 417
Dzhafarkhanov 17:56015e4834e6 418 goTo(x, y);
Dzhafarkhanov 17:56015e4834e6 419 writeData(color >> 8) ;
Dzhafarkhanov 17:56015e4834e6 420 writeData(color);
nkhorman 0:c3dcd4c4983a 421
nkhorman 0:c3dcd4c4983a 422 }
nkhorman 0:c3dcd4c4983a 423
Dzhafarkhanov 17:56015e4834e6 424
Dzhafarkhanov 17:56015e4834e6 425
Dzhafarkhanov 17:56015e4834e6 426
Dzhafarkhanov 17:56015e4834e6 427
Dzhafarkhanov 17:56015e4834e6 428
Dzhafarkhanov 17:56015e4834e6 429
Dzhafarkhanov 17:56015e4834e6 430
Dzhafarkhanov 17:56015e4834e6 431