From aea7eb169e8e58a76ae54e8c1715c48712049861 Mon Sep 17 00:00:00 2001
From: Daniel Eichhorn <dani.eichhorn@squix.ch>
Date: Sat, 5 Dec 2015 22:24:38 +0100
Subject: [PATCH] Fixed issue #2 with screen misalignment after mcu reset

---
 ssd1306_i2c.cpp | 73 +++++++++++++++++++++----------------------------
 ssd1306_i2c.h   | 27 ++++++++++++++++++
 2 files changed, 58 insertions(+), 42 deletions(-)

diff --git a/ssd1306_i2c.cpp b/ssd1306_i2c.cpp
index 119f0f5..77f4866 100644
--- a/ssd1306_i2c.cpp
+++ b/ssd1306_i2c.cpp
@@ -80,6 +80,13 @@ void SSD1306::clear(void) {
 }
 
 void SSD1306::display(void) {
+    sendCommand(COLUMNADDR);
+    sendCommand(0x0);
+    sendCommand(0x7F);
+
+    sendCommand(PAGEADDR);
+    sendCommand(0x0);
+    sendCommand(0x7);
 
     for (uint16_t i=0; i<(128*64/8); i++) {
       // send a bunch of data in one xmission
@@ -292,52 +299,34 @@ void SSD1306::sendCommand(unsigned char com)
 
 void SSD1306::sendInitCommands(void)
 {
-  // Init sequence from https://github.com/adafruit/Adafruit_SSD1306/blob/master/Adafruit_SSD1306.cpp
-  sendCommand(0xae);		        //display off
-  sendCommand(0xa6);            //Set Normal Display (default)
-                                // Init sequence for 128x64 OLED module
-  sendCommand(0xAE);            //DISPLAYOFF
-  sendCommand(0xD5);            //SETDISPLAYCLOCKDIV
-  sendCommand(0x80);            // the suggested ratio 0x80
-  sendCommand(0xA8);            //SSD1306_SETMULTIPLEX
+
+  sendCommand(DISPLAYOFF);
+  sendCommand(NORMALDISPLAY);
+  sendCommand(SETDISPLAYCLOCKDIV);
+  sendCommand(0x80);
+  sendCommand(SETMULTIPLEX);
   sendCommand(0x3F);
-  sendCommand(0xD3);            //SETDISPLAYOFFSET
-  sendCommand(0x0);             //no offset
-  sendCommand(0x40 | 0x0);      //SETSTARTLINE
-  sendCommand(0x8D);            //CHARGEPUMP
+  sendCommand(SETDISPLAYOFFSET);
+  sendCommand(0x00);
+  sendCommand(SETSTARTLINE | 0x00);
+  sendCommand(CHARGEPUMP);
   sendCommand(0x14);
-  sendCommand(0x20);             //MEMORYMODE
-  sendCommand(0x00);             //0x0 act like ks0108
-  
-  //sendCommand(0xA0 | 0x1);      //SEGREMAP   //Rotate screen 180 deg
-  sendCommand(0xA0);
-  
-  //sendCommand(0xC8);            //COMSCANDEC  Rotate screen 180 Deg
-  sendCommand(0xC0);
-  
-  sendCommand(0xDA);            //0xDA
-  sendCommand(0x12);           //COMSCANDEC
-  sendCommand(0x81);           //SETCONTRAS
-  sendCommand(0xCF);           //
-  sendCommand(0xd9);          //SETPRECHARGE 
-  sendCommand(0xF1); 
-  sendCommand(0xDB);        //SETVCOMDETECT                
+  sendCommand(MEMORYMODE);
+  sendCommand(0x00);
+  sendCommand(SEGREMAP);
+  sendCommand(COMSCANINC);
+  sendCommand(SETCOMPINS);
+  sendCommand(0x12);
+  sendCommand(SETCONTRAST);
+  sendCommand(0xCF);
+  sendCommand(SETPRECHARGE);
+  sendCommand(0xF1);
+  sendCommand(SETVCOMDETECT);
   sendCommand(0x40);
-  sendCommand(0xA4);        //DISPLAYALLON_RESUME        
-  sendCommand(0xA6);        //NORMALDISPLAY             
-
+  sendCommand(DISPLAYALLON_RESUME);
+  sendCommand(NORMALDISPLAY);
   sendCommand(0x2e);            // stop scroll
-  //----------------------------REVERSE comments----------------------------//
-  //  sendCommand(0xa0);		//seg re-map 0->127(default)
-  //  sendCommand(0xa1);		//seg re-map 127->0
-  //  sendCommand(0xc8);
-  //  delay(1000);
-  //----------------------------REVERSE comments----------------------------//
-  // sendCommand(0xa7);  //Set Inverse Display  
-  // sendCommand(0xae);		//display off
-  sendCommand(0x20);            //Set Memory Addressing Mode
-  sendCommand(0x00);            //Set Memory Addressing Mode ab Horizontal addressing mode
-  //sendCommand(0x02);         // Set Memory Addressing Mode ab Page addressing mode(RESET)  
+  sendCommand(DISPLAYON);
   
 }
 
diff --git a/ssd1306_i2c.h b/ssd1306_i2c.h
index e1f02c2..59cbb74 100644
--- a/ssd1306_i2c.h
+++ b/ssd1306_i2c.h
@@ -54,6 +54,33 @@ const char inactive_bits[] PROGMEM = {
 #define TEXT_ALIGN_CENTER 1
 #define TEXT_ALIGN_RIGHT 2
 
+#define CHARGEPUMP 0x8D
+#define COLUMNADDR 0x21
+#define COMSCANDEC 0xC8
+#define COMSCANINC 0xC0
+#define DISPLAYALLON 0xA5
+#define DISPLAYALLON_RESUME 0xA4
+#define DISPLAYOFF 0xAE
+#define DISPLAYON 0xAF
+#define EXTERNALVCC 0x1
+#define INVERTDISPLAY 0xA7
+#define MEMORYMODE 0x20
+#define NORMALDISPLAY 0xA6
+#define PAGEADDR 0x22
+#define SEGREMAP 0xA0
+#define SETCOMPINS 0xDA
+#define SETCONTRAST 0x81
+#define SETDISPLAYCLOCKDIV 0xD5
+#define SETDISPLAYOFFSET 0xD3
+#define SETHIGHCOLUMN 0x10
+#define SETLOWCOLUMN 0x00
+#define SETMULTIPLEX 0xA8
+#define SETPRECHARGE 0xD9
+#define SETSEGMENTREMAP 0xA1
+#define SETSTARTLINE 0x40
+#define SETVCOMDETECT 0xDB
+#define SWITCHCAPVCC 0x2
+
 class SSD1306 {
 
 private:
-- 
GitLab