Dan Allegre / oled_graphic

Dependencies:   mbed

Committer:
dallegre
Date:
Mon Oct 08 16:16:09 2018 +0000
Revision:
3:ffbd1961115d
Parent:
2:b558c2d645b2
Driver and bitmap loading for an SSD1306 graphic display using the STM32 F401.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dallegre 0:deb92489beec 1 #include "mbed.h"
dallegre 0:deb92489beec 2 #include "ssd1306.h"
dallegre 0:deb92489beec 3 #include "FontPack.h"
dallegre 0:deb92489beec 4 #include "icons.h"
dallegre 0:deb92489beec 5 #include "CourierNew5x7.h"
dallegre 0:deb92489beec 6 #include "CourierNew_14x15.h" //whatever.
dallegre 0:deb92489beec 7
dallegre 0:deb92489beec 8 DigitalOut dc(D9); //D/C
dallegre 0:deb92489beec 9 DigitalOut rs(D8); //RES (keep high)
dallegre 0:deb92489beec 10 DigitalOut cs(D7); //CS (active low)
dallegre 0:deb92489beec 11
dallegre 2:b558c2d645b2 12 SPI spi(SPI_MOSI,SPI_MISO,SPI_SCK); //spi1 is the i2s
dallegre 2:b558c2d645b2 13 SPI spi2(PB_15,PB_14,PB_13); //spi2 is the display
dallegre 0:deb92489beec 14
dallegre 0:deb92489beec 15 int main() {
dallegre 0:deb92489beec 16
dallegre 2:b558c2d645b2 17 spi2.frequency(8e6); //8MHz spi22. This is fast enough for 88KHz 16 bit sampling.
dallegre 2:b558c2d645b2 18 spi2.format(8,0); //16 bit. clock polarity 0, phase 0.
dallegre 0:deb92489beec 19 wait(.1);
dallegre 0:deb92489beec 20
dallegre 0:deb92489beec 21 rs.write(1);
dallegre 0:deb92489beec 22 wait(.1);
dallegre 0:deb92489beec 23
dallegre 0:deb92489beec 24 SSD1306Init();
dallegre 0:deb92489beec 25 clearScreen();
dallegre 3:ffbd1961115d 26 //Set_Inverse_Display(1);
dallegre 0:deb92489beec 27
dallegre 3:ffbd1961115d 28 /*
dallegre 1:414748809a35 29 while(1) {
dallegre 1:414748809a35 30 wait(.1);
dallegre 1:414748809a35 31 clearScreen();
dallegre 1:414748809a35 32 imageDraw(aphex7, 2, 40);
dallegre 1:414748809a35 33 wait(.1);
dallegre 1:414748809a35 34 clearScreen();
dallegre 1:414748809a35 35 imageDraw(aphex5, 2, 40);
dallegre 1:414748809a35 36 wait(.1);
dallegre 1:414748809a35 37 clearScreen();
dallegre 1:414748809a35 38 imageDraw(aphex4, 2, 40);
dallegre 1:414748809a35 39 wait(.1);
dallegre 1:414748809a35 40 clearScreen();
dallegre 1:414748809a35 41 imageDraw(aphex3, 2, 40);
dallegre 1:414748809a35 42 wait(.1);
dallegre 1:414748809a35 43 clearScreen();
dallegre 1:414748809a35 44 imageDraw(aphex2, 2, 40);
dallegre 1:414748809a35 45 wait(.1);
dallegre 1:414748809a35 46 clearScreen();
dallegre 1:414748809a35 47 imageDraw(aphex, 2, 40);
dallegre 1:414748809a35 48 wait(.1);
dallegre 1:414748809a35 49 clearScreen();
dallegre 1:414748809a35 50 imageDraw(aphex2, 2, 40);
dallegre 1:414748809a35 51 wait(.1);
dallegre 1:414748809a35 52 clearScreen();
dallegre 1:414748809a35 53 imageDraw(aphex3, 2, 40);
dallegre 1:414748809a35 54 wait(.1);
dallegre 1:414748809a35 55 clearScreen();
dallegre 1:414748809a35 56 imageDraw(aphex4, 2, 40);
dallegre 1:414748809a35 57 wait(.1);
dallegre 1:414748809a35 58 clearScreen();
dallegre 1:414748809a35 59 imageDraw(aphex5, 2, 40);
dallegre 1:414748809a35 60 wait(.1);
dallegre 1:414748809a35 61 clearScreen();
dallegre 1:414748809a35 62 imageDraw(aphex6, 2, 40);
dallegre 3:ffbd1961115d 63 }*/
dallegre 3:ffbd1961115d 64
dallegre 3:ffbd1961115d 65 imageDraw(cassette,1,23);
dallegre 0:deb92489beec 66
dallegre 1:414748809a35 67 //circleDraw(20,40,10);
dallegre 1:414748809a35 68 //circleDraw(40,20,30);
dallegre 1:414748809a35 69 //stringDraw(2, 40, "D A N");
dallegre 1:414748809a35 70 //stringDraw(4, 40, "mad scientist");
dallegre 0:deb92489beec 71 }
dallegre 0:deb92489beec 72
dallegre 0:deb92489beec 73
dallegre 0:deb92489beec 74
dallegre 0:deb92489beec 75
dallegre 0:deb92489beec 76
dallegre 0:deb92489beec 77
dallegre 0:deb92489beec 78 //bunch of shit below..
dallegre 0:deb92489beec 79
dallegre 0:deb92489beec 80 char SSD1306_init[] = {
dallegre 0:deb92489beec 81 SSD1306_DISPLAYOFF,
dallegre 0:deb92489beec 82 SSD1306_SETLOWCOLUMN,
dallegre 0:deb92489beec 83 SSD1306_SETHIGHCOLUMN,
dallegre 0:deb92489beec 84 SSD1306_SETSTARTLINE,
dallegre 0:deb92489beec 85 SSD1306_SETCONTRAST,
dallegre 0:deb92489beec 86 0xcf,
dallegre 0:deb92489beec 87 SSD1306_SEGREMAP,
dallegre 0:deb92489beec 88 SSD1306_NORMALDISPLAY,
dallegre 0:deb92489beec 89 SSD1306_SETMULTIPLEX,
dallegre 0:deb92489beec 90 0x3f,
dallegre 0:deb92489beec 91 SSD1306_SETDISPLAYOFFSET,
dallegre 0:deb92489beec 92 0x00,
dallegre 0:deb92489beec 93 SSD1306_SETDISPLAYCLOCKDIV,
dallegre 0:deb92489beec 94 0x80,
dallegre 0:deb92489beec 95 SSD1306_SETPRECHARGE,
dallegre 0:deb92489beec 96 0xf1,
dallegre 0:deb92489beec 97 SSD1306_SETCOMPINS,
dallegre 0:deb92489beec 98 0x12,
dallegre 0:deb92489beec 99 SSD1306_SETVCOMDETECT,
dallegre 0:deb92489beec 100 0x40,
dallegre 0:deb92489beec 101 SSD1306_CHARGEPUMP,
dallegre 0:deb92489beec 102 0x14,
dallegre 0:deb92489beec 103 SSD1306_DISPLAYON
dallegre 0:deb92489beec 104 };
dallegre 0:deb92489beec 105
dallegre 0:deb92489beec 106 void SSD1306Init(void){
dallegre 0:deb92489beec 107 cs.write(1);
dallegre 0:deb92489beec 108 dc.write(0);
dallegre 0:deb92489beec 109 rs.write(0);
dallegre 0:deb92489beec 110 rs.write(1);
dallegre 0:deb92489beec 111 SSD1306SendCommand(SSD1306_init, sizeof SSD1306_init);
dallegre 0:deb92489beec 112 }
dallegre 0:deb92489beec 113
dallegre 0:deb92489beec 114 void SSD1306SendCommand(char *data, int i){
dallegre 0:deb92489beec 115 cs.write(1);
dallegre 0:deb92489beec 116 dc.write(0); //data/command low for command.
dallegre 0:deb92489beec 117 cs.write(0);
dallegre 0:deb92489beec 118 while(i){
dallegre 2:b558c2d645b2 119 spi2.write(*data);
dallegre 0:deb92489beec 120 data++;
dallegre 0:deb92489beec 121 i--;
dallegre 0:deb92489beec 122 }
dallegre 0:deb92489beec 123 cs.write(1);
dallegre 0:deb92489beec 124 }
dallegre 0:deb92489beec 125
dallegre 0:deb92489beec 126 void SSD1306SendData(char *data, int i){
dallegre 0:deb92489beec 127 cs.write(1);
dallegre 0:deb92489beec 128 dc.write(1); //data/command high for data.
dallegre 0:deb92489beec 129 cs.write(0);
dallegre 0:deb92489beec 130 while(i){
dallegre 2:b558c2d645b2 131 spi2.write(*data);
dallegre 0:deb92489beec 132 data++;
dallegre 0:deb92489beec 133 i--;
dallegre 0:deb92489beec 134 }
dallegre 0:deb92489beec 135 cs.write(1);
dallegre 0:deb92489beec 136 }
dallegre 0:deb92489beec 137
dallegre 0:deb92489beec 138 void setAddress( char page, char column )
dallegre 0:deb92489beec 139 {
dallegre 0:deb92489beec 140
dallegre 0:deb92489beec 141 char pageAddress[] = {SSD1306_PAGE_START_ADDRESS};
dallegre 0:deb92489beec 142 char columnAddress[] = { SSD1306_COLUMNADDRESS, SSD1306_COLUMNADDRESS_MSB, SSD1306_COLUMNADDRESS_LSB };
dallegre 0:deb92489beec 143
dallegre 0:deb92489beec 144 if (page > SSD1306_MAXROWS)
dallegre 0:deb92489beec 145 {
dallegre 0:deb92489beec 146 page = SSD1306_MAXROWS;
dallegre 0:deb92489beec 147 }
dallegre 0:deb92489beec 148
dallegre 0:deb92489beec 149 if (column > SSD1306_LCDWIDTH)
dallegre 0:deb92489beec 150 {
dallegre 0:deb92489beec 151 column = SSD1306_LCDWIDTH;
dallegre 0:deb92489beec 152 }
dallegre 0:deb92489beec 153
dallegre 0:deb92489beec 154 pageAddress[0] = SSD1306_PAGE_START_ADDRESS | (SSD1306_MAXROWS - page);
dallegre 0:deb92489beec 155
dallegre 0:deb92489beec 156 columnAddress[0] = SSD1306_COLUMNADDRESS;
dallegre 0:deb92489beec 157 columnAddress[1] = SSD1306_COLUMNADDRESS_MSB | column;
dallegre 0:deb92489beec 158 columnAddress[2] = SSD1306_COLUMNADDRESS_LSB;
dallegre 0:deb92489beec 159
dallegre 0:deb92489beec 160 //__no_operation();
dallegre 0:deb92489beec 161
dallegre 0:deb92489beec 162 SSD1306SendCommand(pageAddress, 1);
dallegre 0:deb92489beec 163 SSD1306SendCommand(columnAddress, 3);
dallegre 0:deb92489beec 164
dallegre 0:deb92489beec 165 }
dallegre 0:deb92489beec 166
dallegre 0:deb92489beec 167 void clearScreen(void)
dallegre 0:deb92489beec 168 {
dallegre 0:deb92489beec 169 char ramData[] = {0x00};
dallegre 0:deb92489beec 170
dallegre 0:deb92489beec 171 char i,j;
dallegre 0:deb92489beec 172
dallegre 0:deb92489beec 173 for(i=0; i < 8 ;i++)
dallegre 0:deb92489beec 174 {
dallegre 0:deb92489beec 175 setAddress(i,0);
dallegre 0:deb92489beec 176
dallegre 0:deb92489beec 177 for(j=0; j < SSD1306_LCDWIDTH; j++)
dallegre 0:deb92489beec 178 {
dallegre 0:deb92489beec 179 SSD1306SendData(ramData, 1);
dallegre 0:deb92489beec 180 }
dallegre 0:deb92489beec 181 }
dallegre 0:deb92489beec 182 }
dallegre 0:deb92489beec 183
dallegre 0:deb92489beec 184 void charDraw(char row, char column, int data)
dallegre 0:deb92489beec 185 {
dallegre 0:deb92489beec 186 int h;
dallegre 0:deb92489beec 187
dallegre 0:deb92489beec 188 if (row > SSD1306_MAXROWS)
dallegre 0:deb92489beec 189 {
dallegre 0:deb92489beec 190 row = SSD1306_MAXROWS;
dallegre 0:deb92489beec 191 }
dallegre 0:deb92489beec 192
dallegre 0:deb92489beec 193 if (column > SSD1306_LCDWIDTH)
dallegre 0:deb92489beec 194 {
dallegre 0:deb92489beec 195 column = SSD1306_LCDWIDTH;
dallegre 0:deb92489beec 196 }
dallegre 0:deb92489beec 197
dallegre 0:deb92489beec 198 if ( data < 32 || data > 129 )
dallegre 0:deb92489beec 199 {
dallegre 0:deb92489beec 200 data = '.';
dallegre 0:deb92489beec 201 }
dallegre 0:deb92489beec 202
dallegre 0:deb92489beec 203 h = (data - 32) * 6;
dallegre 0:deb92489beec 204
dallegre 0:deb92489beec 205 setAddress(row, column);
dallegre 0:deb92489beec 206 SSD1306SendData( (char *)FONT6x8 + h, 6 );
dallegre 0:deb92489beec 207
dallegre 0:deb92489beec 208 }
dallegre 0:deb92489beec 209
dallegre 0:deb92489beec 210 void stringDraw( char row, char column, char *word)
dallegre 0:deb92489beec 211 {
dallegre 0:deb92489beec 212 char a = 0;
dallegre 0:deb92489beec 213
dallegre 0:deb92489beec 214 if (row > SSD1306_MAXROWS)
dallegre 0:deb92489beec 215 {
dallegre 0:deb92489beec 216 row = SSD1306_MAXROWS;
dallegre 0:deb92489beec 217 }
dallegre 0:deb92489beec 218
dallegre 0:deb92489beec 219 if (column > SSD1306_LCDWIDTH)
dallegre 0:deb92489beec 220 {
dallegre 0:deb92489beec 221 column = SSD1306_LCDWIDTH;
dallegre 0:deb92489beec 222 }
dallegre 0:deb92489beec 223
dallegre 0:deb92489beec 224 while (word[a] != 0)
dallegre 0:deb92489beec 225 {
dallegre 0:deb92489beec 226 if (word[a] != 0x0A)
dallegre 0:deb92489beec 227 {
dallegre 0:deb92489beec 228 if (word[a] != 0x0D)
dallegre 0:deb92489beec 229 {
dallegre 0:deb92489beec 230 charDraw(row, column, word[a]);
dallegre 0:deb92489beec 231
dallegre 0:deb92489beec 232 //__no_operation();
dallegre 0:deb92489beec 233
dallegre 0:deb92489beec 234 column += 6;
dallegre 0:deb92489beec 235
dallegre 0:deb92489beec 236 if (column >= (SSD1306_LCDWIDTH - 6 ))
dallegre 0:deb92489beec 237 {
dallegre 0:deb92489beec 238 column = 0;
dallegre 0:deb92489beec 239 if ( row < SSD1306_MAXROWS )
dallegre 0:deb92489beec 240 row++;
dallegre 0:deb92489beec 241 else
dallegre 0:deb92489beec 242 row = 0;
dallegre 0:deb92489beec 243 }
dallegre 0:deb92489beec 244
dallegre 0:deb92489beec 245 }
dallegre 0:deb92489beec 246 else
dallegre 0:deb92489beec 247 {
dallegre 0:deb92489beec 248 if ( row < SSD1306_MAXROWS )
dallegre 0:deb92489beec 249 row++;
dallegre 0:deb92489beec 250 else
dallegre 0:deb92489beec 251 row = 0;
dallegre 0:deb92489beec 252 column = 0;
dallegre 0:deb92489beec 253 }
dallegre 0:deb92489beec 254 a++;
dallegre 0:deb92489beec 255 }
dallegre 0:deb92489beec 256 }
dallegre 0:deb92489beec 257 }
dallegre 0:deb92489beec 258
dallegre 0:deb92489beec 259 void pixelDraw(char x, char y)
dallegre 0:deb92489beec 260 {
dallegre 0:deb92489beec 261 char page, temp;
dallegre 0:deb92489beec 262 char coordinate[] = {0x00};
dallegre 0:deb92489beec 263
dallegre 0:deb92489beec 264 if (x > SSD1306_LCDWIDTH - 1)
dallegre 0:deb92489beec 265 {
dallegre 0:deb92489beec 266 x = SSD1306_LCDWIDTH - 1;
dallegre 0:deb92489beec 267 }
dallegre 0:deb92489beec 268
dallegre 0:deb92489beec 269 if (y > SSD1306_LCDHEIGHT - 1)
dallegre 0:deb92489beec 270 {
dallegre 0:deb92489beec 271 y = SSD1306_LCDHEIGHT - 1;
dallegre 0:deb92489beec 272 }
dallegre 0:deb92489beec 273
dallegre 0:deb92489beec 274 page = y / 8;
dallegre 0:deb92489beec 275 temp = 0x80 >> (y % 8);
dallegre 0:deb92489beec 276 coordinate[0] = temp;
dallegre 0:deb92489beec 277
dallegre 0:deb92489beec 278 setAddress(page,x);
dallegre 0:deb92489beec 279 SSD1306SendData(coordinate, 1);
dallegre 0:deb92489beec 280
dallegre 0:deb92489beec 281 }
dallegre 0:deb92489beec 282
dallegre 0:deb92489beec 283
dallegre 0:deb92489beec 284 void horizontalLine(char xStart, char xStop, char y)
dallegre 0:deb92489beec 285 {
dallegre 0:deb92489beec 286 char temp = 0;
dallegre 0:deb92489beec 287 char page, a;
dallegre 0:deb92489beec 288 char ramData[] = { 0x00 };
dallegre 0:deb92489beec 289
dallegre 0:deb92489beec 290 if (xStart > SSD1306_LCDWIDTH - 1)
dallegre 0:deb92489beec 291 {
dallegre 0:deb92489beec 292 xStart = SSD1306_LCDWIDTH - 1;
dallegre 0:deb92489beec 293 }
dallegre 0:deb92489beec 294
dallegre 0:deb92489beec 295 if (xStop > SSD1306_LCDWIDTH - 1)
dallegre 0:deb92489beec 296 {
dallegre 0:deb92489beec 297 xStop = SSD1306_LCDWIDTH - 1;
dallegre 0:deb92489beec 298 }
dallegre 0:deb92489beec 299
dallegre 0:deb92489beec 300 if (y > SSD1306_LCDHEIGHT - 1)
dallegre 0:deb92489beec 301 {
dallegre 0:deb92489beec 302 y = SSD1306_LCDHEIGHT - 1;
dallegre 0:deb92489beec 303 }
dallegre 0:deb92489beec 304
dallegre 0:deb92489beec 305 if (xStart > xStop)
dallegre 0:deb92489beec 306 {
dallegre 0:deb92489beec 307 temp = xStart;
dallegre 0:deb92489beec 308 xStart = xStop;
dallegre 0:deb92489beec 309 xStop = temp;
dallegre 0:deb92489beec 310 }
dallegre 0:deb92489beec 311
dallegre 0:deb92489beec 312 page = y / 8;
dallegre 0:deb92489beec 313 temp = 0x80 >> (y %8);
dallegre 0:deb92489beec 314
dallegre 0:deb92489beec 315 a = xStart;
dallegre 0:deb92489beec 316 ramData[0] = temp;
dallegre 0:deb92489beec 317
dallegre 0:deb92489beec 318 setAddress(page, xStart);
dallegre 0:deb92489beec 319
dallegre 0:deb92489beec 320 while (a <= xStop)
dallegre 0:deb92489beec 321 {
dallegre 0:deb92489beec 322 SSD1306SendData(ramData, 1);
dallegre 0:deb92489beec 323 a++;
dallegre 0:deb92489beec 324 }
dallegre 0:deb92489beec 325 }
dallegre 0:deb92489beec 326
dallegre 0:deb92489beec 327 void verticalLine(char x, char yStart, char yStop)
dallegre 0:deb92489beec 328 {
dallegre 0:deb92489beec 329 char temp1 = 0, temp2 = 0;
dallegre 0:deb92489beec 330 char page1, page2, pageStart;
dallegre 0:deb92489beec 331 char a;
dallegre 0:deb92489beec 332 char ramData1[] = {0x00};
dallegre 0:deb92489beec 333 char ramData2[] = {0x00};
dallegre 0:deb92489beec 334
dallegre 0:deb92489beec 335 if (x > SSD1306_LCDWIDTH - 1)
dallegre 0:deb92489beec 336 {
dallegre 0:deb92489beec 337 x = SSD1306_LCDWIDTH - 1;
dallegre 0:deb92489beec 338 }
dallegre 0:deb92489beec 339
dallegre 0:deb92489beec 340 if (yStart > SSD1306_LCDHEIGHT - 1)
dallegre 0:deb92489beec 341 {
dallegre 0:deb92489beec 342 yStart = SSD1306_LCDHEIGHT - 1;
dallegre 0:deb92489beec 343 }
dallegre 0:deb92489beec 344
dallegre 0:deb92489beec 345 if (yStop > SSD1306_LCDHEIGHT - 1)
dallegre 0:deb92489beec 346 {
dallegre 0:deb92489beec 347 yStop = SSD1306_LCDHEIGHT - 1;
dallegre 0:deb92489beec 348 }
dallegre 0:deb92489beec 349
dallegre 0:deb92489beec 350 if (yStart > yStop)
dallegre 0:deb92489beec 351 {
dallegre 0:deb92489beec 352 temp1 = yStart;
dallegre 0:deb92489beec 353 yStart = yStop;
dallegre 0:deb92489beec 354 yStop = temp1;
dallegre 0:deb92489beec 355 }
dallegre 0:deb92489beec 356
dallegre 0:deb92489beec 357 page1 = yStart / 8;
dallegre 0:deb92489beec 358 page2 = yStop / 8;
dallegre 0:deb92489beec 359 pageStart = yStart % 8;
dallegre 0:deb92489beec 360
dallegre 0:deb92489beec 361 if (page1 != page2)
dallegre 0:deb92489beec 362 {
dallegre 0:deb92489beec 363 if ( pageStart > 0)
dallegre 0:deb92489beec 364 {
dallegre 0:deb92489beec 365 temp1 = 0xFF00 >> pageStart;
dallegre 0:deb92489beec 366 temp1 = temp1 ^ 0xFF;
dallegre 0:deb92489beec 367 }
dallegre 0:deb92489beec 368 else
dallegre 0:deb92489beec 369 {
dallegre 0:deb92489beec 370 temp1 = 0xFF;
dallegre 0:deb92489beec 371 }
dallegre 0:deb92489beec 372 }
dallegre 0:deb92489beec 373 else
dallegre 0:deb92489beec 374 {
dallegre 0:deb92489beec 375 temp1 = 0;
dallegre 0:deb92489beec 376
dallegre 0:deb92489beec 377 a = yStart - (page1 * 8);
dallegre 0:deb92489beec 378 a = 0xFF00 >> a;
dallegre 0:deb92489beec 379 temp2 = temp2 ^ a;
dallegre 0:deb92489beec 380 }
dallegre 0:deb92489beec 381
dallegre 0:deb92489beec 382 ramData1[0] = temp1;
dallegre 0:deb92489beec 383
dallegre 0:deb92489beec 384 setAddress(page1,x);
dallegre 0:deb92489beec 385 SSD1306SendData(ramData1, 1);
dallegre 0:deb92489beec 386
dallegre 0:deb92489beec 387 a = page1 + 1;
dallegre 0:deb92489beec 388 ramData1[0] = 0xFF;
dallegre 0:deb92489beec 389
dallegre 0:deb92489beec 390 while (a < page2)
dallegre 0:deb92489beec 391 {
dallegre 0:deb92489beec 392 setAddress(a, x);
dallegre 0:deb92489beec 393 SSD1306SendData(ramData1, 1);
dallegre 0:deb92489beec 394 a++;
dallegre 0:deb92489beec 395 }
dallegre 0:deb92489beec 396
dallegre 0:deb92489beec 397 temp2 = 8 - (yStop % 8);
dallegre 0:deb92489beec 398 temp2--;
dallegre 0:deb92489beec 399 temp2 = 0xFF << temp2;
dallegre 0:deb92489beec 400
dallegre 0:deb92489beec 401 ramData2[0] = temp2;
dallegre 0:deb92489beec 402
dallegre 0:deb92489beec 403 setAddress(page2, x);
dallegre 0:deb92489beec 404 SSD1306SendData(ramData2, 1);
dallegre 0:deb92489beec 405 }
dallegre 0:deb92489beec 406
dallegre 0:deb92489beec 407 void imageDraw(const char IMAGE[], char row, char column)
dallegre 0:deb92489beec 408 {
dallegre 0:deb92489beec 409 char a, height, width;
dallegre 0:deb92489beec 410
dallegre 0:deb92489beec 411 width = IMAGE[0];
dallegre 0:deb92489beec 412 height = IMAGE[1];
dallegre 0:deb92489beec 413
dallegre 0:deb92489beec 414 for ( a = 0; a < height; a++)
dallegre 0:deb92489beec 415 {
dallegre 0:deb92489beec 416 setAddress(row + a, column);
dallegre 0:deb92489beec 417 SSD1306SendData((char *)IMAGE + 2 + a * width, width);
dallegre 0:deb92489beec 418 }
dallegre 0:deb92489beec 419 }
dallegre 0:deb92489beec 420
dallegre 0:deb92489beec 421 void circleDraw(register int x, register int y, int r)
dallegre 0:deb92489beec 422 {
dallegre 0:deb92489beec 423 register int xx = -r;
dallegre 0:deb92489beec 424 register int yy = 0;
dallegre 0:deb92489beec 425 register int e = 2 - (2 * r);
dallegre 0:deb92489beec 426 do {
dallegre 0:deb92489beec 427 pixelDraw(x - xx, y + yy);
dallegre 0:deb92489beec 428 pixelDraw(x - yy, y - xx);
dallegre 0:deb92489beec 429 pixelDraw(x + xx, y - yy);
dallegre 0:deb92489beec 430 pixelDraw(x + yy, y + xx);
dallegre 0:deb92489beec 431 if(e > xx) e += ((++xx << 1) + 1);
dallegre 0:deb92489beec 432 if(e <= yy) e += ((++yy << 1) + 1);
dallegre 0:deb92489beec 433 } while (xx < 0);
dallegre 0:deb92489beec 434 }
dallegre 0:deb92489beec 435
dallegre 0:deb92489beec 436 void Fill_RAM( char data )
dallegre 0:deb92489beec 437 {
dallegre 0:deb92489beec 438 unsigned char i,j;
dallegre 0:deb92489beec 439
dallegre 0:deb92489beec 440 char ramData[] = { 0x00};
dallegre 0:deb92489beec 441
dallegre 0:deb92489beec 442 ramData[0] = data;
dallegre 0:deb92489beec 443
dallegre 0:deb92489beec 444 for(i=0; i < 8 ;i++)
dallegre 0:deb92489beec 445 {
dallegre 0:deb92489beec 446 setAddress(i,0);
dallegre 0:deb92489beec 447
dallegre 0:deb92489beec 448 for(j=0; j < SSD1306_LCDWIDTH; j++)
dallegre 0:deb92489beec 449 {
dallegre 0:deb92489beec 450 SSD1306SendData(ramData, 1);
dallegre 0:deb92489beec 451 }
dallegre 0:deb92489beec 452 }
dallegre 0:deb92489beec 453 }
dallegre 0:deb92489beec 454
dallegre 0:deb92489beec 455 void Fill_RAM_PAGE(unsigned char page, char data)
dallegre 0:deb92489beec 456 {
dallegre 0:deb92489beec 457 unsigned char j;
dallegre 0:deb92489beec 458
dallegre 0:deb92489beec 459 char ramData[] = { 0x00 };
dallegre 0:deb92489beec 460
dallegre 0:deb92489beec 461 ramData[0] = data;
dallegre 0:deb92489beec 462
dallegre 0:deb92489beec 463 setAddress(page,0);
dallegre 0:deb92489beec 464
dallegre 0:deb92489beec 465 for(j=0; j < SSD1306_LCDWIDTH ;j++)
dallegre 0:deb92489beec 466 {
dallegre 0:deb92489beec 467 SSD1306SendData(ramData, 1);
dallegre 0:deb92489beec 468 }
dallegre 0:deb92489beec 469 }
dallegre 0:deb92489beec 470
dallegre 0:deb92489beec 471 void Set_Contrast_Control(unsigned char d)
dallegre 0:deb92489beec 472 {
dallegre 0:deb92489beec 473 char ramData[] = {SSD1306_SETCONTRAST, 0x00};
dallegre 0:deb92489beec 474 ramData[1] = d;
dallegre 0:deb92489beec 475
dallegre 0:deb92489beec 476 SSD1306SendCommand(ramData, 2);
dallegre 0:deb92489beec 477 }
dallegre 0:deb92489beec 478
dallegre 0:deb92489beec 479 void Set_Inverse_Display(unsigned char d)
dallegre 0:deb92489beec 480 {
dallegre 0:deb92489beec 481 // 0 = normal, 1 = inverted
dallegre 0:deb92489beec 482
dallegre 0:deb92489beec 483 char ramData[] = {SSD1306_NORMALDISPLAY};
dallegre 0:deb92489beec 484 ramData[0] = ramData[0] + d;
dallegre 0:deb92489beec 485
dallegre 0:deb92489beec 486 SSD1306SendCommand(ramData, 1);
dallegre 0:deb92489beec 487 }
dallegre 0:deb92489beec 488
dallegre 0:deb92489beec 489 void Set_Display_On_Off(unsigned char d)
dallegre 0:deb92489beec 490 {
dallegre 0:deb92489beec 491 // 0 = off, 1 = on
dallegre 0:deb92489beec 492
dallegre 0:deb92489beec 493 char ramData[] = {SSD1306_DISPLAYOFF};
dallegre 0:deb92489beec 494 ramData[0] = ramData[0] + d;
dallegre 0:deb92489beec 495
dallegre 0:deb92489beec 496 SSD1306SendCommand(ramData, 1);
dallegre 0:deb92489beec 497 }
dallegre 0:deb92489beec 498