Fork of nkhorman's Adafruit mbed port with added I2C support
Fork of Adafruit_GFX by
Revision 4:86b9481fa281, committed 2014-03-13
- Comitter:
- pommzorz
- Date:
- Thu Mar 13 10:47:03 2014 +0000
- Parent:
- 3:969ca9fe5e2b
- Child:
- 5:b8313591b561
- Commit message:
- Added I2C support with precompiler defines
Changed in this revision
Adafruit_SSD1306.cpp | Show annotated file Show diff for this revision Revisions of this file |
Adafruit_SSD1306.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/Adafruit_SSD1306.cpp Wed Jan 23 02:43:38 2013 +0000 +++ b/Adafruit_SSD1306.cpp Thu Mar 13 10:47:03 2014 +0000 @@ -22,8 +22,8 @@ #include "mbed.h" #include "Adafruit_SSD1306.h" - -uint8_t splashScreen[SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8] = { +#ifdef WITH_SPLASH +uint8_t splashScreen[512] = { //SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -55,51 +55,38 @@ 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x03, -0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -#if (SSD1306_LCDHEIGHT == 64) -0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x0F, -0x87, 0xC7, 0xF7, 0xFF, 0xFF, 0x1F, 0x1F, 0x3D, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0x7C, 0x7D, 0xFF, -0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x00, 0x30, 0x30, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F, -0x0F, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, -0x00, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x0E, 0xFC, 0xF8, 0x00, 0x00, 0xF0, 0xF8, 0x1C, 0x0E, -0x06, 0x06, 0x06, 0x0C, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFC, -0xFE, 0xFC, 0x00, 0x18, 0x3C, 0x7E, 0x66, 0xE6, 0xCE, 0x84, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x06, -0x06, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x06, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xC0, 0xF8, -0xFC, 0x4E, 0x46, 0x46, 0x46, 0x4E, 0x7C, 0x78, 0x40, 0x18, 0x3C, 0x76, 0xE6, 0xCE, 0xCC, 0x80, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x03, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, -0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x0C, -0x18, 0x18, 0x0C, 0x06, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x01, 0x0F, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, -0x07, 0x01, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, -0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x07, -0x07, 0x0C, 0x0C, 0x18, 0x1C, 0x0C, 0x06, 0x06, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 +}; #endif -}; +#ifdef IS_SPI Adafruit_SSD1306::Adafruit_SSD1306(SPI &spi, PinName DC, PinName RST, PinName CS) : Adafruit_GFX(SSD1306_LCDWIDTH, SSD1306_LCDHEIGHT) , rst(RST,false), cs(CS,true), dc(DC,false), mspi(spi) { - memcpy(buffer,splashScreen,sizeof(buffer)); + //memcpy(buffer,splashScreen,sizeof(buffer)); begin(); display(); }; +#elif defined IS_I2C +Adafruit_SSD1306::Adafruit_SSD1306(I2C &i2c, PinName RST) + : Adafruit_GFX(SSD1306_LCDWIDTH, SSD1306_LCDHEIGHT) + , rst(RST,false),mi2c(i2c),pc(USBTX, USBRX) +{ + + pc.baud(921600); + mi2c.frequency(100000); + pc.printf("\r\n\ninit."); + mi2c.start(); + //memcpy(buffer,splashScreen,sizeof(buffer)); + pc.printf("cp."); + begin(); + pc.printf("bg."); + display(); + pc.printf("dp\r\n"); +}; +#endif + void Adafruit_SSD1306::begin(uint8_t vccstate) { @@ -228,20 +215,40 @@ void Adafruit_SSD1306::ssd1306_command(uint8_t c) { +#ifdef IS_SPI cs = 1; dc = 0; cs = 0; mspi.write(c); cs = 1; + +#elif defined IS_I2C + char buff[2] ; + buff[0] = SSD_Command_Mode ; + buff[1] = c; + if(mi2c.write(I2C_ADDRESS,buff,sizeof(buff)))pc.printf("!"); + +#endif + } void Adafruit_SSD1306::ssd1306_data(uint8_t c) { +#ifdef IS_SPI cs = 1; dc = 1; cs = 0; mspi.write(c); cs = 1; +#elif defined IS_I2C + char buff[2] ; + // Setup D/C to switch to data mode + buff[0] = SSD_Data_Mode; + buff[1] = c; + // Write on i2c + if(mi2c.write(I2C_ADDRESS,buff,sizeof(buff)))pc.printf("?"); +#endif + } void Adafruit_SSD1306::display(void) @@ -249,7 +256,7 @@ ssd1306_command(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0 ssd1306_command(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0 ssd1306_command(SSD1306_SETSTARTLINE | 0x0); // line #0 - +#ifdef IS_SPI cs = 1; dc = 1; cs = 0; @@ -265,6 +272,22 @@ } cs = 1; + +#elif defined IS_I2C + char buff[17] ; + uint8_t x ; + // Setup D/C to switch to data mode + buff[0] = SSD_Data_Mode; + + // loop trough all OLED buffer and + // send a bunch of 16 data byte in one xmission + for (uint16_t i=0; i<(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8); i+=16 ) + { + for (x=1; x<=16; x++) + buff[x] = buffer[i+x]; + if(mi2c.write(I2C_ADDRESS, buff, 17))pc.printf("?"); + } +#endif } // clear everything
--- a/Adafruit_SSD1306.h Wed Jan 23 02:43:38 2013 +0000 +++ b/Adafruit_SSD1306.h Thu Mar 13 10:47:03 2014 +0000 @@ -43,6 +43,9 @@ -----------------------------------------------------------------------*/ //#define SSD1306_128_64 #define SSD1306_128_32 + +//#define IS_SPI +#define IS_I2C /*=========================================================================*/ #if defined SSD1306_128_64 && defined SSD1306_128_32 @@ -61,6 +64,19 @@ #define SSD1306_LCDHEIGHT 32 #endif +#if defined IS_SPI && defined IS_I2C + #error "Only one communication mode can be specified at once in SSD1306.h" +#endif +#if !defined IS_SPI && !defined IS_I2C + #error "At least one communication mode must be specified in SSD1306.h" +#endif + +//#define WITH_SPLASH +#define I2C_ADDRESS 0x78 + +#define SSD_Command_Mode 0x00 +#define SSD_Data_Mode 0x40 + #define SSD1306_SETCONTRAST 0x81 #define SSD1306_DISPLAYALLON_RESUME 0xA4 #define SSD1306_DISPLAYALLON 0xA5 @@ -98,7 +114,11 @@ class Adafruit_SSD1306 : public Adafruit_GFX { public: +#ifdef IS_SPI Adafruit_SSD1306(SPI &spi, PinName DC, PinName RST, PinName CS); +#elif defined IS_I2C + Adafruit_SSD1306(I2C &i2c, PinName RST); +#endif void begin(uint8_t switchvcc = SSD1306_SWITCHCAPVCC); void ssd1306_command(uint8_t c); void ssd1306_data(uint8_t c); @@ -110,8 +130,15 @@ virtual void drawPixel(int16_t x, int16_t y, uint16_t color); private: - DigitalOut2 rst,cs,dc; + + Serial pc; + DigitalOut2 rst; +#ifdef IS_SPI SPI &mspi; + DigitalOut2 cs,dc; +#elif defined IS_I2C + I2C &mi2c; +#endif // the memory buffer for the LCD uint8_t buffer[SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8]; };