Modified library to add delay after releasing reset. This is needed because the reset signal is enabling an LDO to provide power to the display and it needs time to turn on.

Fork of Adafruit_GFX by Neal Horman

Committer:
nkhorman
Date:
Mon Jul 16 02:19:36 2012 +0000
Revision:
0:c3dcd4c4983a
Child:
4:853097cfa773
add adafruit oled 128x32 display library via spi interface.; display card reader events on the oled

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nkhorman 0:c3dcd4c4983a 1 /*********************************************************************
nkhorman 0:c3dcd4c4983a 2 This is a library for our Monochrome OLEDs based on SSD1306 drivers
nkhorman 0:c3dcd4c4983a 3
nkhorman 0:c3dcd4c4983a 4 Pick one up today in the adafruit shop!
nkhorman 0:c3dcd4c4983a 5 ------> http://www.adafruit.com/category/63_98
nkhorman 0:c3dcd4c4983a 6
nkhorman 0:c3dcd4c4983a 7 These displays use SPI to communicate, 4 or 5 pins are required to
nkhorman 0:c3dcd4c4983a 8 interface
nkhorman 0:c3dcd4c4983a 9
nkhorman 0:c3dcd4c4983a 10 Adafruit invests time and resources providing this open source code,
nkhorman 0:c3dcd4c4983a 11 please support Adafruit and open-source hardware by purchasing
nkhorman 0:c3dcd4c4983a 12 products from Adafruit!
nkhorman 0:c3dcd4c4983a 13
nkhorman 0:c3dcd4c4983a 14 Written by Limor Fried/Ladyada for Adafruit Industries.
nkhorman 0:c3dcd4c4983a 15 BSD license, check license.txt for more information
nkhorman 0:c3dcd4c4983a 16 All text above, and the splash screen below must be included in any redistribution
nkhorman 0:c3dcd4c4983a 17 *********************************************************************/
nkhorman 0:c3dcd4c4983a 18
nkhorman 0:c3dcd4c4983a 19 /*
nkhorman 0:c3dcd4c4983a 20 * Modified by Neal Horman 7/14/2012 for use in LPC1768
nkhorman 0:c3dcd4c4983a 21 */
nkhorman 0:c3dcd4c4983a 22
nkhorman 0:c3dcd4c4983a 23 #include "mbed.h"
nkhorman 0:c3dcd4c4983a 24 #include "Adafruit_SSD1306.h"
nkhorman 0:c3dcd4c4983a 25
nkhorman 0:c3dcd4c4983a 26 uint8_t splashScreen[SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8] = {
nkhorman 0:c3dcd4c4983a 27 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 28 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 29 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 30 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
nkhorman 0:c3dcd4c4983a 31 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 32 0x00, 0x80, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 33 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 34 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 35 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 36 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 37 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
nkhorman 0:c3dcd4c4983a 38 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xFF,
nkhorman 0:c3dcd4c4983a 39 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 40 0x80, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80,
nkhorman 0:c3dcd4c4983a 41 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x8C, 0x8E, 0x84, 0x00, 0x00, 0x80, 0xF8,
nkhorman 0:c3dcd4c4983a 42 0xF8, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 43 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80,
nkhorman 0:c3dcd4c4983a 44 0x00, 0xE0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 45 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xC7, 0x01, 0x01,
nkhorman 0:c3dcd4c4983a 46 0x01, 0x01, 0x83, 0xFF, 0xFF, 0x00, 0x00, 0x7C, 0xFE, 0xC7, 0x01, 0x01, 0x01, 0x01, 0x83, 0xFF,
nkhorman 0:c3dcd4c4983a 47 0xFF, 0xFF, 0x00, 0x38, 0xFE, 0xC7, 0x83, 0x01, 0x01, 0x01, 0x83, 0xC7, 0xFF, 0xFF, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 48 0x01, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x07, 0x01, 0x01, 0x01, 0x00, 0x00, 0x7F, 0xFF,
nkhorman 0:c3dcd4c4983a 49 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xFF,
nkhorman 0:c3dcd4c4983a 50 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 51 0x03, 0x0F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC7, 0xC7, 0x8F,
nkhorman 0:c3dcd4c4983a 52 0x8F, 0x9F, 0xBF, 0xFF, 0xFF, 0xC3, 0xC0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC,
nkhorman 0:c3dcd4c4983a 53 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x01, 0x03, 0x03, 0x03,
nkhorman 0:c3dcd4c4983a 54 0x03, 0x03, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01,
nkhorman 0:c3dcd4c4983a 55 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 56 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
nkhorman 0:c3dcd4c4983a 57 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x03,
nkhorman 0:c3dcd4c4983a 58 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 59 #if (SSD1306_LCDHEIGHT == 64)
nkhorman 0:c3dcd4c4983a 60 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x0F,
nkhorman 0:c3dcd4c4983a 61 0x87, 0xC7, 0xF7, 0xFF, 0xFF, 0x1F, 0x1F, 0x3D, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0x7C, 0x7D, 0xFF,
nkhorman 0:c3dcd4c4983a 62 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x00, 0x30, 0x30, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 64 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 65 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0x00,
nkhorman 0:c3dcd4c4983a 66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 67 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 68 0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F,
nkhorman 0:c3dcd4c4983a 69 0x0F, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0,
nkhorman 0:c3dcd4c4983a 70 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 71 0x00, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x0E, 0xFC, 0xF8, 0x00, 0x00, 0xF0, 0xF8, 0x1C, 0x0E,
nkhorman 0:c3dcd4c4983a 72 0x06, 0x06, 0x06, 0x0C, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFC,
nkhorman 0:c3dcd4c4983a 73 0xFE, 0xFC, 0x00, 0x18, 0x3C, 0x7E, 0x66, 0xE6, 0xCE, 0x84, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x06,
nkhorman 0:c3dcd4c4983a 74 0x06, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x06, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xC0, 0xF8,
nkhorman 0:c3dcd4c4983a 75 0xFC, 0x4E, 0x46, 0x46, 0x46, 0x4E, 0x7C, 0x78, 0x40, 0x18, 0x3C, 0x76, 0xE6, 0xCE, 0xCC, 0x80,
nkhorman 0:c3dcd4c4983a 76 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 77 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x03,
nkhorman 0:c3dcd4c4983a 78 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 79 0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x0C,
nkhorman 0:c3dcd4c4983a 80 0x18, 0x18, 0x0C, 0x06, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x01, 0x0F, 0x0E, 0x0C, 0x18, 0x0C, 0x0F,
nkhorman 0:c3dcd4c4983a 81 0x07, 0x01, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00,
nkhorman 0:c3dcd4c4983a 82 0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x07,
nkhorman 0:c3dcd4c4983a 83 0x07, 0x0C, 0x0C, 0x18, 0x1C, 0x0C, 0x06, 0x06, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07,
nkhorman 0:c3dcd4c4983a 84 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 85 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 88 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
nkhorman 0:c3dcd4c4983a 91 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
nkhorman 0:c3dcd4c4983a 92 #endif
nkhorman 0:c3dcd4c4983a 93 };
nkhorman 0:c3dcd4c4983a 94
nkhorman 0:c3dcd4c4983a 95 Adafruit_SSD1306::Adafruit_SSD1306(SPI &spi, PinName DC, PinName RST, PinName CS)
nkhorman 0:c3dcd4c4983a 96 : Adafruit_GFX(SSD1306_LCDWIDTH, SSD1306_LCDHEIGHT)
nkhorman 0:c3dcd4c4983a 97 , rst(RST,false), cs(CS,true), dc(DC,false), mspi(spi)
nkhorman 0:c3dcd4c4983a 98 {
nkhorman 0:c3dcd4c4983a 99 memcpy(buffer,splashScreen,sizeof(buffer));
nkhorman 0:c3dcd4c4983a 100 begin();
nkhorman 0:c3dcd4c4983a 101 display();
nkhorman 0:c3dcd4c4983a 102 };
nkhorman 0:c3dcd4c4983a 103
nkhorman 0:c3dcd4c4983a 104 void Adafruit_SSD1306::begin(uint8_t vccstate)
nkhorman 0:c3dcd4c4983a 105 {
nkhorman 0:c3dcd4c4983a 106 rst = 1;
nkhorman 0:c3dcd4c4983a 107 // VDD (3.3V) goes high at start, lets just chill for a ms
nkhorman 0:c3dcd4c4983a 108 wait_ms(1);
nkhorman 0:c3dcd4c4983a 109 // bring reset low
nkhorman 0:c3dcd4c4983a 110 rst = 0;
nkhorman 0:c3dcd4c4983a 111 // wait 10ms
nkhorman 0:c3dcd4c4983a 112 wait_ms(10);
nkhorman 0:c3dcd4c4983a 113 // bring out of reset
nkhorman 0:c3dcd4c4983a 114 rst = 1;
nkhorman 0:c3dcd4c4983a 115 // turn on VCC (9V?)
nkhorman 0:c3dcd4c4983a 116
nkhorman 0:c3dcd4c4983a 117 #if defined SSD1306_128_32
nkhorman 0:c3dcd4c4983a 118 // Init sequence for 128x32 OLED module
nkhorman 0:c3dcd4c4983a 119 ssd1306_command(SSD1306_DISPLAYOFF); // 0xAE
nkhorman 0:c3dcd4c4983a 120 ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5
nkhorman 0:c3dcd4c4983a 121 ssd1306_command(0x80); // the suggested ratio 0x80
nkhorman 0:c3dcd4c4983a 122 ssd1306_command(SSD1306_SETMULTIPLEX); // 0xA8
nkhorman 0:c3dcd4c4983a 123 ssd1306_command(0x1F);
nkhorman 0:c3dcd4c4983a 124 ssd1306_command(SSD1306_SETDISPLAYOFFSET); // 0xD3
nkhorman 0:c3dcd4c4983a 125 ssd1306_command(0x0); // no offset
nkhorman 0:c3dcd4c4983a 126 ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0
nkhorman 0:c3dcd4c4983a 127 ssd1306_command(SSD1306_CHARGEPUMP); // 0x8D
nkhorman 0:c3dcd4c4983a 128 if (vccstate == SSD1306_EXTERNALVCC)
nkhorman 0:c3dcd4c4983a 129 { ssd1306_command(0x10); }
nkhorman 0:c3dcd4c4983a 130 else
nkhorman 0:c3dcd4c4983a 131 { ssd1306_command(0x14); }
nkhorman 0:c3dcd4c4983a 132 ssd1306_command(SSD1306_MEMORYMODE); // 0x20
nkhorman 0:c3dcd4c4983a 133 ssd1306_command(0x00); // 0x0 act like ks0108
nkhorman 0:c3dcd4c4983a 134 ssd1306_command(SSD1306_SEGREMAP | 0x1);
nkhorman 0:c3dcd4c4983a 135 ssd1306_command(SSD1306_COMSCANDEC);
nkhorman 0:c3dcd4c4983a 136 ssd1306_command(SSD1306_SETCOMPINS); // 0xDA
nkhorman 0:c3dcd4c4983a 137 ssd1306_command(0x02);
nkhorman 0:c3dcd4c4983a 138 ssd1306_command(SSD1306_SETCONTRAST); // 0x81
nkhorman 0:c3dcd4c4983a 139 ssd1306_command(0x8F);
nkhorman 0:c3dcd4c4983a 140 ssd1306_command(SSD1306_SETPRECHARGE); // 0xd9
nkhorman 0:c3dcd4c4983a 141 if (vccstate == SSD1306_EXTERNALVCC)
nkhorman 0:c3dcd4c4983a 142 { ssd1306_command(0x22); }
nkhorman 0:c3dcd4c4983a 143 else
nkhorman 0:c3dcd4c4983a 144 { ssd1306_command(0xF1); }
nkhorman 0:c3dcd4c4983a 145 ssd1306_command(SSD1306_SETVCOMDETECT); // 0xDB
nkhorman 0:c3dcd4c4983a 146 ssd1306_command(0x40);
nkhorman 0:c3dcd4c4983a 147 ssd1306_command(SSD1306_DISPLAYALLON_RESUME); // 0xA4
nkhorman 0:c3dcd4c4983a 148 ssd1306_command(SSD1306_NORMALDISPLAY); // 0xA6
nkhorman 0:c3dcd4c4983a 149 #endif
nkhorman 0:c3dcd4c4983a 150
nkhorman 0:c3dcd4c4983a 151 #if defined SSD1306_128_64
nkhorman 0:c3dcd4c4983a 152 // Init sequence for 128x64 OLED module
nkhorman 0:c3dcd4c4983a 153 ssd1306_command(SSD1306_DISPLAYOFF); // 0xAE
nkhorman 0:c3dcd4c4983a 154 ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5
nkhorman 0:c3dcd4c4983a 155 ssd1306_command(0x80); // the suggested ratio 0x80
nkhorman 0:c3dcd4c4983a 156 ssd1306_command(SSD1306_SETMULTIPLEX); // 0xA8
nkhorman 0:c3dcd4c4983a 157 ssd1306_command(0x3F);
nkhorman 0:c3dcd4c4983a 158 ssd1306_command(SSD1306_SETDISPLAYOFFSET); // 0xD3
nkhorman 0:c3dcd4c4983a 159 ssd1306_command(0x0); // no offset
nkhorman 0:c3dcd4c4983a 160 ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0
nkhorman 0:c3dcd4c4983a 161 ssd1306_command(SSD1306_CHARGEPUMP); // 0x8D
nkhorman 0:c3dcd4c4983a 162 if (vccstate == SSD1306_EXTERNALVCC)
nkhorman 0:c3dcd4c4983a 163 { ssd1306_command(0x10); }
nkhorman 0:c3dcd4c4983a 164 else
nkhorman 0:c3dcd4c4983a 165 { ssd1306_command(0x14); }
nkhorman 0:c3dcd4c4983a 166 ssd1306_command(SSD1306_MEMORYMODE); // 0x20
nkhorman 0:c3dcd4c4983a 167 ssd1306_command(0x00); // 0x0 act like ks0108
nkhorman 0:c3dcd4c4983a 168 ssd1306_command(SSD1306_SEGREMAP | 0x1);
nkhorman 0:c3dcd4c4983a 169 ssd1306_command(SSD1306_COMSCANDEC);
nkhorman 0:c3dcd4c4983a 170 ssd1306_command(SSD1306_SETCOMPINS); // 0xDA
nkhorman 0:c3dcd4c4983a 171 ssd1306_command(0x12);
nkhorman 0:c3dcd4c4983a 172 ssd1306_command(SSD1306_SETCONTRAST); // 0x81
nkhorman 0:c3dcd4c4983a 173 if (vccstate == SSD1306_EXTERNALVCC)
nkhorman 0:c3dcd4c4983a 174 { ssd1306_command(0x9F); }
nkhorman 0:c3dcd4c4983a 175 else
nkhorman 0:c3dcd4c4983a 176 { ssd1306_command(0xCF); }
nkhorman 0:c3dcd4c4983a 177 ssd1306_command(SSD1306_SETPRECHARGE); // 0xd9
nkhorman 0:c3dcd4c4983a 178 if (vccstate == SSD1306_EXTERNALVCC)
nkhorman 0:c3dcd4c4983a 179 { ssd1306_command(0x22); }
nkhorman 0:c3dcd4c4983a 180 else
nkhorman 0:c3dcd4c4983a 181 { ssd1306_command(0xF1); }
nkhorman 0:c3dcd4c4983a 182 ssd1306_command(SSD1306_SETVCOMDETECT); // 0xDB
nkhorman 0:c3dcd4c4983a 183 ssd1306_command(0x40);
nkhorman 0:c3dcd4c4983a 184 ssd1306_command(SSD1306_DISPLAYALLON_RESUME); // 0xA4
nkhorman 0:c3dcd4c4983a 185 ssd1306_command(SSD1306_NORMALDISPLAY); // 0xA6
nkhorman 0:c3dcd4c4983a 186 #endif
nkhorman 0:c3dcd4c4983a 187
nkhorman 0:c3dcd4c4983a 188 ssd1306_command(SSD1306_DISPLAYON);//--turn on oled panel
nkhorman 0:c3dcd4c4983a 189 }
nkhorman 0:c3dcd4c4983a 190
nkhorman 0:c3dcd4c4983a 191 // the most basic function, set a single pixel
nkhorman 0:c3dcd4c4983a 192 void Adafruit_SSD1306::drawPixel(int16_t x, int16_t y, uint16_t color)
nkhorman 0:c3dcd4c4983a 193 {
nkhorman 0:c3dcd4c4983a 194 if ((x < 0) || (x >= width()) || (y < 0) || (y >= height()))
nkhorman 0:c3dcd4c4983a 195 return;
nkhorman 0:c3dcd4c4983a 196
nkhorman 0:c3dcd4c4983a 197 // check rotation, move pixel around if necessary
nkhorman 0:c3dcd4c4983a 198 switch (getRotation())
nkhorman 0:c3dcd4c4983a 199 {
nkhorman 0:c3dcd4c4983a 200 case 1:
nkhorman 0:c3dcd4c4983a 201 swap(x, y);
nkhorman 0:c3dcd4c4983a 202 x = _rawWidth - x - 1;
nkhorman 0:c3dcd4c4983a 203 break;
nkhorman 0:c3dcd4c4983a 204 case 2:
nkhorman 0:c3dcd4c4983a 205 x = _rawWidth - x - 1;
nkhorman 0:c3dcd4c4983a 206 y = _rawHeight - y - 1;
nkhorman 0:c3dcd4c4983a 207 break;
nkhorman 0:c3dcd4c4983a 208 case 3:
nkhorman 0:c3dcd4c4983a 209 swap(x, y);
nkhorman 0:c3dcd4c4983a 210 y = _rawHeight - y - 1;
nkhorman 0:c3dcd4c4983a 211 break;
nkhorman 0:c3dcd4c4983a 212 }
nkhorman 0:c3dcd4c4983a 213
nkhorman 0:c3dcd4c4983a 214 // x is which column
nkhorman 0:c3dcd4c4983a 215 if (color == WHITE)
nkhorman 0:c3dcd4c4983a 216 buffer[x+ (y/8)*SSD1306_LCDWIDTH] |= _BV((y%8));
nkhorman 0:c3dcd4c4983a 217 else
nkhorman 0:c3dcd4c4983a 218 buffer[x+ (y/8)*SSD1306_LCDWIDTH] &= ~_BV((y%8));
nkhorman 0:c3dcd4c4983a 219 }
nkhorman 0:c3dcd4c4983a 220
nkhorman 0:c3dcd4c4983a 221 void Adafruit_SSD1306::invertDisplay(bool i)
nkhorman 0:c3dcd4c4983a 222 {
nkhorman 0:c3dcd4c4983a 223 if (i)
nkhorman 0:c3dcd4c4983a 224 ssd1306_command(SSD1306_INVERTDISPLAY);
nkhorman 0:c3dcd4c4983a 225 else
nkhorman 0:c3dcd4c4983a 226 ssd1306_command(SSD1306_NORMALDISPLAY);
nkhorman 0:c3dcd4c4983a 227 }
nkhorman 0:c3dcd4c4983a 228
nkhorman 0:c3dcd4c4983a 229 void Adafruit_SSD1306::ssd1306_command(uint8_t c)
nkhorman 0:c3dcd4c4983a 230 {
nkhorman 0:c3dcd4c4983a 231 cs = 1;
nkhorman 0:c3dcd4c4983a 232 dc = 0;
nkhorman 0:c3dcd4c4983a 233 cs = 0;
nkhorman 0:c3dcd4c4983a 234 mspi.write(c);
nkhorman 0:c3dcd4c4983a 235 cs = 1;
nkhorman 0:c3dcd4c4983a 236 }
nkhorman 0:c3dcd4c4983a 237
nkhorman 0:c3dcd4c4983a 238 void Adafruit_SSD1306::ssd1306_data(uint8_t c)
nkhorman 0:c3dcd4c4983a 239 {
nkhorman 0:c3dcd4c4983a 240 cs = 1;
nkhorman 0:c3dcd4c4983a 241 dc = 1;
nkhorman 0:c3dcd4c4983a 242 cs = 0;
nkhorman 0:c3dcd4c4983a 243 mspi.write(c);
nkhorman 0:c3dcd4c4983a 244 cs = 1;
nkhorman 0:c3dcd4c4983a 245 }
nkhorman 0:c3dcd4c4983a 246
nkhorman 0:c3dcd4c4983a 247 void Adafruit_SSD1306::display(void)
nkhorman 0:c3dcd4c4983a 248 {
nkhorman 0:c3dcd4c4983a 249 ssd1306_command(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0
nkhorman 0:c3dcd4c4983a 250 ssd1306_command(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0
nkhorman 0:c3dcd4c4983a 251 ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0
nkhorman 0:c3dcd4c4983a 252
nkhorman 0:c3dcd4c4983a 253 cs = 1;
nkhorman 0:c3dcd4c4983a 254 dc = 1;
nkhorman 0:c3dcd4c4983a 255 cs = 0;
nkhorman 0:c3dcd4c4983a 256
nkhorman 0:c3dcd4c4983a 257 for (uint16_t i=0; i<(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8); i++)
nkhorman 0:c3dcd4c4983a 258 mspi.write(buffer[i]);
nkhorman 0:c3dcd4c4983a 259
nkhorman 0:c3dcd4c4983a 260 // i wonder why we have to do this (check datasheet)
nkhorman 0:c3dcd4c4983a 261 if (SSD1306_LCDHEIGHT == 32)
nkhorman 0:c3dcd4c4983a 262 {
nkhorman 0:c3dcd4c4983a 263 for (uint16_t i=0; i<(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8); i++)
nkhorman 0:c3dcd4c4983a 264 mspi.write(0);
nkhorman 0:c3dcd4c4983a 265 }
nkhorman 0:c3dcd4c4983a 266
nkhorman 0:c3dcd4c4983a 267 cs = 1;
nkhorman 0:c3dcd4c4983a 268 }
nkhorman 0:c3dcd4c4983a 269
nkhorman 0:c3dcd4c4983a 270 // clear everything
nkhorman 0:c3dcd4c4983a 271 void Adafruit_SSD1306::clearDisplay(void)
nkhorman 0:c3dcd4c4983a 272 {
nkhorman 0:c3dcd4c4983a 273 memset(buffer,0,sizeof(buffer));
nkhorman 0:c3dcd4c4983a 274 }