displaying on SSD1306, 128x64 pixels OLED

Dependencies:   microbit

Committer:
bvirk
Date:
Sat Feb 15 23:05:29 2020 +0000
Revision:
3:f36427797fd7
Child:
4:19da6ea94042
splited in OLED.cpp, OLED.h, OLEDGlobals.h,MathExt,Math.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bvirk 3:f36427797fd7 1
bvirk 3:f36427797fd7 2 #include "MicroBit.h"
bvirk 3:f36427797fd7 3 #include "MicroBitI2C.h"
bvirk 3:f36427797fd7 4
bvirk 3:f36427797fd7 5 #include "mathExt.h"
bvirk 3:f36427797fd7 6 #include "OLEDGlobals.h"
bvirk 3:f36427797fd7 7 #include "OLED.h"
bvirk 3:f36427797fd7 8
bvirk 3:f36427797fd7 9 OLED::OLED() :
bvirk 3:f36427797fd7 10 i2c(I2C_SDA0,I2C_SCL0)
bvirk 3:f36427797fd7 11 ,charX(0)
bvirk 3:f36427797fd7 12 ,charY(0)
bvirk 3:f36427797fd7 13 ,displayWidth(128)
bvirk 3:f36427797fd7 14 ,displayHeight(64 / 8)
bvirk 3:f36427797fd7 15 ,screenSize(0) {
bvirk 3:f36427797fd7 16 init(128, 64);
bvirk 3:f36427797fd7 17 clear();
bvirk 3:f36427797fd7 18 }
bvirk 3:f36427797fd7 19
bvirk 3:f36427797fd7 20 void OLED::command(uint8_t cmd) {
bvirk 3:f36427797fd7 21 char buf[2];
bvirk 3:f36427797fd7 22 buf[0] = '\0';
bvirk 3:f36427797fd7 23 buf[1] = cmd;
bvirk 3:f36427797fd7 24 i2c.write(chipAdress,buf,2);
bvirk 3:f36427797fd7 25 }
bvirk 3:f36427797fd7 26
bvirk 3:f36427797fd7 27 void OLED::init(uint8_t width, uint8_t height) {
bvirk 3:f36427797fd7 28 command(SSD1306_DISPLAYOFF);
bvirk 3:f36427797fd7 29 command(SSD1306_SETDISPLAYCLOCKDIV);
bvirk 3:f36427797fd7 30 command(0x80); // the suggested ratio 0x80
bvirk 3:f36427797fd7 31 command(SSD1306_SETMULTIPLEX);
bvirk 3:f36427797fd7 32 command(0x3F);
bvirk 3:f36427797fd7 33 command(SSD1306_SETDISPLAYOFFSET);
bvirk 3:f36427797fd7 34 command(0x0); // no offset
bvirk 3:f36427797fd7 35 command(SSD1306_SETSTARTLINE | 0x0); // line #0
bvirk 3:f36427797fd7 36 command(SSD1306_CHARGEPUMP);
bvirk 3:f36427797fd7 37 command(0x14);
bvirk 3:f36427797fd7 38 command(SSD1306_MEMORYMODE);
bvirk 3:f36427797fd7 39 command(0x00); // 0x0 act like ks0108
bvirk 3:f36427797fd7 40 command(SSD1306_SEGREMAP | 0x1);
bvirk 3:f36427797fd7 41 command(SSD1306_COMSCANDEC);
bvirk 3:f36427797fd7 42 command(SSD1306_SETCOMPINS);
bvirk 3:f36427797fd7 43 command(0x12);
bvirk 3:f36427797fd7 44 command(SSD1306_SETCONTRAST);
bvirk 3:f36427797fd7 45 command(0xCF);
bvirk 3:f36427797fd7 46 command(SSD1306_SETPRECHARGE);
bvirk 3:f36427797fd7 47 command(0xF1);
bvirk 3:f36427797fd7 48 command(SSD1306_SETVCOMDETECT);
bvirk 3:f36427797fd7 49 command(0x40);
bvirk 3:f36427797fd7 50 command(SSD1306_DISPLAYALLON_RESUME);
bvirk 3:f36427797fd7 51 command(SSD1306_NORMALDISPLAY);
bvirk 3:f36427797fd7 52 command(SSD1306_DISPLAYON);
bvirk 3:f36427797fd7 53 displayWidth = width;
bvirk 3:f36427797fd7 54 displayHeight = height / 8;
bvirk 3:f36427797fd7 55 screenSize = displayWidth * displayHeight;
bvirk 3:f36427797fd7 56 charX = xOffset;
bvirk 3:f36427797fd7 57 charY = yOffset;
bvirk 3:f36427797fd7 58 loadStarted = false;
bvirk 3:f36427797fd7 59 loadPercent = 0;
bvirk 3:f36427797fd7 60 clear();
bvirk 3:f36427797fd7 61 }
bvirk 3:f36427797fd7 62
bvirk 3:f36427797fd7 63 void OLED::clear() {
bvirk 3:f36427797fd7 64 loadStarted = false;
bvirk 3:f36427797fd7 65 loadPercent = 0;
bvirk 3:f36427797fd7 66 command(SSD1306_SETCOLUMNADRESS);
bvirk 3:f36427797fd7 67 command(0x00);
bvirk 3:f36427797fd7 68 command(displayWidth - 1);
bvirk 3:f36427797fd7 69 command(SSD1306_SETPAGEADRESS);
bvirk 3:f36427797fd7 70 command(0x00);
bvirk 3:f36427797fd7 71 command(displayHeight - 1);
bvirk 3:f36427797fd7 72 char data[17];
bvirk 3:f36427797fd7 73 data[0] = 0x40; // Data Mode;
bvirk 3:f36427797fd7 74 for (int8_t i = 1; i < 17; i++)
bvirk 3:f36427797fd7 75 data[i] = 0x00;
bvirk 3:f36427797fd7 76 // send display buffer in 16 byte chunks;
bvirk 3:f36427797fd7 77 for (int16_t i = 0; i < screenSize; i += 16) {
bvirk 3:f36427797fd7 78 i2c.write(chipAdress, data, 17,false);
bvirk 3:f36427797fd7 79 }
bvirk 3:f36427797fd7 80 charX = xOffset;
bvirk 3:f36427797fd7 81 charY = yOffset;
bvirk 3:f36427797fd7 82 }
bvirk 3:f36427797fd7 83
bvirk 3:f36427797fd7 84 //void OLED::newLine() {
bvirk 3:f36427797fd7 85 // charY++;charX = xOffset;
bvirk 3:f36427797fd7 86 //}
bvirk 3:f36427797fd7 87
bvirk 3:f36427797fd7 88 void OLED::setCharTable(unsigned int chr, unsigned char *tegnbits) {
bvirk 3:f36427797fd7 89 for (int8_t p=0; p<5; p++)
bvirk 3:f36427797fd7 90 tegnbits[p] = font[chr][p];
bvirk 3:f36427797fd7 91 }
bvirk 3:f36427797fd7 92
bvirk 3:f36427797fd7 93 void OLED::drawChar(uint8_t x, uint8_t y, uint8_t chr ) {
bvirk 3:f36427797fd7 94 command(SSD1306_SETCOLUMNADRESS);
bvirk 3:f36427797fd7 95 command(x);
bvirk 3:f36427797fd7 96 command(x + 5);
bvirk 3:f36427797fd7 97 command(SSD1306_SETPAGEADRESS);
bvirk 3:f36427797fd7 98 command(y);
bvirk 3:f36427797fd7 99 command(y + 1);
bvirk 3:f36427797fd7 100 char line[2];
bvirk 3:f36427797fd7 101 line[0] = 0x40;
bvirk 3:f36427797fd7 102 for (int8_t i = 0; i < 6; i++) {
bvirk 3:f36427797fd7 103 if (i == 5)
bvirk 3:f36427797fd7 104 line[1] = 0x00;
bvirk 3:f36427797fd7 105 else
bvirk 3:f36427797fd7 106 line[1] = font[chr][i];
bvirk 3:f36427797fd7 107 i2c.write(chipAdress, line, 2, false);
bvirk 3:f36427797fd7 108 }
bvirk 3:f36427797fd7 109 }
bvirk 3:f36427797fd7 110
bvirk 3:f36427797fd7 111 void OLED::write(ManagedString str) {
bvirk 3:f36427797fd7 112 for (uint16_t i = 0; i < str.length(); i++) {
bvirk 3:f36427797fd7 113 if (charX > displayWidth - 6) {
bvirk 3:f36427797fd7 114 charY++;
bvirk 3:f36427797fd7 115 charX = xOffset;
bvirk 3:f36427797fd7 116 }
bvirk 3:f36427797fd7 117
bvirk 3:f36427797fd7 118 drawChar(charX, charY, (uint8_t)str.charAt(i));
bvirk 3:f36427797fd7 119 charX += 6;
bvirk 3:f36427797fd7 120 }
bvirk 3:f36427797fd7 121 }
bvirk 3:f36427797fd7 122 void OLED::writeln(ManagedString str) {
bvirk 3:f36427797fd7 123 write(str);
bvirk 3:f36427797fd7 124 charY++;charX = xOffset;
bvirk 3:f36427797fd7 125
bvirk 3:f36427797fd7 126 }
bvirk 3:f36427797fd7 127
bvirk 3:f36427797fd7 128 void OLED::write(float number) {
bvirk 3:f36427797fd7 129 write(ftos(number));
bvirk 3:f36427797fd7 130 }
bvirk 3:f36427797fd7 131
bvirk 3:f36427797fd7 132 void OLED::writeln(float number) {
bvirk 3:f36427797fd7 133 write(number);
bvirk 3:f36427797fd7 134 charY++;charX = xOffset;
bvirk 3:f36427797fd7 135
bvirk 3:f36427797fd7 136 }
bvirk 3:f36427797fd7 137
bvirk 3:f36427797fd7 138 void OLED::testOLED(MicroBit & uBit) {
bvirk 3:f36427797fd7 139 writeln("the quick brown fox jumped over the lazy dog?");
bvirk 3:f36427797fd7 140 uBit.sleep(2000);
bvirk 3:f36427797fd7 141 clear();
bvirk 3:f36427797fd7 142 writeln("THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG!");
bvirk 3:f36427797fd7 143 uBit.sleep(2000);
bvirk 3:f36427797fd7 144 clear();
bvirk 3:f36427797fd7 145 write("Your magic number is ");
bvirk 3:f36427797fd7 146 write(23 * 3);
bvirk 3:f36427797fd7 147 writeln("!");
bvirk 3:f36427797fd7 148 writeln(1.4);
bvirk 3:f36427797fd7 149 writeln(12);
bvirk 3:f36427797fd7 150 uBit.sleep(2000);
bvirk 3:f36427797fd7 151 writeln(2.1);
bvirk 3:f36427797fd7 152 uBit.sleep(2000);
bvirk 3:f36427797fd7 153 writeln(3);
bvirk 3:f36427797fd7 154 /*
bvirk 3:f36427797fd7 155 basic.pause(1000)
bvirk 3:f36427797fd7 156 for (let i = 0; i < 100; i++) {
bvirk 3:f36427797fd7 157 oled.drawLoading(i)
bvirk 3:f36427797fd7 158 }
bvirk 3:f36427797fd7 159 basic.pause(1000)
bvirk 3:f36427797fd7 160 oled.clear()
bvirk 3:f36427797fd7 161 oled.drawRectangle(10, 10, 60, 60)
bvirk 3:f36427797fd7 162 oled.drawLine(0, 0, 128, 64)
bvirk 3:f36427797fd7 163 oled.drawLine(0, 64, 128, 0)
bvirk 3:f36427797fd7 164 */
bvirk 3:f36427797fd7 165 }
bvirk 3:f36427797fd7 166