SSD1351 library for the STM32F401RE. Uses BurstSPI and a couple of tweaks to improve throughput.
Library for the SSD1351 128 x 128 OLED display, specifically for the STM32F401RE Nucleo/STMstation development boards.
See API documentation for more details and code.
SSD1351.cpp@4:d65b0a5d58f0, 2017-07-15 (annotated)
- Committer:
- kkado
- Date:
- Sat Jul 15 04:41:23 2017 +0000
- Revision:
- 4:d65b0a5d58f0
- Parent:
- 1:ae4fe66e9c0e
Fixed length of vlines (one too short)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kkado | 0:5115e0080bd5 | 1 | #include "SSD1351.h" |
kkado | 0:5115e0080bd5 | 2 | #include "mbed.h" |
kkado | 0:5115e0080bd5 | 3 | #include "BurstSPI.h" |
kkado | 0:5115e0080bd5 | 4 | |
kkado | 0:5115e0080bd5 | 5 | const uint16_t font[] = { |
kkado | 0:5115e0080bd5 | 6 | 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, |
kkado | 0:5115e0080bd5 | 7 | 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xF6DE, 0xFFFE, |
kkado | 0:5115e0080bd5 | 8 | 0x0000, 0x4904, 0xB400, 0xBEFA, 0x79E4, 0x8542, 0x5556, 0x4800, 0x5244, 0x4494, 0xABAA, 0x0BA0, 0x0028, 0x0380, 0x0024, 0x0540, |
kkado | 0:5115e0080bd5 | 9 | 0xF6DE, 0x4924, 0xE7CE, 0xE59E, 0xB792, 0xF39E, 0xF3DE, 0xE492, 0xF7DE, 0xF792, 0x0820, 0x0828, 0x2A22, 0x1C70, 0x88A8, 0xE504, |
kkado | 0:5115e0080bd5 | 10 | 0x57C6, 0x57DA, 0xD75C, 0x7246, 0xD6DC, 0xF3CE, 0xF3C8, 0x73D6, 0xB7DA, 0xE92E, 0x24D4, 0xB75A, 0x924E, 0xBEDA, 0xBFFA, 0x56D4, |
kkado | 0:5115e0080bd5 | 11 | 0xD748, 0x56F6, 0xD76A, 0x711C, 0xE924, 0xB6D6, 0xB6A4, 0xB7FA, 0xB55A, 0xB524, 0xE54E, 0xF24E, 0x1110, 0xE49E, 0x5400, 0x000E, |
kkado | 0:5115e0080bd5 | 12 | 0x8800, 0x01DE, 0x935C, 0x01C6, 0x25D6, 0x0EE6, 0x2BA4, 0x0F9C, 0x935A, 0x4124, 0x209C, 0x92EA, 0xC92E, 0x03FA, 0x035A, 0x0154, |
kkado | 0:5115e0080bd5 | 13 | 0x0AE8, 0x0AB2, 0x13C8, 0x0F3C, 0x5D24, 0x02D6, 0x02F4, 0x02FE, 0x02AA, 0x159C, 0x1DEE, 0x6A26, 0x4824, 0x6A26, 0x7800, 0xFFFE |
kkado | 0:5115e0080bd5 | 14 | }; |
kkado | 0:5115e0080bd5 | 15 | |
kkado | 1:ae4fe66e9c0e | 16 | //Constructors |
kkado | 0:5115e0080bd5 | 17 | SSD1351::SSD1351(PinName mosi_pin, PinName sclk_pin, PinName dc_pin, PinName cs_pin, PinName rst_pin) |
kkado | 0:5115e0080bd5 | 18 | :cs(cs_pin), dc(dc_pin), rst(rst_pin), spi(mosi_pin, NC, sclk_pin) |
kkado | 0:5115e0080bd5 | 19 | { |
kkado | 0:5115e0080bd5 | 20 | begin(); |
kkado | 0:5115e0080bd5 | 21 | } |
kkado | 1:ae4fe66e9c0e | 22 | SSD1351::SSD1351() |
kkado | 1:ae4fe66e9c0e | 23 | :cs(OLED_CS), dc(OLED_DC), rst(OLED_RST), spi(OLED_MOSI, NC, OLED_SCLK) |
kkado | 1:ae4fe66e9c0e | 24 | { |
kkado | 1:ae4fe66e9c0e | 25 | begin(); |
kkado | 1:ae4fe66e9c0e | 26 | } |
kkado | 0:5115e0080bd5 | 27 | |
kkado | 0:5115e0080bd5 | 28 | //Set the buffer pointer |
kkado | 0:5115e0080bd5 | 29 | void SSD1351::setBuf(uint8_t* _buf){ |
kkado | 0:5115e0080bd5 | 30 | buf = _buf; |
kkado | 0:5115e0080bd5 | 31 | } |
kkado | 0:5115e0080bd5 | 32 | |
kkado | 0:5115e0080bd5 | 33 | //Set collision mask pointer |
kkado | 0:5115e0080bd5 | 34 | void SSD1351::setCMask(uint8_t* _cmask){ |
kkado | 0:5115e0080bd5 | 35 | collisionmask = _cmask; |
kkado | 0:5115e0080bd5 | 36 | } |
kkado | 0:5115e0080bd5 | 37 | |
kkado | 0:5115e0080bd5 | 38 | //Basic SPI write command |
kkado | 0:5115e0080bd5 | 39 | void SSD1351::spiwrite(uint8_t c){ |
kkado | 0:5115e0080bd5 | 40 | spi.fastWrite(c); |
kkado | 0:5115e0080bd5 | 41 | } |
kkado | 0:5115e0080bd5 | 42 | |
kkado | 0:5115e0080bd5 | 43 | //Write a command to OLED |
kkado | 0:5115e0080bd5 | 44 | void SSD1351::writeCommand(uint8_t c){ |
kkado | 0:5115e0080bd5 | 45 | dc = 0; |
kkado | 0:5115e0080bd5 | 46 | cs = 0; |
kkado | 0:5115e0080bd5 | 47 | spiwrite(c); |
kkado | 0:5115e0080bd5 | 48 | wait_us(1); //We need the delay during the init sequence - I don't know why |
kkado | 0:5115e0080bd5 | 49 | cs = 1; |
kkado | 0:5115e0080bd5 | 50 | } |
kkado | 0:5115e0080bd5 | 51 | |
kkado | 0:5115e0080bd5 | 52 | //Write delay to OLED |
kkado | 0:5115e0080bd5 | 53 | void SSD1351::writeData(uint8_t c){ |
kkado | 0:5115e0080bd5 | 54 | dc = 1; |
kkado | 0:5115e0080bd5 | 55 | cs = 0; |
kkado | 0:5115e0080bd5 | 56 | spiwrite(c); |
kkado | 0:5115e0080bd5 | 57 | wait_us(1); |
kkado | 0:5115e0080bd5 | 58 | cs = 1; |
kkado | 0:5115e0080bd5 | 59 | } |
kkado | 0:5115e0080bd5 | 60 | |
kkado | 0:5115e0080bd5 | 61 | //Initialize the SSD1351 |
kkado | 0:5115e0080bd5 | 62 | void SSD1351::begin(){ |
kkado | 0:5115e0080bd5 | 63 | spi.format(8,3); |
kkado | 0:5115e0080bd5 | 64 | spi.frequency(20000000); |
kkado | 0:5115e0080bd5 | 65 | |
kkado | 0:5115e0080bd5 | 66 | cs = 0; |
kkado | 0:5115e0080bd5 | 67 | |
kkado | 0:5115e0080bd5 | 68 | rst = 1; |
kkado | 0:5115e0080bd5 | 69 | //SSD1351 datasheet says low pulse width for reset = 2 us, MINIMUM |
kkado | 0:5115e0080bd5 | 70 | wait_ms(5); |
kkado | 0:5115e0080bd5 | 71 | rst = 0; |
kkado | 0:5115e0080bd5 | 72 | wait_ms(5); |
kkado | 0:5115e0080bd5 | 73 | rst = 1; |
kkado | 0:5115e0080bd5 | 74 | wait_ms(5); |
kkado | 0:5115e0080bd5 | 75 | |
kkado | 0:5115e0080bd5 | 76 | writeCommand(SSD1351_CMD_COMMANDLOCK); // set command lock |
kkado | 0:5115e0080bd5 | 77 | writeData(0x12); |
kkado | 0:5115e0080bd5 | 78 | writeCommand(SSD1351_CMD_COMMANDLOCK); // set command lock |
kkado | 0:5115e0080bd5 | 79 | writeData(0xB1); |
kkado | 0:5115e0080bd5 | 80 | |
kkado | 0:5115e0080bd5 | 81 | writeCommand(SSD1351_CMD_DISPLAYOFF); // 0xAE |
kkado | 0:5115e0080bd5 | 82 | |
kkado | 0:5115e0080bd5 | 83 | writeCommand(SSD1351_CMD_CLOCKDIV); // 0xB3 |
kkado | 0:5115e0080bd5 | 84 | writeCommand(0xF1); // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio (A[3:0]+1 = 1..16) |
kkado | 0:5115e0080bd5 | 85 | |
kkado | 0:5115e0080bd5 | 86 | writeCommand(SSD1351_CMD_MUXRATIO); |
kkado | 0:5115e0080bd5 | 87 | writeData(127); |
kkado | 0:5115e0080bd5 | 88 | |
kkado | 0:5115e0080bd5 | 89 | writeCommand(SSD1351_CMD_SETREMAP); |
kkado | 0:5115e0080bd5 | 90 | //writeData(0x74); |
kkado | 0:5115e0080bd5 | 91 | writeData(0x66); |
kkado | 0:5115e0080bd5 | 92 | |
kkado | 0:5115e0080bd5 | 93 | writeCommand(SSD1351_CMD_SETCOLUMN); |
kkado | 0:5115e0080bd5 | 94 | writeData(0x00); |
kkado | 0:5115e0080bd5 | 95 | writeData(0x7F); |
kkado | 0:5115e0080bd5 | 96 | writeCommand(SSD1351_CMD_SETROW); |
kkado | 0:5115e0080bd5 | 97 | writeData(0x00); |
kkado | 0:5115e0080bd5 | 98 | writeData(0x7F); |
kkado | 0:5115e0080bd5 | 99 | |
kkado | 0:5115e0080bd5 | 100 | writeCommand(SSD1351_CMD_STARTLINE); // 0xA1 |
kkado | 0:5115e0080bd5 | 101 | writeData(0); |
kkado | 0:5115e0080bd5 | 102 | |
kkado | 0:5115e0080bd5 | 103 | writeCommand(SSD1351_CMD_DISPLAYOFFSET); // 0xA2 |
kkado | 0:5115e0080bd5 | 104 | writeData(0x0); |
kkado | 0:5115e0080bd5 | 105 | |
kkado | 0:5115e0080bd5 | 106 | writeCommand(SSD1351_CMD_SETGPIO); |
kkado | 0:5115e0080bd5 | 107 | writeData(0x00); |
kkado | 0:5115e0080bd5 | 108 | |
kkado | 0:5115e0080bd5 | 109 | writeCommand(SSD1351_CMD_FUNCTIONSELECT); |
kkado | 0:5115e0080bd5 | 110 | writeData(0x01); // internal (diode drop) |
kkado | 0:5115e0080bd5 | 111 | //writeData(0x01); // external bias |
kkado | 0:5115e0080bd5 | 112 | |
kkado | 0:5115e0080bd5 | 113 | //writeCommand(SSSD1351_CMD_SETPHASELENGTH); |
kkado | 0:5115e0080bd5 | 114 | //writeData(0x32); |
kkado | 0:5115e0080bd5 | 115 | |
kkado | 0:5115e0080bd5 | 116 | writeCommand(SSD1351_CMD_PRECHARGE); |
kkado | 0:5115e0080bd5 | 117 | writeCommand(0x32); |
kkado | 0:5115e0080bd5 | 118 | |
kkado | 0:5115e0080bd5 | 119 | writeCommand(SSD1351_CMD_VCOMH); |
kkado | 0:5115e0080bd5 | 120 | writeCommand(0x05); |
kkado | 0:5115e0080bd5 | 121 | |
kkado | 0:5115e0080bd5 | 122 | writeCommand(SSD1351_CMD_NORMALDISPLAY); |
kkado | 0:5115e0080bd5 | 123 | |
kkado | 0:5115e0080bd5 | 124 | writeCommand(SSD1351_CMD_CONTRASTABC); |
kkado | 0:5115e0080bd5 | 125 | writeData(0xC8); |
kkado | 0:5115e0080bd5 | 126 | writeData(0x80); |
kkado | 0:5115e0080bd5 | 127 | writeData(0xC8); |
kkado | 0:5115e0080bd5 | 128 | |
kkado | 0:5115e0080bd5 | 129 | writeCommand(SSD1351_CMD_CONTRASTMASTER); |
kkado | 0:5115e0080bd5 | 130 | writeData(0x0F); |
kkado | 0:5115e0080bd5 | 131 | |
kkado | 0:5115e0080bd5 | 132 | writeCommand(SSD1351_CMD_SETVSL ); |
kkado | 0:5115e0080bd5 | 133 | writeData(0xA0); |
kkado | 0:5115e0080bd5 | 134 | writeData(0xB5); |
kkado | 0:5115e0080bd5 | 135 | writeData(0x55); |
kkado | 0:5115e0080bd5 | 136 | |
kkado | 0:5115e0080bd5 | 137 | writeCommand(SSD1351_CMD_PRECHARGE2); |
kkado | 0:5115e0080bd5 | 138 | writeData(0x01); |
kkado | 0:5115e0080bd5 | 139 | |
kkado | 0:5115e0080bd5 | 140 | writeCommand(SSD1351_CMD_DISPLAYON); |
kkado | 0:5115e0080bd5 | 141 | } |
kkado | 0:5115e0080bd5 | 142 | |
kkado | 0:5115e0080bd5 | 143 | /* |
kkado | 0:5115e0080bd5 | 144 | //Fill a rectangular area |
kkado | 0:5115e0080bd5 | 145 | void SSD1351::fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t fillcolor){ |
kkado | 0:5115e0080bd5 | 146 | writeCommand(SSD1351_CMD_SETCOLUMN); |
kkado | 0:5115e0080bd5 | 147 | writeData(x); |
kkado | 0:5115e0080bd5 | 148 | writeData(x+w-1); |
kkado | 0:5115e0080bd5 | 149 | writeCommand(SSD1351_CMD_SETROW); |
kkado | 0:5115e0080bd5 | 150 | writeData(y); |
kkado | 0:5115e0080bd5 | 151 | writeData(y+h-1); |
kkado | 0:5115e0080bd5 | 152 | writeCommand(SSD1351_CMD_WRITERAM); |
kkado | 0:5115e0080bd5 | 153 | dc = 1; |
kkado | 0:5115e0080bd5 | 154 | cs = 0; |
kkado | 0:5115e0080bd5 | 155 | |
kkado | 0:5115e0080bd5 | 156 | for(uint16_t i=0; i < w*h; i++){ |
kkado | 0:5115e0080bd5 | 157 | spiwrite(fillcolor >> 8); |
kkado | 0:5115e0080bd5 | 158 | spiwrite(fillcolor); |
kkado | 0:5115e0080bd5 | 159 | } |
kkado | 0:5115e0080bd5 | 160 | } |
kkado | 0:5115e0080bd5 | 161 | */ |
kkado | 0:5115e0080bd5 | 162 | |
kkado | 0:5115e0080bd5 | 163 | //Enable writing to the SSD1351 RAM |
kkado | 0:5115e0080bd5 | 164 | void SSD1351::enableWrite(){ |
kkado | 0:5115e0080bd5 | 165 | cs = 0; |
kkado | 0:5115e0080bd5 | 166 | writeCommand(SSD1351_CMD_SETCOLUMN); |
kkado | 0:5115e0080bd5 | 167 | writeData(0); |
kkado | 0:5115e0080bd5 | 168 | writeData(127); |
kkado | 0:5115e0080bd5 | 169 | writeCommand(SSD1351_CMD_SETROW); |
kkado | 0:5115e0080bd5 | 170 | writeData(0); |
kkado | 0:5115e0080bd5 | 171 | writeData(127); |
kkado | 0:5115e0080bd5 | 172 | writeCommand(SSD1351_CMD_WRITERAM); |
kkado | 0:5115e0080bd5 | 173 | dc = 1; |
kkado | 0:5115e0080bd5 | 174 | cs = 0; |
kkado | 0:5115e0080bd5 | 175 | } |
kkado | 0:5115e0080bd5 | 176 | |
kkado | 0:5115e0080bd5 | 177 | //Fill the buffer with a solid color |
kkado | 0:5115e0080bd5 | 178 | void SSD1351::fillBuf(uint16_t fillcolor){ |
kkado | 0:5115e0080bd5 | 179 | for(uint16_t i=0; i < 128*128; i++){ |
kkado | 0:5115e0080bd5 | 180 | buf[2*i] = fillcolor >> 8; |
kkado | 0:5115e0080bd5 | 181 | buf[2*i+1] = fillcolor; |
kkado | 0:5115e0080bd5 | 182 | } |
kkado | 0:5115e0080bd5 | 183 | } |
kkado | 0:5115e0080bd5 | 184 | |
kkado | 0:5115e0080bd5 | 185 | //Write the buffer to OLED RAM |
kkado | 0:5115e0080bd5 | 186 | void SSD1351::writeBuf(){ |
kkado | 0:5115e0080bd5 | 187 | for(uint16_t i=0; i < 32768; i++){ |
kkado | 0:5115e0080bd5 | 188 | spiwrite(buf[i]); |
kkado | 0:5115e0080bd5 | 189 | } |
kkado | 0:5115e0080bd5 | 190 | } |
kkado | 0:5115e0080bd5 | 191 | |
kkado | 0:5115e0080bd5 | 192 | //Draw a filled rectangle |
kkado | 0:5115e0080bd5 | 193 | void SSD1351::fillRect(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t color){ |
kkado | 0:5115e0080bd5 | 194 | int16_t start = y*256 + x*2; |
kkado | 0:5115e0080bd5 | 195 | uint16_t xs = 0; |
kkado | 0:5115e0080bd5 | 196 | uint16_t xe = 0; |
kkado | 0:5115e0080bd5 | 197 | uint16_t ys = 0; |
kkado | 0:5115e0080bd5 | 198 | uint16_t ye = 0; |
kkado | 0:5115e0080bd5 | 199 | |
kkado | 0:5115e0080bd5 | 200 | if(x < 0){ |
kkado | 0:5115e0080bd5 | 201 | xs = -x; |
kkado | 0:5115e0080bd5 | 202 | } |
kkado | 0:5115e0080bd5 | 203 | if(y < 0){ |
kkado | 0:5115e0080bd5 | 204 | ys = -y; |
kkado | 0:5115e0080bd5 | 205 | } |
kkado | 0:5115e0080bd5 | 206 | if(x+w > 127){ |
kkado | 0:5115e0080bd5 | 207 | xe = x+w-128; |
kkado | 0:5115e0080bd5 | 208 | } |
kkado | 0:5115e0080bd5 | 209 | if(y+h > 127){ |
kkado | 0:5115e0080bd5 | 210 | ye = y+h-128; |
kkado | 0:5115e0080bd5 | 211 | } |
kkado | 0:5115e0080bd5 | 212 | |
kkado | 0:5115e0080bd5 | 213 | for(uint16_t j=0+ys; j<h-ye; j++){ |
kkado | 0:5115e0080bd5 | 214 | for(uint16_t i=0+xs; i<w-xe; i++){ |
kkado | 0:5115e0080bd5 | 215 | buf[start +j*256 + i*2] = color >> 8; |
kkado | 0:5115e0080bd5 | 216 | buf[start +j*256 + i*2 +1] = color; |
kkado | 0:5115e0080bd5 | 217 | } |
kkado | 0:5115e0080bd5 | 218 | } |
kkado | 0:5115e0080bd5 | 219 | } |
kkado | 0:5115e0080bd5 | 220 | |
kkado | 0:5115e0080bd5 | 221 | //Draw an open rectangle |
kkado | 0:5115e0080bd5 | 222 | void SSD1351::openRect(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t color){ |
kkado | 0:5115e0080bd5 | 223 | int16_t start = y*256 + x*2; |
kkado | 0:5115e0080bd5 | 224 | uint16_t xs = 0; |
kkado | 0:5115e0080bd5 | 225 | uint16_t xe = 0; |
kkado | 0:5115e0080bd5 | 226 | uint16_t ys = 0; |
kkado | 0:5115e0080bd5 | 227 | uint16_t ye = 0; |
kkado | 0:5115e0080bd5 | 228 | |
kkado | 0:5115e0080bd5 | 229 | if(x < 0){ |
kkado | 0:5115e0080bd5 | 230 | xs = -x; |
kkado | 0:5115e0080bd5 | 231 | } |
kkado | 0:5115e0080bd5 | 232 | if(y < 0){ |
kkado | 0:5115e0080bd5 | 233 | ys = -y; |
kkado | 0:5115e0080bd5 | 234 | } |
kkado | 0:5115e0080bd5 | 235 | if(x+w > 127){ |
kkado | 0:5115e0080bd5 | 236 | xe = x+w-128; |
kkado | 0:5115e0080bd5 | 237 | } |
kkado | 0:5115e0080bd5 | 238 | if(y+h > 127){ |
kkado | 0:5115e0080bd5 | 239 | ye = y+h-128; |
kkado | 0:5115e0080bd5 | 240 | } |
kkado | 0:5115e0080bd5 | 241 | |
kkado | 0:5115e0080bd5 | 242 | for(uint16_t j=ys; j<h-ye; j++){ |
kkado | 0:5115e0080bd5 | 243 | for(uint16_t i=xs; i<w-xe; i++){ |
kkado | 0:5115e0080bd5 | 244 | if((j == ys & ys == 0) | (j == h-ye-1 & ye == 0) | (i == xs & xs == 0) | (i == w-xe-1 & xe == 0)){ |
kkado | 0:5115e0080bd5 | 245 | buf[start +j*256 + i*2] = color >> 8; |
kkado | 0:5115e0080bd5 | 246 | buf[start +j*256 + i*2 +1] = color; |
kkado | 0:5115e0080bd5 | 247 | } |
kkado | 0:5115e0080bd5 | 248 | } |
kkado | 0:5115e0080bd5 | 249 | } |
kkado | 0:5115e0080bd5 | 250 | } |
kkado | 0:5115e0080bd5 | 251 | |
kkado | 0:5115e0080bd5 | 252 | void SSD1351::drawHLine(int16_t x, int16_t y, int16_t length, uint16_t color){ |
kkado | 0:5115e0080bd5 | 253 | if(y < 0 | y > 127){return;} |
kkado | 0:5115e0080bd5 | 254 | |
kkado | 0:5115e0080bd5 | 255 | int32_t start = y*256 + x*2; |
kkado | 0:5115e0080bd5 | 256 | uint16_t xs = 0; |
kkado | 0:5115e0080bd5 | 257 | uint16_t xe = 0; |
kkado | 0:5115e0080bd5 | 258 | int8_t sign; |
kkado | 0:5115e0080bd5 | 259 | |
kkado | 0:5115e0080bd5 | 260 | if(length > 0){ |
kkado | 0:5115e0080bd5 | 261 | sign = 1; |
kkado | 0:5115e0080bd5 | 262 | } |
kkado | 0:5115e0080bd5 | 263 | else{ |
kkado | 0:5115e0080bd5 | 264 | sign = -1; |
kkado | 0:5115e0080bd5 | 265 | } |
kkado | 0:5115e0080bd5 | 266 | |
kkado | 0:5115e0080bd5 | 267 | if(x < 0){ |
kkado | 0:5115e0080bd5 | 268 | xs = -x; |
kkado | 0:5115e0080bd5 | 269 | } |
kkado | 0:5115e0080bd5 | 270 | else if(x > 127){ |
kkado | 0:5115e0080bd5 | 271 | xs = x-127; |
kkado | 0:5115e0080bd5 | 272 | } |
kkado | 0:5115e0080bd5 | 273 | if(x+length < 0){ |
kkado | 0:5115e0080bd5 | 274 | xe = -(x+length); |
kkado | 0:5115e0080bd5 | 275 | } |
kkado | 0:5115e0080bd5 | 276 | else if(x+length > 127){ |
kkado | 0:5115e0080bd5 | 277 | xe = x+length-127; |
kkado | 0:5115e0080bd5 | 278 | } |
kkado | 0:5115e0080bd5 | 279 | |
kkado | 0:5115e0080bd5 | 280 | for(int16_t i=xs; i<abs(length)-xe; i++){ |
kkado | 0:5115e0080bd5 | 281 | buf[start + sign*i*2] = color >> 8; |
kkado | 0:5115e0080bd5 | 282 | buf[start + sign*i*2 + 1] = color; |
kkado | 0:5115e0080bd5 | 283 | } |
kkado | 0:5115e0080bd5 | 284 | } |
kkado | 0:5115e0080bd5 | 285 | |
kkado | 0:5115e0080bd5 | 286 | void SSD1351::drawVLine(int16_t x, int16_t y, int16_t length, uint16_t color){ |
kkado | 0:5115e0080bd5 | 287 | if(x < 0 | x > 127){return;} |
kkado | 0:5115e0080bd5 | 288 | |
kkado | 0:5115e0080bd5 | 289 | int32_t start = y*256 + x*2; |
kkado | 0:5115e0080bd5 | 290 | uint16_t ys = 0; |
kkado | 0:5115e0080bd5 | 291 | uint16_t ye = 0; |
kkado | 0:5115e0080bd5 | 292 | int8_t sign; |
kkado | 0:5115e0080bd5 | 293 | |
kkado | 0:5115e0080bd5 | 294 | if(length > 0){ |
kkado | 0:5115e0080bd5 | 295 | sign = 1; |
kkado | 0:5115e0080bd5 | 296 | } |
kkado | 0:5115e0080bd5 | 297 | else{ |
kkado | 0:5115e0080bd5 | 298 | sign = -1; |
kkado | 0:5115e0080bd5 | 299 | } |
kkado | 0:5115e0080bd5 | 300 | |
kkado | 0:5115e0080bd5 | 301 | if(y < 0){ |
kkado | 0:5115e0080bd5 | 302 | ys = -y; |
kkado | 0:5115e0080bd5 | 303 | } |
kkado | 0:5115e0080bd5 | 304 | else if(y > 127){ |
kkado | 0:5115e0080bd5 | 305 | ys = y-127; |
kkado | 0:5115e0080bd5 | 306 | } |
kkado | 0:5115e0080bd5 | 307 | if(y+length < 0){ |
kkado | 4:d65b0a5d58f0 | 308 | ye = -(y+length+1); |
kkado | 0:5115e0080bd5 | 309 | } |
kkado | 0:5115e0080bd5 | 310 | else if(y+length > 127){ |
kkado | 0:5115e0080bd5 | 311 | ye = y+length-127; |
kkado | 0:5115e0080bd5 | 312 | } |
kkado | 0:5115e0080bd5 | 313 | |
kkado | 0:5115e0080bd5 | 314 | for(int16_t i=ys; i<abs(length)-ye; i++){ |
kkado | 0:5115e0080bd5 | 315 | buf[start + sign*i*256] = color >> 8; |
kkado | 0:5115e0080bd5 | 316 | buf[start + sign*i*256 + 1] = color; |
kkado | 0:5115e0080bd5 | 317 | }; |
kkado | 0:5115e0080bd5 | 318 | } |
kkado | 0:5115e0080bd5 | 319 | |
kkado | 0:5115e0080bd5 | 320 | void SSD1351::drawLine(int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color){ |
kkado | 0:5115e0080bd5 | 321 | bool steep = (abs(y2-y1) > abs(x2-x1)); |
kkado | 0:5115e0080bd5 | 322 | int16_t temp; |
kkado | 0:5115e0080bd5 | 323 | if(steep){ |
kkado | 0:5115e0080bd5 | 324 | temp = x1; |
kkado | 0:5115e0080bd5 | 325 | x1 = y1; |
kkado | 0:5115e0080bd5 | 326 | y1 = temp; |
kkado | 0:5115e0080bd5 | 327 | |
kkado | 0:5115e0080bd5 | 328 | temp = x2; |
kkado | 0:5115e0080bd5 | 329 | x2 = y2; |
kkado | 0:5115e0080bd5 | 330 | y2 = temp; |
kkado | 0:5115e0080bd5 | 331 | } |
kkado | 0:5115e0080bd5 | 332 | if(x1 > x2){ |
kkado | 0:5115e0080bd5 | 333 | temp = x1; |
kkado | 0:5115e0080bd5 | 334 | x1 = x2; |
kkado | 0:5115e0080bd5 | 335 | x2 = temp; |
kkado | 0:5115e0080bd5 | 336 | |
kkado | 0:5115e0080bd5 | 337 | temp = y1; |
kkado | 0:5115e0080bd5 | 338 | y1 = y2; |
kkado | 0:5115e0080bd5 | 339 | y2 = temp;; |
kkado | 0:5115e0080bd5 | 340 | } |
kkado | 0:5115e0080bd5 | 341 | int16_t dx = x2-x1; |
kkado | 0:5115e0080bd5 | 342 | int16_t dy = abs(y2-y1); |
kkado | 0:5115e0080bd5 | 343 | float error = dx / 2.0f; |
kkado | 0:5115e0080bd5 | 344 | int16_t ystep = (y1 < y2) ? 1 : -1; |
kkado | 0:5115e0080bd5 | 345 | int16_t y = y1; |
kkado | 0:5115e0080bd5 | 346 | int16_t maxX = x2; |
kkado | 0:5115e0080bd5 | 347 | |
kkado | 0:5115e0080bd5 | 348 | for(int16_t x = x1; x<maxX; x++){ |
kkado | 0:5115e0080bd5 | 349 | if(x >= 0 & x<128 & y >= 0 & y<128){ |
kkado | 0:5115e0080bd5 | 350 | if(steep){ |
kkado | 0:5115e0080bd5 | 351 | buf[y*2 + x*256] = color >> 8; |
kkado | 0:5115e0080bd5 | 352 | buf[y*2 + x*256 + 1] = color; |
kkado | 0:5115e0080bd5 | 353 | } |
kkado | 0:5115e0080bd5 | 354 | else{ |
kkado | 0:5115e0080bd5 | 355 | buf[x*2 + y*256] = color >> 8; |
kkado | 0:5115e0080bd5 | 356 | buf[x*2 + y*256 + 1] = color; |
kkado | 0:5115e0080bd5 | 357 | } |
kkado | 0:5115e0080bd5 | 358 | } |
kkado | 0:5115e0080bd5 | 359 | error -= dy; |
kkado | 0:5115e0080bd5 | 360 | if(error < 0) |
kkado | 0:5115e0080bd5 | 361 | { |
kkado | 0:5115e0080bd5 | 362 | y += ystep; |
kkado | 0:5115e0080bd5 | 363 | error += dx; |
kkado | 0:5115e0080bd5 | 364 | } |
kkado | 0:5115e0080bd5 | 365 | } |
kkado | 0:5115e0080bd5 | 366 | } |
kkado | 0:5115e0080bd5 | 367 | |
kkado | 0:5115e0080bd5 | 368 | void SSD1351::openCircle(int16_t x0, int16_t y0, uint16_t radius, uint16_t color){ |
kkado | 0:5115e0080bd5 | 369 | int16_t x = radius; |
kkado | 0:5115e0080bd5 | 370 | int16_t y = 0; |
kkado | 0:5115e0080bd5 | 371 | int16_t err = 0; |
kkado | 0:5115e0080bd5 | 372 | |
kkado | 0:5115e0080bd5 | 373 | while(x >= y){ |
kkado | 0:5115e0080bd5 | 374 | if(x0+x >= 0 & x0+x <128 & y0+y >= 0 & y0+y<128){ |
kkado | 0:5115e0080bd5 | 375 | buf[(x0 + x)*2 + (y0 + y)*256] = color >> 8; |
kkado | 0:5115e0080bd5 | 376 | buf[(x0 + x)*2 + (y0 + y)*256 + 1] = color; |
kkado | 0:5115e0080bd5 | 377 | } |
kkado | 0:5115e0080bd5 | 378 | if(x0+y >= 0 & x0+y <128 & y0+x >= 0 & y0+x<128){ |
kkado | 0:5115e0080bd5 | 379 | buf[(x0 + y)*2 + (y0 + x)*256] = color >> 8; |
kkado | 0:5115e0080bd5 | 380 | buf[(x0 + y)*2 + (y0 + x)*256 + 1] = color; |
kkado | 0:5115e0080bd5 | 381 | } |
kkado | 0:5115e0080bd5 | 382 | if(x0-y >= 0 & x0-y <128 & y0+x >= 0 & y0+x<128){ |
kkado | 0:5115e0080bd5 | 383 | buf[(x0 - y)*2 + (y0 + x)*256] = color >> 8; |
kkado | 0:5115e0080bd5 | 384 | buf[(x0 - y)*2 + (y0 + x)*256 + 1] = color; |
kkado | 0:5115e0080bd5 | 385 | } |
kkado | 0:5115e0080bd5 | 386 | if(x0-x >= 0 & x0-x <128 & y0+y >= 0 & y0+y<128){ |
kkado | 0:5115e0080bd5 | 387 | buf[(x0 - x)*2 + (y0 + y)*256] = color >> 8; |
kkado | 0:5115e0080bd5 | 388 | buf[(x0 - x)*2 + (y0 + y)*256 + 1] = color; |
kkado | 0:5115e0080bd5 | 389 | } |
kkado | 0:5115e0080bd5 | 390 | if(x0-x >= 0 & x0-x <128 & y0-y >= 0 & y0-y<128){ |
kkado | 0:5115e0080bd5 | 391 | buf[(x0 - x)*2 + (y0 - y)*256] = color >> 8; |
kkado | 0:5115e0080bd5 | 392 | buf[(x0 - x)*2 + (y0 - y)*256 + 1] = color; |
kkado | 0:5115e0080bd5 | 393 | } |
kkado | 0:5115e0080bd5 | 394 | if(x0-y >= 0 & x0-y <128 & y0-x >= 0 & y0-x<128){ |
kkado | 0:5115e0080bd5 | 395 | buf[(x0 - y)*2 + (y0 - x)*256] = color >> 8; |
kkado | 0:5115e0080bd5 | 396 | buf[(x0 - y)*2 + (y0 - x)*256 + 1] = color; |
kkado | 0:5115e0080bd5 | 397 | } |
kkado | 0:5115e0080bd5 | 398 | if(x0+y >= 0 & x0+y <128 & y0-x >= 0 & y0-x<128){ |
kkado | 0:5115e0080bd5 | 399 | buf[(x0 + y)*2 + (y0 - x)*256] = color >> 8; |
kkado | 0:5115e0080bd5 | 400 | buf[(x0 + y)*2 + (y0 - x)*256 + 1] = color; |
kkado | 0:5115e0080bd5 | 401 | } |
kkado | 0:5115e0080bd5 | 402 | if(x0+x >= 0 & x0+x <128 & y0-y >= 0 & y0-y<128){ |
kkado | 0:5115e0080bd5 | 403 | buf[(x0 + x)*2 + (y0 - y)*256] = color >> 8; |
kkado | 0:5115e0080bd5 | 404 | buf[(x0 + x)*2 + (y0 - y)*256 + 1] = color; |
kkado | 0:5115e0080bd5 | 405 | } |
kkado | 0:5115e0080bd5 | 406 | y += 1; |
kkado | 0:5115e0080bd5 | 407 | if(err <= 0){ |
kkado | 0:5115e0080bd5 | 408 | err += 2*y + 1; |
kkado | 0:5115e0080bd5 | 409 | } |
kkado | 0:5115e0080bd5 | 410 | if(err > 0){ |
kkado | 0:5115e0080bd5 | 411 | x -= 1; |
kkado | 0:5115e0080bd5 | 412 | err -= 2*x + 1; |
kkado | 0:5115e0080bd5 | 413 | } |
kkado | 0:5115e0080bd5 | 414 | } |
kkado | 0:5115e0080bd5 | 415 | } |
kkado | 0:5115e0080bd5 | 416 | |
kkado | 0:5115e0080bd5 | 417 | void SSD1351::fillCircle(int16_t x0, int16_t y0, uint16_t radius, uint16_t color){ |
kkado | 0:5115e0080bd5 | 418 | int16_t x = radius; |
kkado | 0:5115e0080bd5 | 419 | int16_t y = 0; |
kkado | 0:5115e0080bd5 | 420 | int16_t err = 0; |
kkado | 0:5115e0080bd5 | 421 | |
kkado | 0:5115e0080bd5 | 422 | while(x >= y){ |
kkado | 0:5115e0080bd5 | 423 | drawLine(x0,y0+y,x0+x,y0+y,color); |
kkado | 0:5115e0080bd5 | 424 | drawLine(x0,y0+y,x0-x,y0+y,color); |
kkado | 0:5115e0080bd5 | 425 | drawLine(x0,y0-y,x0+x,y0-y,color); |
kkado | 0:5115e0080bd5 | 426 | drawLine(x0,y0-y,x0-x,y0-y,color); |
kkado | 0:5115e0080bd5 | 427 | |
kkado | 0:5115e0080bd5 | 428 | drawLine(x0,y0+x,x0+y,y0+x,color); |
kkado | 0:5115e0080bd5 | 429 | drawLine(x0,y0+x,x0-y,y0+x,color); |
kkado | 0:5115e0080bd5 | 430 | drawLine(x0,y0-x,x0+y,y0-x,color); |
kkado | 0:5115e0080bd5 | 431 | drawLine(x0,y0-x,x0-y,y0-x,color); |
kkado | 0:5115e0080bd5 | 432 | |
kkado | 0:5115e0080bd5 | 433 | y += 1; |
kkado | 0:5115e0080bd5 | 434 | if(err <= 0){ |
kkado | 0:5115e0080bd5 | 435 | err += 2*y + 1; |
kkado | 0:5115e0080bd5 | 436 | } |
kkado | 0:5115e0080bd5 | 437 | if(err > 0){ |
kkado | 0:5115e0080bd5 | 438 | x -= 1; |
kkado | 0:5115e0080bd5 | 439 | err -= 2*x + 1; |
kkado | 0:5115e0080bd5 | 440 | } |
kkado | 0:5115e0080bd5 | 441 | } |
kkado | 0:5115e0080bd5 | 442 | } |
kkado | 0:5115e0080bd5 | 443 | |
kkado | 0:5115e0080bd5 | 444 | //Display a sprite on the screen |
kkado | 0:5115e0080bd5 | 445 | void SSD1351::drawSpritePtr(const uint16_t s[] ,int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t mask){ |
kkado | 0:5115e0080bd5 | 446 | int16_t start = y*256 + x*2; |
kkado | 0:5115e0080bd5 | 447 | uint16_t xs = 0; |
kkado | 0:5115e0080bd5 | 448 | uint16_t xe = 0; |
kkado | 0:5115e0080bd5 | 449 | uint16_t ys = 0; |
kkado | 0:5115e0080bd5 | 450 | uint16_t ye = 0; |
kkado | 0:5115e0080bd5 | 451 | |
kkado | 0:5115e0080bd5 | 452 | if(x < 0){ |
kkado | 0:5115e0080bd5 | 453 | xs = -x; |
kkado | 0:5115e0080bd5 | 454 | } |
kkado | 0:5115e0080bd5 | 455 | if(y < 0){ |
kkado | 0:5115e0080bd5 | 456 | ys = -y; |
kkado | 0:5115e0080bd5 | 457 | } |
kkado | 0:5115e0080bd5 | 458 | if(x+w > 127){ |
kkado | 0:5115e0080bd5 | 459 | xe = x+w-128; |
kkado | 0:5115e0080bd5 | 460 | } |
kkado | 0:5115e0080bd5 | 461 | if(y+h > 127){ |
kkado | 0:5115e0080bd5 | 462 | ye = y+h-128; |
kkado | 0:5115e0080bd5 | 463 | } |
kkado | 0:5115e0080bd5 | 464 | |
kkado | 0:5115e0080bd5 | 465 | for(uint16_t j=0+ys; j<h-ye; j++){ |
kkado | 0:5115e0080bd5 | 466 | for(uint16_t i=0+xs; i<w-xe; i++){ |
kkado | 0:5115e0080bd5 | 467 | if(s[j*w +i] != mask){ |
kkado | 0:5115e0080bd5 | 468 | buf[start +j*256 +i*2] = s[j*w +i] >> 8; |
kkado | 0:5115e0080bd5 | 469 | buf[start +j*256 +i*2 +1] = s[j*w +i]; |
kkado | 0:5115e0080bd5 | 470 | } |
kkado | 0:5115e0080bd5 | 471 | } |
kkado | 0:5115e0080bd5 | 472 | } |
kkado | 0:5115e0080bd5 | 473 | } |
kkado | 0:5115e0080bd5 | 474 | |
kkado | 0:5115e0080bd5 | 475 | //Fill the collision mask with data |
kkado | 0:5115e0080bd5 | 476 | void SSD1351::fillCMask(uint8_t state){ |
kkado | 0:5115e0080bd5 | 477 | for(uint16_t i=0; i < 128*128; i++){ |
kkado | 0:5115e0080bd5 | 478 | collisionmask[i] = state; |
kkado | 0:5115e0080bd5 | 479 | } |
kkado | 0:5115e0080bd5 | 480 | } |
kkado | 0:5115e0080bd5 | 481 | |
kkado | 0:5115e0080bd5 | 482 | //Write data to the collision mask |
kkado | 0:5115e0080bd5 | 483 | void SSD1351::drawCMask(const uint16_t s[], int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t mask, uint8_t state){ |
kkado | 0:5115e0080bd5 | 484 | int16_t start = y*128 + x; |
kkado | 0:5115e0080bd5 | 485 | uint16_t xs = 0; |
kkado | 0:5115e0080bd5 | 486 | uint16_t xe = 0; |
kkado | 0:5115e0080bd5 | 487 | uint16_t ys = 0; |
kkado | 0:5115e0080bd5 | 488 | uint16_t ye = 0; |
kkado | 0:5115e0080bd5 | 489 | |
kkado | 0:5115e0080bd5 | 490 | if(x < 0){ |
kkado | 0:5115e0080bd5 | 491 | xs = -x; |
kkado | 0:5115e0080bd5 | 492 | } |
kkado | 0:5115e0080bd5 | 493 | if(y < 0){ |
kkado | 0:5115e0080bd5 | 494 | ys = -y; |
kkado | 0:5115e0080bd5 | 495 | } |
kkado | 0:5115e0080bd5 | 496 | if(x+w > 127){ |
kkado | 0:5115e0080bd5 | 497 | xe = x+w-128; |
kkado | 0:5115e0080bd5 | 498 | } |
kkado | 0:5115e0080bd5 | 499 | if(y+h > 127){ |
kkado | 0:5115e0080bd5 | 500 | ye = y+h-128; |
kkado | 0:5115e0080bd5 | 501 | } |
kkado | 0:5115e0080bd5 | 502 | |
kkado | 0:5115e0080bd5 | 503 | for(uint16_t j=0+ys; j<h-ye; j++){ |
kkado | 0:5115e0080bd5 | 504 | for(uint16_t i=0+xs; i<w-xe; i++){ |
kkado | 0:5115e0080bd5 | 505 | if(s[j*w +i] != mask){ |
kkado | 0:5115e0080bd5 | 506 | collisionmask[start +j*128 +i] = state; |
kkado | 0:5115e0080bd5 | 507 | } |
kkado | 0:5115e0080bd5 | 508 | } |
kkado | 0:5115e0080bd5 | 509 | } |
kkado | 0:5115e0080bd5 | 510 | } |
kkado | 0:5115e0080bd5 | 511 | |
kkado | 0:5115e0080bd5 | 512 | //Check if a sprite is colliding with anything |
kkado | 0:5115e0080bd5 | 513 | uint8_t SSD1351::checkCollision(const uint16_t s[], int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t mask){ |
kkado | 0:5115e0080bd5 | 514 | int16_t start = y*128 + x; |
kkado | 0:5115e0080bd5 | 515 | uint16_t xs = 0; |
kkado | 0:5115e0080bd5 | 516 | uint16_t xe = 0; |
kkado | 0:5115e0080bd5 | 517 | uint16_t ys = 0; |
kkado | 0:5115e0080bd5 | 518 | uint16_t ye = 0; |
kkado | 0:5115e0080bd5 | 519 | |
kkado | 0:5115e0080bd5 | 520 | if(x < 0){ |
kkado | 0:5115e0080bd5 | 521 | xs = -x; |
kkado | 0:5115e0080bd5 | 522 | } |
kkado | 0:5115e0080bd5 | 523 | if(y < 0){ |
kkado | 0:5115e0080bd5 | 524 | ys = -y; |
kkado | 0:5115e0080bd5 | 525 | } |
kkado | 0:5115e0080bd5 | 526 | if(x+w > 127){ |
kkado | 0:5115e0080bd5 | 527 | xe = x+w-128; |
kkado | 0:5115e0080bd5 | 528 | } |
kkado | 0:5115e0080bd5 | 529 | if(y+h > 127){ |
kkado | 0:5115e0080bd5 | 530 | ye = y+h-128; |
kkado | 0:5115e0080bd5 | 531 | } |
kkado | 0:5115e0080bd5 | 532 | |
kkado | 0:5115e0080bd5 | 533 | for(uint16_t j=0+ys; j<h-ye; j++){ |
kkado | 0:5115e0080bd5 | 534 | for(uint16_t i=0+xs; i<w-xe; i++){ |
kkado | 0:5115e0080bd5 | 535 | if((s[j*w +i] != mask) && (collisionmask[start+j*128+i] != 0x00)){ |
kkado | 0:5115e0080bd5 | 536 | return collisionmask[start+j*128+i]; |
kkado | 0:5115e0080bd5 | 537 | } |
kkado | 0:5115e0080bd5 | 538 | } |
kkado | 0:5115e0080bd5 | 539 | } |
kkado | 0:5115e0080bd5 | 540 | return 0; |
kkado | 0:5115e0080bd5 | 541 | } |
kkado | 0:5115e0080bd5 | 542 | |
kkado | 0:5115e0080bd5 | 543 | //Draw a character |
kkado | 0:5115e0080bd5 | 544 | void SSD1351::drawChar(char c, int16_t x, int16_t y, uint16_t color, uint8_t zoom){ |
kkado | 0:5115e0080bd5 | 545 | int16_t start = y*256 + x*2; |
kkado | 0:5115e0080bd5 | 546 | uint16_t xs = 0; |
kkado | 0:5115e0080bd5 | 547 | uint16_t xe = 0; |
kkado | 0:5115e0080bd5 | 548 | uint16_t ys = 0; |
kkado | 0:5115e0080bd5 | 549 | uint16_t ye = 0; |
kkado | 0:5115e0080bd5 | 550 | |
kkado | 0:5115e0080bd5 | 551 | if(x < 0){ |
kkado | 0:5115e0080bd5 | 552 | xs = -x; |
kkado | 0:5115e0080bd5 | 553 | } |
kkado | 0:5115e0080bd5 | 554 | if(y < 0){ |
kkado | 0:5115e0080bd5 | 555 | ys = -y; |
kkado | 0:5115e0080bd5 | 556 | } |
kkado | 0:5115e0080bd5 | 557 | if(x+3*zoom > 127){ |
kkado | 0:5115e0080bd5 | 558 | xe = x+3*zoom-128; |
kkado | 0:5115e0080bd5 | 559 | } |
kkado | 0:5115e0080bd5 | 560 | if(y+5*zoom > 127){ |
kkado | 0:5115e0080bd5 | 561 | ye = y+5*zoom-128; |
kkado | 0:5115e0080bd5 | 562 | } |
kkado | 0:5115e0080bd5 | 563 | |
kkado | 0:5115e0080bd5 | 564 | uint16_t letter = font[c]; |
kkado | 0:5115e0080bd5 | 565 | for(uint8_t j=0+ys;j<5*zoom-ye;j++){ |
kkado | 0:5115e0080bd5 | 566 | for(uint8_t i=0+xs;i<3*zoom-xe;i++){ |
kkado | 0:5115e0080bd5 | 567 | if(((letter << (uint8_t(i/zoom)+3*uint8_t(j/zoom))) & 0x8000) == 0x8000){ |
kkado | 0:5115e0080bd5 | 568 | for(uint8_t k=0; k<zoom; k++){ |
kkado | 0:5115e0080bd5 | 569 | buf[start+j*256+i*2] = color >> 8; |
kkado | 0:5115e0080bd5 | 570 | buf[start+j*256+i*2 + 1] = color; |
kkado | 0:5115e0080bd5 | 571 | } |
kkado | 0:5115e0080bd5 | 572 | } |
kkado | 0:5115e0080bd5 | 573 | } |
kkado | 0:5115e0080bd5 | 574 | } |
kkado | 0:5115e0080bd5 | 575 | } |
kkado | 0:5115e0080bd5 | 576 | |
kkado | 0:5115e0080bd5 | 577 | //Draw a bunch of characters |
kkado | 0:5115e0080bd5 | 578 | void SSD1351::printText(const char c[], int16_t x, int16_t y, uint16_t color, uint8_t zoom){ |
kkado | 0:5115e0080bd5 | 579 | for(uint16_t i=0; i<strlen(c);i++){ |
kkado | 0:5115e0080bd5 | 580 | drawChar(c[i], x+i*4*zoom, y, color, zoom); |
kkado | 0:5115e0080bd5 | 581 | } |
kkado | 0:5115e0080bd5 | 582 | } |