SSD1351 library for the STM32F401RE. Uses BurstSPI and a couple of tweaks to improve throughput.

Dependencies:   BurstSPI

Library for the SSD1351 128 x 128 OLED display, specifically for the STM32F401RE Nucleo/STMstation development boards.

/media/uploads/kkado/imgp1229.jpg

See API documentation for more details and code.

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?

UserRevisionLine numberNew 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 }