displaying on SSD1306, 128x64 pixels OLED

Dependencies:   microbit

Committer:
bvirk
Date:
Tue Feb 25 20:59:35 2020 +0000
Revision:
12:b4d5e007640e
Parent:
11:77aaf68a180b
doc removed from cpp files

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 "OLED.h"
bvirk 4:19da6ea94042 6 #include "cppNorm.h"
bvirk 4:19da6ea94042 7
bvirk 3:f36427797fd7 8 OLED::OLED() :
bvirk 3:f36427797fd7 9 i2c(I2C_SDA0,I2C_SCL0)
bvirk 3:f36427797fd7 10 ,charX(0)
bvirk 3:f36427797fd7 11 ,charY(0)
bvirk 3:f36427797fd7 12 ,displayWidth(128)
bvirk 3:f36427797fd7 13 ,displayHeight(64 / 8)
bvirk 4:19da6ea94042 14 ,screenSize(0)
bvirk 4:19da6ea94042 15 ,pendingNewline(false)
bvirk 4:19da6ea94042 16 {}
bvirk 3:f36427797fd7 17
bvirk 3:f36427797fd7 18 void OLED::command(uint8_t cmd) {
bvirk 3:f36427797fd7 19 char buf[2];
bvirk 3:f36427797fd7 20 buf[0] = '\0';
bvirk 3:f36427797fd7 21 buf[1] = cmd;
bvirk 3:f36427797fd7 22 i2c.write(chipAdress,buf,2);
bvirk 3:f36427797fd7 23 }
bvirk 8:5972683a7190 24
bvirk 4:19da6ea94042 25 void OLED::init() {
bvirk 4:19da6ea94042 26 init(128, 64);
bvirk 4:19da6ea94042 27 }
bvirk 4:19da6ea94042 28
bvirk 3:f36427797fd7 29
bvirk 3:f36427797fd7 30 void OLED::init(uint8_t width, uint8_t height) {
bvirk 3:f36427797fd7 31 command(SSD1306_DISPLAYOFF);
bvirk 3:f36427797fd7 32 command(SSD1306_SETDISPLAYCLOCKDIV);
bvirk 3:f36427797fd7 33 command(0x80); // the suggested ratio 0x80
bvirk 3:f36427797fd7 34 command(SSD1306_SETMULTIPLEX);
bvirk 3:f36427797fd7 35 command(0x3F);
bvirk 3:f36427797fd7 36 command(SSD1306_SETDISPLAYOFFSET);
bvirk 3:f36427797fd7 37 command(0x0); // no offset
bvirk 3:f36427797fd7 38 command(SSD1306_SETSTARTLINE | 0x0); // line #0
bvirk 3:f36427797fd7 39 command(SSD1306_CHARGEPUMP);
bvirk 3:f36427797fd7 40 command(0x14);
bvirk 3:f36427797fd7 41 command(SSD1306_MEMORYMODE);
bvirk 3:f36427797fd7 42 command(0x00); // 0x0 act like ks0108
bvirk 3:f36427797fd7 43 command(SSD1306_SEGREMAP | 0x1);
bvirk 3:f36427797fd7 44 command(SSD1306_COMSCANDEC);
bvirk 3:f36427797fd7 45 command(SSD1306_SETCOMPINS);
bvirk 3:f36427797fd7 46 command(0x12);
bvirk 3:f36427797fd7 47 command(SSD1306_SETCONTRAST);
bvirk 3:f36427797fd7 48 command(0xCF);
bvirk 3:f36427797fd7 49 command(SSD1306_SETPRECHARGE);
bvirk 3:f36427797fd7 50 command(0xF1);
bvirk 3:f36427797fd7 51 command(SSD1306_SETVCOMDETECT);
bvirk 3:f36427797fd7 52 command(0x40);
bvirk 3:f36427797fd7 53 command(SSD1306_DISPLAYALLON_RESUME);
bvirk 3:f36427797fd7 54 command(SSD1306_NORMALDISPLAY);
bvirk 3:f36427797fd7 55 command(SSD1306_DISPLAYON);
bvirk 3:f36427797fd7 56 displayWidth = width;
bvirk 3:f36427797fd7 57 displayHeight = height / 8;
bvirk 3:f36427797fd7 58 screenSize = displayWidth * displayHeight;
bvirk 3:f36427797fd7 59 charX = xOffset;
bvirk 3:f36427797fd7 60 charY = yOffset;
bvirk 3:f36427797fd7 61 loadStarted = false;
bvirk 3:f36427797fd7 62 loadPercent = 0;
bvirk 3:f36427797fd7 63 clear();
bvirk 3:f36427797fd7 64 }
bvirk 3:f36427797fd7 65
bvirk 3:f36427797fd7 66 void OLED::clear() {
bvirk 3:f36427797fd7 67 loadStarted = false;
bvirk 3:f36427797fd7 68 loadPercent = 0;
bvirk 3:f36427797fd7 69 command(SSD1306_SETCOLUMNADRESS);
bvirk 3:f36427797fd7 70 command(0x00);
bvirk 3:f36427797fd7 71 command(displayWidth - 1);
bvirk 3:f36427797fd7 72 command(SSD1306_SETPAGEADRESS);
bvirk 3:f36427797fd7 73 command(0x00);
bvirk 3:f36427797fd7 74 command(displayHeight - 1);
bvirk 3:f36427797fd7 75 char data[17];
bvirk 8:5972683a7190 76 data[0] = 0x40;
bvirk 3:f36427797fd7 77 for (int8_t i = 1; i < 17; i++)
bvirk 3:f36427797fd7 78 data[i] = 0x00;
bvirk 3:f36427797fd7 79 for (int16_t i = 0; i < screenSize; i += 16) {
bvirk 3:f36427797fd7 80 i2c.write(chipAdress, data, 17,false);
bvirk 3:f36427797fd7 81 }
bvirk 3:f36427797fd7 82 charX = xOffset;
bvirk 3:f36427797fd7 83 charY = yOffset;
bvirk 4:19da6ea94042 84 setTextArea(32,true);
bvirk 3:f36427797fd7 85 }
bvirk 3:f36427797fd7 86
bvirk 3:f36427797fd7 87 void OLED::drawChar(uint8_t x, uint8_t y, uint8_t chr ) {
bvirk 3:f36427797fd7 88 command(SSD1306_SETCOLUMNADRESS);
bvirk 3:f36427797fd7 89 command(x);
bvirk 3:f36427797fd7 90 command(x + 5);
bvirk 3:f36427797fd7 91 command(SSD1306_SETPAGEADRESS);
bvirk 3:f36427797fd7 92 command(y);
bvirk 3:f36427797fd7 93 command(y + 1);
bvirk 4:19da6ea94042 94 textArea[x/6][y]=chr;
bvirk 3:f36427797fd7 95 char line[2];
bvirk 3:f36427797fd7 96 line[0] = 0x40;
bvirk 3:f36427797fd7 97 for (int8_t i = 0; i < 6; i++) {
bvirk 3:f36427797fd7 98 if (i == 5)
bvirk 3:f36427797fd7 99 line[1] = 0x00;
bvirk 3:f36427797fd7 100 else
bvirk 3:f36427797fd7 101 line[1] = font[chr][i];
bvirk 3:f36427797fd7 102 i2c.write(chipAdress, line, 2, false);
bvirk 3:f36427797fd7 103 }
bvirk 3:f36427797fd7 104 }
bvirk 3:f36427797fd7 105
bvirk 4:19da6ea94042 106
bvirk 4:19da6ea94042 107 void OLED::setTextArea(uint8_t chr, bool setLine8=false) {
bvirk 4:19da6ea94042 108 for (int8_t line = 0; line <= 8; line++)
bvirk 4:19da6ea94042 109 if (line < 8 || setLine8)
bvirk 4:19da6ea94042 110 for (int8_t xPos = 0; xPos < 22; xPos++)
bvirk 4:19da6ea94042 111 textArea[xPos][line]=chr;
bvirk 4:19da6ea94042 112 }
bvirk 4:19da6ea94042 113
bvirk 4:19da6ea94042 114 void OLED::scroll() {
bvirk 4:19da6ea94042 115 for (int8_t line = 1; line <= 8; line++)
bvirk 4:19da6ea94042 116 for (int8_t xPos = 0; xPos < 22; xPos++)
bvirk 4:19da6ea94042 117 drawChar(6*xPos,line-1,textArea[xPos][line]);
bvirk 4:19da6ea94042 118 }
bvirk 4:19da6ea94042 119
bvirk 4:19da6ea94042 120 void OLED::newLine() {
bvirk 4:19da6ea94042 121 charY++;
bvirk 4:19da6ea94042 122 charX = xOffset;
bvirk 4:19da6ea94042 123 if (charY == 8) {
bvirk 4:19da6ea94042 124 charY = 7;
bvirk 4:19da6ea94042 125 scroll();
bvirk 4:19da6ea94042 126 }
bvirk 4:19da6ea94042 127 pendingNewline=false;
bvirk 4:19da6ea94042 128 }
bvirk 4:19da6ea94042 129
bvirk 6:c69f08f464b5 130 void OLED::puts(string str) {
bvirk 3:f36427797fd7 131 for (uint16_t i = 0; i < str.length(); i++) {
bvirk 6:c69f08f464b5 132 if (str.charAt(i) == '\r')
bvirk 4:19da6ea94042 133 charX = xOffset;
bvirk 6:c69f08f464b5 134 else if (str.charAt(i) == '\n') {
bvirk 6:c69f08f464b5 135 if (pendingNewline)
bvirk 6:c69f08f464b5 136 newLine();
bvirk 6:c69f08f464b5 137 pendingNewline=true;
bvirk 6:c69f08f464b5 138 } else {
bvirk 6:c69f08f464b5 139 if (pendingNewline || charX > displayWidth - 6)
bvirk 6:c69f08f464b5 140 newLine();
bvirk 6:c69f08f464b5 141 drawChar(charX, charY, (uint8_t)str.charAt(i));
bvirk 6:c69f08f464b5 142 charX += 6;
bvirk 3:f36427797fd7 143 }
bvirk 3:f36427797fd7 144 }
bvirk 3:f36427797fd7 145 }
bvirk 4:19da6ea94042 146
bvirk 6:c69f08f464b5 147 uint8_t OLED::printf(const char * fmt, ...) {
bvirk 6:c69f08f464b5 148 va_list args;
bvirk 6:c69f08f464b5 149 va_start(args, fmt);
bvirk 6:c69f08f464b5 150 uint8_t len = min(vsnprintf(printf_text, printf_textSize, fmt, args), printf_textSize);
bvirk 6:c69f08f464b5 151 va_end(args);
bvirk 6:c69f08f464b5 152 printf_text[len] = '\0';
bvirk 6:c69f08f464b5 153 puts(printf_text);
bvirk 6:c69f08f464b5 154 return len;
bvirk 4:19da6ea94042 155 }