SSD1306 Example I2C communication without library

Dependencies:   mbed

thanks to this forum https://www.ccsinfo.com/forum/viewtopic.php?t=52836

main.cpp

Committer:
kohlerba
Date:
2017-11-22
Revision:
0:cf50c95c11c5

File content as of revision 0:cf50c95c11c5:

#include "mbed.h"

#define DISPLAY_RESET   D0

#define SSD1306_LCDWIDTH      128 
#define SSD1306_LCDHEIGHT      64 
#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_COLUMNADDR 0x21 
#define SSD1306_PAGEADDR   0x22 
#define SSD1306_COMSCANINC 0xC0 
#define SSD1306_COMSCANDEC 0xC8 
#define SSD1306_SEGREMAP 0xA0 
#define SSD1306_CHARGEPUMP 0x8D 
#define SSD1306_EXTERNALVCC 0x1 
#define SSD1306_SWITCHCAPVCC 0x2

 I2C i2c(I2C_SDA, I2C_SCL);

char _i2c_address; 
char display_buffer[1024];

void ssd1306_command(char c){
    char control = 0x00;
    i2c.start();
    i2c.write(_i2c_address);
    i2c.write(control);
    i2c.write(c);
    i2c.stop();   
}

void ssd1306_data(char c){
    i2c.start();
    i2c.write(_i2c_address);
    i2c.write(0x40);
    i2c.write(c);
    i2c.stop();
}

void setColAddress() 
{ 
  ssd1306_command(SSD1306_COLUMNADDR); // 0x21 COMMAND 
  ssd1306_command(0); // Column start address 
  ssd1306_command(SSD1306_LCDWIDTH-1); // Column end address 
} 

void setPageAddress() 
{ 
  ssd1306_command(SSD1306_PAGEADDR); // 0x22 COMMAND 
  ssd1306_command(0); // Start Page address 
  ssd1306_command((SSD1306_LCDHEIGHT/8)-1);// End Page address 
} 

void TransferBuffer() 
{ 
  int j=0; 
  
      // set the Column and Page addresses to 0,0 
      setColAddress(); 
      setPageAddress(); 
        
      i2c.start(); 
      i2c.write(_i2c_address); 
      i2c.write(0X40); // data not command 
      for(j=0;j<1024;j++) 
      { 
        i2c.write(display_buffer[j]); 
      } 

      i2c.stop(); 
} 

void InitializeDisplay()
{
    DigitalOut(DISPLAY_RESET,1);
    // VDD (3.3V) goes high at start, lets just chill for a ms
    wait_ms(1);
    // bring reset low
    DigitalOut(DISPLAY_RESET,0);
    // wait 10ms
    wait_ms(10);
    // bring out of reset
    DigitalOut(DISPLAY_RESET,1);
    // turn on VCC (9V?)

// Init sequence for 128x64 OLED module 
    ssd1306_command(SSD1306_DISPLAYOFF);                    // 0xAE 

    ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV);            // 0xD5 
    ssd1306_command(0x80);                 // the suggested ratio 0x80 
    
    ssd1306_command(SSD1306_SETMULTIPLEX);                  // 0xA8 
    ssd1306_command(0x3F); 
    
    ssd1306_command(SSD1306_SETDISPLAYOFFSET);              // 0xD3 
    ssd1306_command(0x0);                                   // no offset 
    
    ssd1306_command(SSD1306_SETSTARTLINE);// | 0x0);        // line #0 
    
    ssd1306_command(SSD1306_CHARGEPUMP);                    // 0x8D 
    ssd1306_command(0x14);  // using internal VCC 
    
    ssd1306_command(SSD1306_MEMORYMODE);                    // 0x20 
    ssd1306_command(0x00);          // 0x00 horizontal addressing 
    
    ssd1306_command(SSD1306_SEGREMAP | 0x1); // rotate screen 180 
    
    ssd1306_command(SSD1306_COMSCANDEC); // rotate screen 180 
    
    ssd1306_command(SSD1306_SETCOMPINS);                    // 0xDA 
    ssd1306_command(0x12); 
    
    ssd1306_command(SSD1306_SETCONTRAST);                   // 0x81 
    ssd1306_command(0xCF); 
    
    ssd1306_command(SSD1306_SETPRECHARGE);                  // 0xd9 
    ssd1306_command(0xF1); 
    
    ssd1306_command(SSD1306_SETVCOMDETECT);                 // 0xDB 
    ssd1306_command(0x40); 
    
    ssd1306_command(SSD1306_DISPLAYALLON_RESUME);           // 0xA4 
    
    ssd1306_command(SSD1306_NORMALDISPLAY);                 // 0xA6 
  
    ssd1306_command(SSD1306_DISPLAYON);                     //switch on OLED
}

int main() {
    
    // fill buffer with something for test 
    memset( display_buffer, 0X02, 1024); // tried other values
    
    _i2c_address = 0x78;
    
    InitializeDisplay();
    
    TransferBuffer(); // try sending buffer 
    
    while(1) 
   { 
     wait_ms(1000); // keyboard code here 
     if(DigitalIn(LED1) == 0){DigitalOut(LED1,1);}
     else{DigitalOut(LED1,0);}
   } 
}