Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: SSD1306_mini/SSD1306_mini.cpp
- Revision:
- 4:3618abce1646
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SSD1306_mini/SSD1306_mini.cpp Thu Apr 21 13:19:41 2022 +0000
@@ -0,0 +1,135 @@
+/*********************************************************************
+This is a library for our Monochrome OLEDs based on SSD1306 drivers
+
+ Pick one up today in the adafruit shop!
+ ------> http://www.adafruit.com/category/63_98
+
+These displays use SPI to communicate, 4 or 5 pins are required to
+interface
+
+Adafruit invests time and resources providing this open source code,
+please support Adafruit and open-source hardware by purchasing
+products from Adafruit!
+
+Written by Limor Fried/Ladyada for Adafruit Industries.
+BSD license, check license.txt for more information
+All text above, and the splash screen below must be included in any redistribution
+*********************************************************************/
+
+/*
+ * Modified by Neal Horman 7/14/2012 for use in mbed
+ * Modified by Jiri Stepanovsky 6/4/2018 for LPE compatibility
+ */
+
+#include "mbed.h"
+#include "SSD1306_mini.h"
+
+#define SSD1306_SETCONTRAST 0x81
+#define SSD1306_DISPLAYALLON_RESUME 0xA4
+#define SSD1306_DISPLAYALLON 0xA5
+#define SSD1306_NORMALDISPLAY 0xA6
+#define SSD1306_INVERTDISPLAY 0xA7
+#define SSD1306_DISPLAYOFF 0xAE
+#define SSD1306_DISPLAYON 0xAF
+#define SSD1306_SETDISPLAYOFFSET 0xD3
+#define SSD1306_SETCOMPINS 0xDA
+#define SSD1306_SETVCOMDETECT 0xDB
+#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
+#define SSD1306_SETPRECHARGE 0xD9
+#define SSD1306_SETMULTIPLEX 0xA8
+#define SSD1306_SETLOWCOLUMN 0x00
+#define SSD1306_SETHIGHCOLUMN 0x10
+#define SSD1306_SETSTARTLINE 0x40
+#define SSD1306_MEMORYMODE 0x20
+#define SSD1306_COMSCANINC 0xC0
+#define SSD1306_COMSCANDEC 0xC8
+#define SSD1306_SEGREMAP 0xA0
+#define SSD1306_CHARGEPUMP 0x8D
+
+void SSD1306_mini::begin(uint8_t vccstate)
+{
+ rst = 1;
+ // VDD (3.3V) goes high at start, lets just chill for a ms
+ wait_ms(1);
+ // bring reset low
+ rst = 0;
+ // wait 10ms
+ wait_ms(10);
+ // bring out of reset
+ rst = 1;
+ // turn on VCC (9V?)
+
+ command(SSD1306_DISPLAYOFF);
+ command(SSD1306_SETDISPLAYCLOCKDIV);
+ command(0x80); // the suggested ratio 0x80
+
+ command(SSD1306_SETMULTIPLEX);
+ command(OLED_HEIGHT-1);
+
+ command(SSD1306_SETDISPLAYOFFSET);
+ command(0x0); // no offset
+
+ command(SSD1306_SETSTARTLINE | 0x0); // line #0
+
+ command(SSD1306_CHARGEPUMP);
+ command((vccstate == SSD1306_EXTERNALVCC) ? 0x10 : 0x14);
+
+ command(SSD1306_MEMORYMODE);
+ command(0x00); // 0x0 act like ks0108
+
+ command(SSD1306_SEGREMAP | 0x1);
+
+ command(SSD1306_COMSCANDEC);
+
+ command(SSD1306_SETCOMPINS);
+ command(OLED_HEIGHT == 32 ? 0x02 : 0x12); // TODO - calculate based on _rawHieght ?
+
+ command(SSD1306_SETCONTRAST);
+ command(OLED_HEIGHT == 32 ? 0x8F : ((vccstate == SSD1306_EXTERNALVCC) ? 0x9F : 0xCF) );
+
+ command(SSD1306_SETPRECHARGE);
+ command((vccstate == SSD1306_EXTERNALVCC) ? 0x22 : 0xF1);
+
+ command(SSD1306_SETVCOMDETECT);
+ command(0x40);
+
+ command(SSD1306_DISPLAYALLON_RESUME);
+
+ command(SSD1306_NORMALDISPLAY);
+
+ command(SSD1306_DISPLAYON);
+}
+
+// Set a single pixel
+void SSD1306_mini::drawPixel(int16_t x, int16_t y, uint16_t color)
+{
+ if ((x < 0) || (x >= OLED_WIDTH) || (y < 0) || (y >= OLED_HEIGHT))
+ return;
+ // x is which column
+ if (color == WHITE)
+ buffer[x+ (y/8)*OLED_WIDTH] |= 1<<(y%8);
+ else // else black
+ buffer[x+ (y/8)*OLED_WIDTH] &= ~(1<<(y%8));
+}
+
+void SSD1306_mini::invertDisplay(bool i)
+{
+ command(i ? SSD1306_INVERTDISPLAY : SSD1306_NORMALDISPLAY);
+}
+
+// Send the display buffer out to the display
+void SSD1306_mini::display(void)
+{
+ command(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0
+ command(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0
+ command(SSD1306_SETSTARTLINE | 0x0); // line #0
+ sendDisplayBuffer();
+}
+
+// Clear the display buffer. Requires a display() call at some point afterwards
+void SSD1306_mini::clearDisplay(void)
+{
+ for(uint16_t i=0, q=OLED_BUFFER_SIZE; i<q; i++)
+ buffer[i] = 0;
+}
+