Setup da Placa LCD Gian - Leite

Dependents:   Main

Fork of TextLCD by Wim Huiskamp

Files at this revision

API Documentation at this revision

Comitter:
wim
Date:
Thu Aug 28 15:44:08 2014 +0000
Parent:
32:59c4b8f648d4
Child:
34:e5a0dcb43ecc
Commit message:
Added support for controllers US2066/SSD1311 (OLED), added setUDCBlink method for supported devices (eg SSD1803), fixed issue in setPower()

Changed in this revision

TextLCD.cpp Show annotated file Show diff for this revision Revisions of this file
TextLCD.h Show annotated file Show diff for this revision Revisions of this file
--- a/TextLCD.cpp	Fri Aug 22 19:50:49 2014 +0000
+++ b/TextLCD.cpp	Thu Aug 28 15:44:08 2014 +0000
@@ -12,6 +12,8 @@
  *               2014, v10: WH, Added Class for Native I2C controllers such as ST7032i, Added support for MCP23008 I2C portexpander, Added support for Adafruit module  
  *               2014, v11: WH, Added support for native I2C controllers such as PCF21XX, Improved the _initCtrl() method to deal with differences between all supported controllers  
  *               2014, v12: WH, Added support for native I2C controller PCF2119 and native I2C/SPI controllers SSD1803, ST7036, added setContrast method (by JH1PJL) for supported devices (eg ST7032i) 
+ *               2014, v13: WH, Added support for controllers US2066/SSD1311 (OLED), added setUDCBlink method for supported devices (eg SSD1803), fixed issue in setPower() 
+ *@Todo Add AC780S/KS0066i
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -41,6 +43,21 @@
 //  led2=!led2;    
 
 
+// User Defined Characters (UDCs) are defined by an 8 byte bitpattern. The P0..P5 form the character pattern.
+//     P7 P6 P5 P4 P3 P2 P1 P0 
+// 0   B1 B0  x  0  1  1  1  0
+// 1   B1 B0  x  1  0  0  0  1
+// .       .............
+// 7   B1 B0  x  1  0  0  0  1
+//
+// Blinking UDCs are enabled when a specific controlbit (BE) is set.
+// The blinking pixels in the UDC can be controlled by setting additional bits in the UDC bitpattern.
+// Bit 6 and Bit 7 in the pattern will control the blinking mode when Blink is enabled through BE. 
+//     B1 B0  Mode
+//      0  0  No Blinking in this row of the UDC
+//      0  1  Enabled pixels in P4 will blink
+//      1  x  Enabled pixels in P0..P4 will blink
+
 /** Some sample User Defined Chars 5x7 dots */
 //const char udc_ae[] = {0x00, 0x00, 0x1B, 0x05, 0x1F, 0x14, 0x1F, 0x00};  //æ
 //const char udc_0e[] = {0x00, 0x00, 0x0E, 0x13, 0x15, 0x19, 0x0E, 0x00};  //ø
@@ -74,9 +91,12 @@
 //const char udc_Bat_Hi[] = {0x0E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00};  // Battery Full
 //const char udc_Bat_Ha[] = {0x0E, 0x11, 0x13, 0x17, 0x1F, 0x1F, 0x1F, 0x00};  // Battery Half
 //const char udc_Bat_Lo[] = {0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x00};  // Battery Low
-const char udc_Bat_Hi[] = {0x0E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00};  // Battery Full
-const char udc_Bat_Ha[] = {0x0E, 0x11, 0x11, 0x1F, 0x1F, 0x1F, 0x1F, 0x00};  // Battery Half
-const char udc_Bat_Lo[] = {0x0E, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x1F, 0x00};  // Battery Low
+//const char udc_Bat_Hi[] = {0x0E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00};  // Battery Full
+//const char udc_Bat_Ha[] = {0x0E, 0x11, 0x11, 0x1F, 0x1F, 0x1F, 0x1F, 0x00};  // Battery Half
+//const char udc_Bat_Lo[] = {0x0E, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x1F, 0x00};  // Battery Low
+const char udc_Bat_Hi[] = {0x8E, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x00};  // Battery Full, Blink
+const char udc_Bat_Ha[] = {0x8E, 0x91, 0x91, 0x9F, 0x9F, 0x9F, 0x9F, 0x00};  // Battery Half, Blink
+const char udc_Bat_Lo[] = {0x8E, 0x91, 0x91, 0x91, 0x91, 0x9F, 0x9F, 0x00};  // Battery Low, Blink
 const char udc_AC[]     = {0x0A, 0x0A, 0x1F, 0x11, 0x0E, 0x04, 0x04, 0x00};  // AC Power
 
 //const char udc_smiley[] = {0x00, 0x0A, 0x00, 0x04, 0x11, 0x0E, 0x00, 0x00};  // Smiley
@@ -98,6 +118,15 @@
 //const char udc_ch_dy[] =  {0x1f, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x11, 0x1F};  // Day    (kana)
 //const char udc_ch_mi[] =  {0x0C, 0x0a, 0x11, 0x1f, 0x09, 0x09, 0x09, 0x13};  // minute (kana)
 
+//const char udc_bell[]     = {0x04,0x0E,0x0E,0x0E,0x1F,0x00,0x04};
+//const char udc_note[]     = {0x02,0x03,0x02,0x0E,0x1E,0x0C,0x00};
+//const char udc_clock[]    = {0x00,0x0E,0x15,0x17,0x11,0x0E,0x00};
+//const char udc_heart[]    = {0x00,0x0a,0x1F,0x1F,0x0E,0x04,0x00};
+//const char udc_duck[]     = {0x00,0x0c,0x1D,0x0F,0x0F,0x06,0x00};
+//const char udc_check[]    = {0x00,0x01,0x03,0x16,0x1C,0x08,0x00};
+//const char udc_cross[]    = {0x00,0x1B,0x0E,0x04,0x0E,0x1B,0x00};
+//const char udc_retarrow[] = {0x01,0x01,0x05,0x09,0x1f,0x08,0x04};
+
 const char udc_None[]    =  {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 
 const char udc_All[]     =  {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 
     
@@ -150,22 +179,38 @@
 void TextLCD_Base::_initCtrl() {
   int _bias_lines=0; // Set Bias and lines (Instr Set 1), temporary variable.
   int _lines=0;      // Set lines (Ext Instr Set), temporary variable.
-//  int _function_x=0; // Set ext. function (Ext Instr Set), temporary variable.
       
     this->_setRS(false); // command mode
     
     wait_ms(20);         // Wait 20ms to ensure powered up
 
-    // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus)    
-    for (int i=0; i<3; i++) {
-        _writeNibble(0x3);
-        wait_ms(15);     // This command takes 1.64ms, so wait for it 
-    }
-    _writeNibble(0x2);   // 4-bit mode
+    // The Controller could be in 8 bit mode (power-on reset) or in 4 bit mode (warm reboot) at this point.
+    // Follow this procedure to make sure the Controller enters the correct state. The hardware interface
+    // between the uP and the LCD can only write the 4 most significant bits (Most Significant Nibble, MSN).
+    // In 4 bit mode the LCD expects the MSN first, followed by the LSN.
+    //
+    //    Current state:               8 bit mode                |  4 bit mode, MSN is next      | 4 bit mode, LSN is next          
+                         //-------------------------------------------------------------------------------------------------                          
+    _writeNibble(0x3);   //  set 8 bit mode (MSN) and dummy LSN, |   set 8 bit mode (MSN),       |    set dummy LSN, 
+                         //  remains in 8 bit mode               |    change to 8 bit mode       |  remains in 4 bit mode
+    wait_ms(15);         //                           
+    
+    _writeNibble(0x3);   //  set 8 bit mode and dummy LSN,       | set 8 bit mode and dummy LSN, |    set 8bit mode (MSN), 
+                         //  remains in 8 bit mode               |   remains in 8 bit mode       |  remains in 4 bit mode
+    wait_ms(15);         // 
+    
+    _writeNibble(0x3);   //  set 8 bit mode and dummy LSN,       | set 8 bit mode and dummy LSN, |    set dummy LSN, 
+                         //  remains in 8 bit mode               |   remains in 8 bit mode       |  change to 8 bit mode
+    wait_ms(15);         // 
+
+    // Controller is now in 8 bit mode
+
+    _writeNibble(0x2);   // Change to 4-bit mode (MSN), the LSN is undefined dummy
     wait_us(40);         // most instructions take 40us
 
     // Display is now in 4-bit mode
-    // Note: 4 bit mode is ignored for native SPI and I2C devices
+    // Note: 4/8 bit mode is ignored for most native SPI and I2C devices. They dont use the parallel bus.
+    //       However, _writeNibble() method is void anyway for native SPI and I2C devices.
    
     // Device specific initialisations: DC/DC converter to generate VLCD or VLED, number of lines etc
     switch (_ctrl) {
@@ -186,7 +231,7 @@
                                     //   DH=1  (Disp shift enable, special mode for KS0078)                                
                                     //   REV=0 (Reverse normal, special mode for KS0078)
                                     
-              _function_1 = 0x04;    // Function set 001 DL N RE(1) BE 0 (Ext Regs)
+              _function_1 = 0x04;   // Function set 001 DL N RE(1) BE 0 (Ext Regs)
                                     //   DL=0  (4 bits bus)             
                                     //    N=0  (1 line mode), N=1 (2 line mode)
                                     //   RE=1  (Ena Extended Regs, special mode for KS0078)
@@ -212,7 +257,7 @@
                                     //   DH=1  (Disp shift enable, special mode for KS0078)                                
                                     //   REV=0 (Reverse normal, special mode for KS0078)
                                     
-              _function_1 = 0x04;    // Function set 001 DL N RE(1) BE 0 (Ext Regs)
+              _function_1 = 0x04;   // Function set 001 DL N RE(1) BE 0 (Ext Regs)
                                     //   DL=0  (4 bits bus)             
                                     //    N=0  (1 line mode), N=1 (2 line mode)
                                     //   RE=1  (Ena Extended Regs, special mode for KS0078)
@@ -222,6 +267,10 @@
               _function_x = 0x01;   // Ext Function set 0000 1 FW BW NW (Ext Regs)
                                     //    NW=0  (1,2 line), NW=1 (4 Line, special mode for KS0078)                                
               break;                                
+
+            case LCD16x3G:            // Special mode for ST7036                        
+              error("Error: LCD Controller type does not support this Display type\n\r"); 
+              break;  
               
             default:
               // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4)            
@@ -232,7 +281,7 @@
                                     //   DH=1  (Disp shift enable, special mode for KS0078)                                
                                     //   REV=0 (Reverse normal, special mode for KS0078)
                                     
-              _function_1 = 0x0C;    // Function set 001 DL N RE(1) BE 0 (Ext Regs)
+              _function_1 = 0x0C;   // Function set 001 DL N RE(1) BE 0 (Ext Regs)
                                     //   DL=0  (4 bits bus)             
                                     //    N=1  (1 line mode), N=1 (2 line mode)
                                     //   RE=1  (Ena Extended Regs, special mode for KS0078)
@@ -292,6 +341,7 @@
             case LCD12x3D:            // Special mode for KS0078 and PCF21XX
             case LCD12x3D1:           // Special mode for KS0078 and PCF21XX
             case LCD12x4D:            // Special mode for KS0078 and PCF21XX
+            case LCD16x3G:            // Special mode for ST7036                        
             case LCD24x4D:            // Special mode for KS0078
               error("Error: LCD Controller type does not support this Display type\n\r"); 
               break;  
@@ -305,9 +355,9 @@
           } // switch type    
                                      
           // init special features 
-          _writeCommand(0x20 | _function | 0x01);           // Set function,  0 0 1 DL N F 0 IS=1 Select Instruction Set = 1              
-
-          _writeCommand(0x1C);                              // Internal OSC frequency adjustment Framefreq=183HZ, Bias will be 1/4 (IS=1)
+          _writeCommand(0x20 | _function | 0x01);           // Set function,  0 0 1 DL N F 0 IS=1 Select Instr Set = 1              
+
+          _writeCommand(0x1C);                              // Internal OSC frequency adjustment Framefreq=183HZ, Bias will be 1/4 (Instr Set=1)
 
           _contrast = LCD_ST7032_CONTRAST;              
           _writeCommand(0x70 | (_contrast & 0x0F));         // Set Contrast Low bits, 0 1 1 1 C3 C2 C1 C0 (IS=1)
@@ -381,7 +431,7 @@
 
 
           // init special features 
-          _writeCommand(0x20 | _function | 0x01);   // Set function, IS2,IS1 = 01 (Select Instruction Set = 1)
+          _writeCommand(0x20 | _function | 0x01);   // Set function, IS2,IS1 = 01 (Select Instr Set = 1)
           _writeCommand(0x10 | _bias_lines);        // Set Bias and 1,2 or 3 lines (Instr Set 1)
 
           _contrast = LCD_ST7036_CONTRAST;
@@ -427,7 +477,7 @@
                                     //    DH=0 Double Height disable 
                                     //    IS=0
           
-             _function_1 = 0x00;     // Set function, 0 0 1 DL N BE RE(1) REV
+              _function_1 = 0x02;   // Set function, 0 0 1 DL N BE RE(1) REV
                                     //  Saved to allow switch between Instruction sets at later time
                                     //    DL=0 4-bit Databus,
                                     //         Note: 4 bit mode is ignored for native SPI and I2C devices
@@ -439,9 +489,9 @@
                                     //    NW=0 1-Line LCD (N=0)
               break;  
 
-            case LCD12x3D:          // Special mode for KS0078, ST7036 and PCF21XX                                  
+            case LCD12x3D:          // Special mode for KS0078 and PCF21XX                                  
 //            case LCD12x3D1:           // Special mode for KS0078 and PCF21XX            
-            case LCD16x3D:          // Special mode for KS0078 and ST7036
+            case LCD16x3D:          // Special mode for KS0078
 //            case LCD16x3D1:           // Special mode for SSD1803
 //            case LCD20x3D:            // Special mode for SSD1803
               _function = 0x00;     //  Set function 0 0 1 DL N DH RE(0) IS 
@@ -452,7 +502,7 @@
                                     //    DH=0 Double Height disable 
                                     //    IS=0
           
-             _function_1 = 0x00;     // Set function, 0 0 1 DL N BE RE(1) REV
+              _function_1 = 0x02;   // Set function, 0 0 1 DL N BE RE(1) REV
                                     //  Saved to allow switch between Instruction sets at later time
                                     //    DL=0 4-bit Databus,
                                     //         Note: 4 bit mode is ignored for native SPI and I2C devices
@@ -473,7 +523,7 @@
                                     //    DH=0 Double Height disable 
                                     //    IS=0
           
-             _function_1 = 0x08;     // Set function, 0 0 1 DL N BE RE(1) REV
+              _function_1 = 0x0A;   // Set function, 0 0 1 DL N BE RE(1) REV
                                     //  Saved to allow switch between Instruction sets at later time
                                     //    DL=0 4-bit Databus,
                                     //         Note: 4 bit mode is ignored for native SPI and I2C devices
@@ -485,6 +535,7 @@
                                     //    NW=1 4-Line LCD (N=1)
               break;  
 
+            case LCD16x3G:          // Special mode for ST7036            
             case LCD24x4D:          // Special mode for KS0078
               error("Error: LCD Controller type does not support this Display type\n\r"); 
               break;  
@@ -499,7 +550,7 @@
                                     //    DH=0 Double Height disable 
                                     //    IS=0
           
-             _function_1 = 0x08;     // Set function, 0 0 1 DL N BE RE(1) REV
+              _function_1 = 0x0A;   // Set function, 0 0 1 DL N BE RE(1) REV
                                     //  Saved to allow switch between Instruction sets at later time
                                     //    DL=0 4-bit Databus,
                                     //         Note: 4 bit mode is ignored for native SPI and I2C devices
@@ -514,16 +565,17 @@
 
 
           // init special features 
-          _writeCommand(0x20 | _function_1 | 0x02);  // Set function, 0 0 1 DL N BE RE(1) REV 
+          _writeCommand(0x20 | _function_1);        // Set function, 0 0 1 DL N BE RE(1) REV 
                                                     // Select Extended Instruction Set
+          
+          _writeCommand(0x06);                      // Set ext entry mode, 0 0 0 0 0 1 BDC=1 COM1-32, BDS=0 SEG100-1    "Bottom View" (Ext Instr Set)
+//          _writeCommand(0x05);                      // Set ext entry mode, 0 0 0 0 0 1 BDC=0 COM32-1, BDS=1 SEG1-100    "Top View" (Ext Instr Set)          
+          wait_ms(5);                               // Wait to ensure completion or SSD1803 fails to set Top/Bottom after reset..
+         
+          _writeCommand(0x08 | _lines);             // Set ext function 0 0 0 0 1 FW BW NW 1,2,3 or 4 lines (Ext Instr Set)
 
           _writeCommand(0x10);                      // Double Height and Bias, 0 0 0 1 UD2=0, UD1=0, BS1=0 Bias 1/5, DH=0 (Ext Instr Set)
 
-          _writeCommand(0x08 | _lines);             // Set ext function 0 0 0 0 1 FW BW NW 1,2,3 or 4 lines (Ext Instr Set)
-
-          _writeCommand(0x06);                      // Set ext entry mode, 0 0 0 0 0 1 BDC=1 COM1-31, BDS=0 SEG100-1 "Bottom View" (Ext Instr Set)
-//          _writeCommand(0x04);                      // Set ext entry mode, 0 0 0 0 0 1 BDC=0 COM31-1, BDS=0 SEG100-1 "Top View" (Ext Instr Set)          
-
 //          _writeCommand(0x76);                      // Set TC Control, 0 1 1 1 0 1 1 0 (Ext Instr Set)
 //          _writeData(0x02);                         // Set TC data,    0 0 0 0 0 TC2,TC1,TC0 = 0 1 0 (Ext Instr Set)
 
@@ -541,7 +593,7 @@
           _writeCommand(0x68 | (LCD_SSD1_RAB & 0x07));  // Set Voltagefollower 0 1 1 0 Don = 1, Ampl ratio Rab2, Rab1, Rab0 = 1 1 0  (Instr Set 1)
           wait_ms(10);            // Wait 10ms to ensure powered up
 
-          _writeCommand(0x20 | _function_1 | 0x02); // Set function, 0 0 1 DL N BE RE(1) REV 
+          _writeCommand(0x20 | _function_1);        // Set function, 0 0 1 DL N BE RE(1) REV 
                                                     // Select Extended Instruction Set 1
           _writeCommand(0x10);                      // Shift/Scroll enable, 0 0 0 1 DS4/HS4 DS3/HS3 DS2/HS2 DS1/HS1  (Ext Instr Set 1)
 
@@ -570,16 +622,16 @@
           // Initialise Display configuration
           switch (_type) {
 //            case LCD12x1:                                
-//              _function = 0x02;       // FUNCTION SET DL=0 4 bit, 0, M=0 1-line/12 chars display mode, SL=1
+//              _function = 0x02;       // FUNCTION SET 0 0 1 DL=0 4 bit, 0, M=0 1-line/12 chars display mode, SL=1, IS=0
                                       // Note: 4 bit mode is ignored for I2C mode
             case LCD24x1:                    
-              _function = 0x00;       // FUNCTION SET DL=0 4 bit, 0, M=0 1-line/24 chars display mode, SL=0            
+              _function = 0x00;       // FUNCTION SET 0 0 1 DL=0 4 bit, 0, M=0 1-line/24 chars display mode, SL=0, IS=0            
                                       // Note: 4 bit mode is ignored for I2C mode
               break;  
 
 //Tested OK for PCF2113
             case LCD12x2:                    
-              _function = 0x04;       // FUNCTION SET DL=0 4 bit, 0, M=1 2-line/12 chars display mode, SL=0            
+              _function = 0x04;       // FUNCTION SET 0 0 1 DL=0 4 bit, 0, M=1 2-line/12 chars display mode, SL=0, IS=0            
               break;  
              
             default:
@@ -589,22 +641,22 @@
           } // switch type    
 
           // Init special features
-          _writeCommand(0x20 | _function | 0x01);           // Set function, Select Instruction Set = 1              
-
-          _writeCommand(0x04);    // DISP CONF SET (Instr. Set 1)   0000 0, 1, P=0, Q=0 
-          _writeCommand(0x10);    // TEMP CTRL SET (Instr. Set 1)   0001 0, 0, TC1=0, TC2=0
-//          _writeCommand(0x42);    // HV GEN (Instr. Set 1)          0100 S1=1, S2=0 (2x multiplier)
-          _writeCommand(0x40 | (LCD_PCF2_S12 & 0x03));    // HV GEN (Instr. Set 1)          0100 S1=1, S2=0 (2x multiplier)
+          _writeCommand(0x20 | _function | 0x01);          // Set function, Select Instr Set = 1              
+
+          _writeCommand(0x04);                             // Display Conf Set         0000 0, 1, P=0, Q=0               (Instr. Set 1)
+          _writeCommand(0x10);                             // Temp Compensation Set    0001 0, 0, TC1=0, TC2=0           (Instr. Set 1)
+//          _writeCommand(0x42);                             // HV GEN                   0100 S1=1, S2=0 (2x multiplier)   (Instr. Set 1)
+          _writeCommand(0x40 | (LCD_PCF2_S12 & 0x03));     // HV Gen                   0100 S1=1, S2=0 (2x multiplier)   (Instr. Set 1)
           
           _contrast = LCD_PCF2_CONTRAST;              
-          _writeCommand(0x80 | 0x00 | (_contrast & 0x3F));      // VLCD_set (Instr. Set 1)    V=0, VA=contrast
-          _writeCommand(0x80 | 0x40 | (_contrast & 0x3F));      // VLCD_set (Instr. Set 1)    V=1, VB=contrast
+          _writeCommand(0x80 | 0x00 | (_contrast & 0x3F));      // VLCD_set (Instr. Set 1)  1, V=0, VA=contrast
+          _writeCommand(0x80 | 0x40 | (_contrast & 0x3F));      // VLCD_set (Instr. Set 1)  1, V=1, VB=contrast
           wait_ms(10);            // Wait 10ms to ensure powered up
           
-          _writeCommand(0x02);    // SCRN CONF (Instr. Set 1)    L=0
-          _writeCommand(0x08);    // ICON CONF (Instr. Set 1)    IM=0 (Char mode) IB=0 (no icon blink) DM=0 (no direct mode)
-
-          _writeCommand(0x20 | _function);                  // Select Instruction Set = 0             
+          _writeCommand(0x02);                             // Screen Config            0000 001, L=0  (Instr. Set 1)
+          _writeCommand(0x08);                             // ICON Conf                0000 1, IM=0 (Char mode), IB=0 (no icon blink) DM=0 (no direct mode) (Instr. Set 1) 
+
+          _writeCommand(0x20 | _function);                 // Set function, Select Instr Set = 0             
 
           break; // case PCF2113_3V3 Controller
 
@@ -783,6 +835,7 @@
             case LCD12x3D:            // Special mode for KS0078 and PCF21XX                            
             case LCD12x3D1:           // Special mode for PCF21XX                     
             case LCD12x4D:            // Special mode for PCF21XX:
+            case LCD16x3G:            // Special mode for ST7036            
             case LCD24x4D:            // Special mode for KS0078
               error("Error: LCD Controller type does not support this Display type\n\r"); 
               break;  
@@ -799,6 +852,179 @@
            } // switch type
            
            break; // case WS0010 Controller
+
+
+      case US2066_3V3:
+          // US2066/SSD1311 OLED controller, Initialise for VDD=3V3
+          // Note: supports 1,2, 3 or 4 lines
+//      case USS2066_5V:
+          // US2066 controller, VDD=5V
+                    
+          // Initialise Display configuration
+          switch (_type) {
+            case LCD8x1:         //8x1 is a regular 1 line display
+            case LCD8x2B:        //8x2D is a special case of 16x1
+//            case LCD12x1:                                
+            case LCD16x1:   
+//            case LCD20x1:                                                                         
+              _function = 0x00;     //  Set function 0 0 1 X N DH RE(0) IS 
+                                    //  Saved to allow switch between Instruction sets at later time
+                                    //    DL=X bit is ignored for US2066. Uses hardwired pins instead
+                                    //     N=0 1 Line / 3 Line
+                                    //    DH=0 Double Height disable 
+                                    //    IS=0
+          
+              _function_1 = 0x02;   // Set function, 0 0 1 X N BE RE(1) REV
+                                    //  Saved to allow switch between Instruction sets at later time
+                                    //    DL=X bit is ignored for US2066. Uses hardwired pins instead                                    
+                                    //     N=0 1 Line / 3 Line
+                                    //    BE=0 Blink Enable off, special feature of SSD1803, US2066
+                                    //   REV=0 Reverse off, special feature of SSD1803, US2066            
+                        
+              _lines = 0x00;        // Ext function set 0 0 0 0 1 FW BW NW 
+                                    //    NW=0 1-Line LCD (N=0)
+              break;  
+
+            case LCD16x1C:
+            case LCD8x2:
+            case LCD16x2:
+            case LCD20x2:            
+              _function = 0x08;     //  Set function 0 0 1 X N DH RE(0) IS 
+                                    //  Saved to allow switch between Instruction sets at later time
+                                    //    DL=X bit is ignored for US2066. Uses hardwired pins instead                                                                        
+                                    //     N=1 2 line / 4 Line
+                                    //    DH=0 Double Height disable 
+                                    //    IS=0
+          
+              _function_1 = 0x0A;   // Set function, 0 0 1 X N BE RE(1) REV
+                                    //  Saved to allow switch between Instruction sets at later time
+                                    //    DL=X bit is ignored for US2066. Uses hardwired pins instead                                                                        
+                                    //     N=1 2 line / 4 Line
+                                    //    BE=0 Blink Enable off, special feature of SSD1803, US2066
+                                    //   REV=0 Reverse off, special feature of SSD1803, US2066            
+                        
+              _lines = 0x00;        // Ext function set 0 0 0 0 1 FW BW NW 
+                                    //    NW=0 2-Line LCD (N=1)
+              break;                
+
+            case LCD12x3D:          // Special mode for KS0078 and PCF21XX 
+//            case LCD12x3D1:           // Special mode for KS0078 and PCF21XX            
+            case LCD16x3D:          // Special mode for KS0078, SSD1803 and US2066
+//            case LCD16x3D1:           // Special mode for SSD1803, US2066
+//            case LCD20x3D:            // Special mode for SSD1803, US2066
+              _function = 0x00;     //  Set function 0 0 1 X N DH RE(0) IS 
+                                    //  Saved to allow switch between Instruction sets at later time
+                                    //    DL=X bit is ignored for US2066. Uses hardwired pins instead                                    
+                                    //     N=0 1 Line / 3 Line
+                                    //    DH=0 Double Height disable 
+                                    //    IS=0
+          
+              _function_1 = 0x02;   // Set function, 0 0 1 X N BE RE(1) REV
+                                    //  Saved to allow switch between Instruction sets at later time
+                                    //    DL=X bit is ignored for US2066. Uses hardwired pins instead                                    
+                                    //     N=0 1 Line / 3 Line
+                                    //    BE=0 Blink Enable off, special feature of SSD1803, US2066
+                                    //   REV=0 Reverse off, special feature of SSD1803, US2066            
+                        
+              _lines = 0x00;        // Ext function set 0 0 0 0 1 FW BW NW 
+                                    //    NW=1 3-Line LCD (N=0)
+              break;  
+
+            case LCD20x4D:          // Special mode for SSD1803, US2066
+              _function = 0x08;     //  Set function 0 0 1 X N DH RE(0) IS 
+                                    //  Saved to allow switch between Instruction sets at later time
+                                    //    DL=X bit is ignored for US2066. Uses hardwired pins instead
+                                    //     N=1 2 line / 4 Line
+                                    //    DH=0 Double Height disable 
+                                    //    IS=0
+          
+              _function_1 = 0x0A;   // Set function, 0 0 1 DL N BE RE(1) REV
+                                    //  Saved to allow switch between Instruction sets at later time
+                                    //    DL=0 bit is ignored for US2066. Uses hardwired pins instead                                    
+                                    //     N=1 2 line / 4 Line
+                                    //    BE=0 Blink Enable off, special feature of SSD1803, US2066
+                                    //   REV=0 Reverse off, special feature of SSD1803, US2066            
+                        
+              _lines = 0x01;        // Ext function set 0 0 0 0 1 FW BW NW 
+                                    //    NW=1 4-Line LCD (N=1)
+              break;  
+
+//            case LCD24x1:                                                                         
+//            case LCD16x3G:          // Special mode for ST7036            
+//            case LCD24x4D:          // Special mode for KS0078
+            default:            
+              error("Error: LCD Controller type does not support this Display type\n\r"); 
+              break;  
+
+          } // switch type
+
+
+          // init special features 
+          _writeCommand(0x20 | _function_1);        // Set function, 0 0 1 X N BE RE(1) REV 
+                                                    // Select Extended Instruction Set
+
+          _writeCommand(0x71);                      // Function Select A: 0 1 1 1 0 0 0 1 (Ext Instr Set)
+          _writeData(0x00);                         // Disable Internal VDD
+
+          _writeCommand(0x79);                      // Function Select OLED:  0 1 1 1 1 0 0 1 (Ext Instr Set)
+
+          _writeCommand(0xD5);                      // Display Clock Divide Ratio: 1 1 0 1 0 1 0 1 (Ext Instr Set, OLED Instr Set)
+          _writeCommand(0x70);                      // Display Clock Divide Ratio value: 0 1 1 1 0 0 0 0 (Ext Instr Set, OLED Instr Set)
+                    
+          _writeCommand(0x78);                      // Function Disable OLED: 0 1 1 1 1 0 0 0 (Ext Instr Set)
+          
+//          _writeCommand(0x06);                      // Set ext entry mode, 0 0 0 0 0 1 BDC=1 COM1-32, BDS=0 SEG100-1    "Bottom View" (Ext Instr Set)
+          _writeCommand(0x05);                      // Set ext entry mode, 0 0 0 0 0 1 BDC=0 COM32-1, BDS=1 SEG1-100    "Top View" (Ext Instr Set)          
+         
+          _writeCommand(0x08 | _lines);             // Set ext function 0 0 0 0 1 FW BW NW 1,2,3 or 4 lines (Ext Instr Set)
+
+//          _writeCommand(0x1C);                      // Double Height and Bias, 0 0 0 1 UD2=1, UD1=1, X, DH=0 (Ext Instr Set)
+//                                                    // Default
+
+          _writeCommand(0x72);                      // Function Select B: 0 1 1 1 0 0 1 0 (Ext Instr Set)
+          _writeData(0x01);                         // Select ROM A (CGRAM 8, CGROM 248)
+
+          _writeCommand(0x79);                      // Function Select OLED:  0 1 1 1 1 0 0 1 (Ext Instr Set)
+
+          _writeCommand(0xDA);                      // Set Segm Pins Config:  1 1 0 1 1 0 1 0 (Ext Instr Set, OLED)
+          _writeCommand(0x10);                      // Set Segm Pins Config value: Altern Odd/Even, Disable Remap (Ext Instr Set, OLED)
+
+          _writeCommand(0xDC);                      // Function Select C: 1 1 0 1 1 1 0 0 (Ext Instr Set, OLED)
+//          _writeCommand(0x00);                      // Set internal VSL, GPIO pin HiZ (always read low)
+          _writeCommand(0x80);                      // Set external VSL, GPIO pin HiZ (always read low)
+
+          _contrast = LCD_US20_CONTRAST;
+          _writeCommand(0x81);                      // Set Contrast Control: 1 0 0 0 0 0 0 1 (Ext Instr Set, OLED)
+          _writeCommand((_contrast << 2) | 0x03);   // Set Contrast Value: 8 bits, use 6 bits for compatibility 
+
+          _writeCommand(0xD9);                      // Set Phase Length: 1 1 0 1 1 0 0 1 (Ext Instr Set, OLED)
+          _writeCommand(0xF1);                      // Set Phase Length Value: 
+
+          _writeCommand(0xDB);                      // Set VCOMH Deselect Lvl: 1 1 0 1 1 0 1 1 (Ext Instr Set, OLED)
+          _writeCommand(0x30);                      // Set VCOMH Deselect Value: 0.83 x VCC
+
+          wait_ms(10);            // Wait 10ms to ensure powered up
+
+//Test Fade/Blinking. Hard Blink on/off, No fade in/out ??
+//          _writeCommand(0x23);                      // Set (Ext Instr Set, OLED)
+//          _writeCommand(0x3F);                      // Set interval 128 frames
+//End Test Blinking
+
+          _writeCommand(0x78);                      // Function Disable OLED: 0 1 1 1 1 0 0 0 (Ext Instr Set)
+          
+          _writeCommand(0x20 | _function | 0x01);   // Set function, 0 0 1 X N DH RE(0) IS=1 Select Instruction Set 1
+                                                    // Select Std Instr set, Select IS=1  
+
+          _writeCommand(0x20 | _function_1);        // Set function, 0 0 1 X N BE RE(1) REV 
+                                                    // Select Ext Instr Set, IS=1
+          _writeCommand(0x10);                      // Shift/Scroll enable, 0 0 0 1 DS4/HS4 DS3/HS3 DS2/HS2 DS1/HS1  (Ext Instr Set, IS=1)
+
+
+          _writeCommand(0x20 | _function);          // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
+                                                    // Select Std Instr set, Select IS=0
+         
+          break; // case US2066/SSD1311 Controller
+
            
         default:
           // Devices fully compatible to HD44780 that do not use any DC/DC Voltage converters but external VLCD, no icons etc
@@ -822,7 +1048,7 @@
             case LCD12x3D:            // Special mode for KS0078 and PCF21XX                            
             case LCD12x3D1:           // Special mode for KS0078 and PCF21XX                     
             case LCD12x4D:            // Special mode for KS0078 and PCF21XX:
-            case LCD16x3D:            // Special mode for KS0078 and ST7036
+            case LCD16x3D:            // Special mode for KS0078
 //            case LCD16x3D1:           // Special mode for KS0078
 //            case LCD24x3D:            // Special mode for KS0078
 //            case LCD24x3D1:           // Special mode for KS0078            
@@ -1067,7 +1293,9 @@
 
         case LCD_T_C:
           // LCD16x1C is a special layout of LCD8x2
-#if(1)
+          // LCD32x1C is a special layout of LCD16x2                    
+          // LCD40x1C is a special layout of LCD20x2          
+#if(0)
           if (column < 8) 
             return 0x00 + column;                        
           else   
@@ -1083,10 +1311,9 @@
 // Left in for compatibility with original library
 //        case LCD16x2B:      
 //            return 0x00 + (row * 40) + column;
-  
 
         case LCD_T_D:
-          //Alternate addressing mode for 3 and 4 row displays (except 40x4). Used by PCF21XX, KS0078, ST7036, SSD1803
+          //Alternate addressing mode for 3 and 4 row displays (except 40x4). Used by PCF21XX, KS0078, SSD1803
           //The 4 available rows start at a hardcoded address.                    
           //Displays top rows when less than four are used.
           switch (row) {
@@ -1385,6 +1612,89 @@
 }
 
 
+/** Set UDC Blink
+  * setUDCBlink method is supported by some compatible devices (eg SSD1803) 
+  *
+  * @param blinkMode The Blink mode (BlinkOff, BlinkOn)
+  */
+void TextLCD_Base::setUDCBlink(LCDBlink blinkMode){
+  // Blinking UDCs are enabled when a specific controlbit (BE) is set.
+  // The blinking pixels in the UDC can be controlled by setting additional bits in the UDC bitpattern.
+  // UDCs are defined by an 8 byte bitpattern. The P0..P5 form the character pattern.
+  //     P7 P6 P5 P4 P3 P2 P1 P0 
+  // 0   B1 B0  x  0  1  1  1  0
+  // 1   B1 B0  x  1  0  0  0  1
+  //        .............
+  // 7   B1 B0  x  1  0  0  0  1
+  //
+  // Bit 6 and Bit 7 in the pattern will control the blinking mode when Blink is enabled through BE. 
+  //     B1 B0  Mode
+  //      0  0  No Blinking in this row of the UDC
+  //      0  1  Enabled pixels in P4 will blink
+  //      1  x  Enabled pixels in P0..P4 will blink
+
+  switch (blinkMode) {
+    case BlinkOn: 
+      // Controllers that support UDC Blink  
+      switch (_ctrl) {
+        case KS0078 :            
+          _function_1 |= 0x02; // Enable UDC Blink        
+          _writeCommand(0x20 | _function_1);        // Function set 0 0 1 DL N RE(1) BE 0 (Ext Regs)
+
+          _writeCommand(0x20 | _function);          // Function set 0 0 1 DL N RE(0) DH REV (Std Regs)
+          break; // case KS0078 Controller
+    
+        case US2066_3V3 :  
+        case SSD1803_3V3 :  
+          _function_1 |= 0x04; // Enable UDC Blink
+          _writeCommand(0x20 | _function_1);        // Set function, 0 0 1 DL N BE RE(1) REV 
+                                                    // Select Ext Instr Set
+
+          _writeCommand(0x20 | _function);          // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
+                                                    // Select Std Instr set, Select IS=0
+          break; // case SSD1803, US2066
+       
+        default:
+          //Unsupported feature for other controllers        
+          break; 
+      } //switch _ctrl     
+    
+      break;      
+
+    case BlinkOff:
+      // Controllers that support UDC Blink  
+      switch (_ctrl) {
+        case KS0078 :            
+          _function_1 &= ~0x02; // Disable UDC Blink        
+          _writeCommand(0x20 | _function_1);        // Function set 0 0 1 DL N RE(1) BE 0 (Ext Regs)
+
+          _writeCommand(0x20 | _function);          // Function set 0 0 1 DL N RE(0) DH REV (Std Regs)
+          break; // case KS0078 Controller
+    
+        case US2066_3V3 :  
+        case SSD1803_3V3 :  
+          _function_1 &= ~0x04; // Disable UDC Blink
+          _writeCommand(0x20 | _function_1);        // Set function, 0 0 1 DL N BE RE(1) REV 
+                                                    // Select Ext Instr Set
+
+          _writeCommand(0x20 | _function);          // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
+                                                    // Select Std Instr set, Select IS=0
+          break; // case SSD1803, US2066          
+       
+        default:
+          //Unsupported feature for other controllers        
+          break; 
+      } //switch _ctrl     
+    
+      break;        
+      
+    default:
+      break;      
+  } // blinkMode
+  
+} // setUDCBlink()
+
+
 /** Set Contrast
   * setContrast method is supported by some compatible devices (eg ST7032i) that have onboard LCD voltage generation
   * Initial code for ST70XX imported from fork by JH1PJL
@@ -1400,8 +1710,7 @@
  
   _contrast = c & 0x3F; // Sanity check
   
-  switch (_ctrl) {
-    
+  switch (_ctrl) {   
     case PCF2113_3V3 :  
     case PCF2119_3V3 :  
        if (_contrast <  5) _contrast = 0;  // See datasheet. Sanity check for PCF2113/PCF2119
@@ -1424,6 +1733,21 @@
       _writeCommand(0x20 | _function);                               // Select Instruction Set = 0
       break;
 
+    case US2066_3V3 :      
+      _writeCommand(0x20 | _function_1);        // Set function, 0 0 1 DL N BE RE(1) REV 
+                                                // Select Extended Instruction Set
+
+      _writeCommand(0x79);                      // Function Select OLED:  0 1 1 1 1 0 0 1 (Ext Instr Set)
+         
+      _writeCommand(0x81);                      // Set Contrast Control: 1 0 0 0 0 0 0 1 (Ext Instr Set, OLED)
+      _writeCommand((_contrast << 2) | 0x03);   // Set Contrast Value: 8 bits. Use 6 bits for compatibility    
+      
+      _writeCommand(0x78);                      // Function Disable OLED: 0 1 1 1 1 0 0 0 (Ext Instr Set)          
+
+      _writeCommand(0x20 | _function);          // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
+                                                // Select Std Instr set, Select IS=0
+      break;
+
  #if(0)
  //not yet tested
     case PT6314 :
@@ -1438,11 +1762,9 @@
             
     default:  
       //Unsupported feature for other controllers
-      break;
-                
-  } // end switch  
-    
-}
+      break;               
+  } // end switch     
+} // end setContrast()
 
 
 /** Set Power
@@ -1453,35 +1775,32 @@
   */
 //@TODO Add support for 40x4 dual controller  
 void TextLCD_Base::setPower(bool powerOn) {
-  static int _tmp_contrast = LCD_DEF_CONTRAST;
   
   if (powerOn) {
     // Switch on  
     setMode(DispOn);       
 
-    // Try to set contrast=0
-    _tmp_contrast = _contrast;   // Temp. save current contrast         
-    setContrast(0);              // Contrast 0  
-
     // Controllers that supports specific Power Down mode
     switch (_ctrl) {
     
 //    case PCF2113_3V3 :  
 //    case PCF2119_3V3 :  
 //    case ST7032_3V3 :  
-//    case ST7032_5V :      
 //@todo
-
+//    enable Booster Bon
+
+      case WS0010:      
+        _writeCommand(0x17);   // Char mode, DC/DC on        
+        wait_ms(10);           // Wait 10ms to ensure powered up             
+        break;
+
+      case KS0078:        
       case SSD1803_3V3 :      
 //      case SSD1803_5V :            
-        _writeCommand(0x20 | _function_1 | 0x02);                      // Select Ext Instr Set
-        _writeCommand(0x03);                                           // Power Down
+        _writeCommand(0x20 | _function_1);                             // Select Ext Instr Set
+        _writeCommand(0x02);                                           // Power On
         _writeCommand(0x20 | _function);                               // Select Std Instr Set
         break;
-
-      case KS0078:
-//@todo
-        break;
                     
       default:  
         //Unsupported feature for other controllers
@@ -1492,37 +1811,91 @@
     // Switch off        
     setMode(DispOff);       
 
-    // Try to restore contrast
-    setContrast(_tmp_contrast);  // Contrast
-
     // Controllers that support specific Power Down mode
     switch (_ctrl) {
     
 //    case PCF2113_3V3 :  
 //    case PCF2119_3V3 :  
 //    case ST7032_3V3 :  
-//    case ST7032_5V :      
 //@todo
-
+//    disable Booster Bon
+
+      case WS0010:      
+        _writeCommand(0x13);   // Char mode, DC/DC off              
+        break;
+        
+      case KS0078:
       case SSD1803_3V3 :      
 //      case SSD1803_5V :            
-        _writeCommand(0x20 | _function_1 | 0x02);                      // Select Ext Instr Set
-        _writeCommand(0x02);                                           // Power On
+        _writeCommand(0x20 | _function_1);                             // Select Ext Instr Set
+        _writeCommand(0x03);                                           // Power Down
         _writeCommand(0x20 | _function);                               // Select Std Instr Set
         break;
 
-      case KS0078:
-//@todo
-        break;
-            
       default:  
         //Unsupported feature for other controllers
         break;              
     } // end switch  
-
   }
-
-}
+} // end setPower()
+
+
+/** Set Orient
+  * setOrient method is supported by some compatible devices (eg SSD1803, US2066) that have top/bottom view modes
+  *
+  * @param LCDOrient orient Orientation 
+  * @return none
+  */
+void TextLCD_Base::setOrient(LCDOrient orient){
+
+  switch (orient) {
+       
+    case Top:
+      switch (_ctrl) {
+        case SSD1803_3V3 :      
+//      case SSD1803_5V :
+        case US2066_3V3 :      
+          _writeCommand(0x20 | _function_1);        // Set function, 0 0 1 X N BE RE(1) REV 
+                                                    // Select Extended Instruction Set
+//          _writeCommand(0x06);                      // Set ext entry mode, 0 0 0 0 0 1 BDC=1 COM1-32, BDS=0 SEG100-1    "Bottom View" (Ext Instr Set)
+          _writeCommand(0x05);                      // Set ext entry mode, 0 0 0 0 0 1 BDC=0 COM32-1, BDS=1 SEG1-100    "Top View" (Ext Instr Set)          
+
+          _writeCommand(0x20 | _function);          // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
+                                                    // Select Std Instr set, Select IS=0       
+          break;
+          
+        default:  
+          //Unsupported feature for other controllers
+          break;              
+
+      } // end switch _ctrl     
+      break; // end Top
+                
+    case Bottom:
+      switch (_ctrl) {
+        case SSD1803_3V3 :      
+//      case SSD1803_5V :
+        case US2066_3V3 :      
+          _writeCommand(0x20 | _function_1);        // Set function, 0 0 1 X N BE RE(1) REV 
+                                                    // Select Extended Instruction Set
+          _writeCommand(0x06);                      // Set ext entry mode, 0 0 0 0 0 1 BDC=1 COM1-32, BDS=0 SEG100-1    "Bottom View" (Ext Instr Set)
+//          _writeCommand(0x05);                      // Set ext entry mode, 0 0 0 0 0 1 BDC=0 COM32-1, BDS=1 SEG1-100    "Top View" (Ext Instr Set)          
+
+          _writeCommand(0x20 | _function);          // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
+                                                    // Select Std Instr set, Select IS=0       
+          break;
+          
+        default:  
+          //Unsupported feature for other controllers
+          break;              
+
+      } // end switch _ctrl     
+    
+      break; // end Bottom
+  } // end switch orient
+} // end setOrient()
+
+
 
 //--------- End TextLCD_Base -----------
 
@@ -1631,7 +2004,6 @@
   else { 
     if (_bl != NULL) {_bl->write(0);}  //Reset BL bit  
   }  
-
 }    
 
 // Place the 4bit data on the databus
@@ -1756,6 +2128,10 @@
 // Used for mbed pins, I2C bus expander or SPI shiftregister
 void TextLCD_I2C::_setBL(bool value) {
 
+#if (DFROBOT==1)  
+  value = !value; // The DFRobot module uses PNP transistor to drive the Backlight. Reverse logic level.
+#endif
+  
   if (value) {
     _lcd_bus |= D_LCD_BL;    // Set BL bit 
   }  
@@ -1850,14 +2226,7 @@
 TextLCD_I2C_N::TextLCD_I2C_N(I2C *i2c, char deviceAddress, LCDType type, PinName bl, LCDCtrl ctrl) : 
                                TextLCD_Base(type, ctrl), 
 
-//                               _i2c(i2c){
-                                 _i2c(i2c), _ps(p20) {      
-//Test
-  // Init PS
-  wait_us(500);
-  _ps = 0;
-  wait_us(250);
-  
+                               _i2c(i2c){
   
   _slaveAddress = deviceAddress & 0xFE;
   
@@ -2205,14 +2574,7 @@
 TextLCD_SPI_N_3_9::TextLCD_SPI_N_3_9(SPI *spi, PinName cs, LCDType type, PinName bl, LCDCtrl ctrl) :
                                      TextLCD_Base(type, ctrl), 
                                      _spi(spi),        
-//                                     _cs(cs) {      
-
-                                     _cs(cs), _ps(p20) {      
-
-  // Init PS
-  wait_us(500);
-  _ps = 0;
-  wait_us(250);
+                                     _cs(cs) {      
 
   // Init CS
   _cs = 1;
@@ -2489,8 +2851,6 @@
 #endif
 
 #if(1)
-//Code to be checked out on logic analyser. Not yet tested on hardware..
-
 //------- Start TextLCD_SPI_N_3_24 --------
 
  /** Create a TextLCD interface using a controller with a native SPI3 24 bits interface
--- a/TextLCD.h	Fri Aug 22 19:50:49 2014 +0000
+++ b/TextLCD.h	Thu Aug 28 15:44:08 2014 +0000
@@ -12,6 +12,8 @@
  *               2014, v10: WH, Added Class for Native I2C controllers such as ST7032i, Added support for MCP23008 I2C portexpander, Added support for Adafruit module  
  *               2014, v11: WH, Added support for native I2C controllers such as PCF21XX, Improved the _initCtrl() method to deal with differences between all supported controllers  
  *               2014, v12: WH, Added support for native I2C controller PCF2119 and native I2C/SPI controllers SSD1803, ST7036, added setContrast method (by JH1PJL) for supported devices (eg ST7032i) 
+ *               2014, v13: WH, Added support for controllers US2066/SSD1311 (OLED), added setUDCBlink method for supported devices (eg SSD1803), fixed issue in setPower() 
+ *@Todo Add AC780S/KS0066i
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -130,7 +132,7 @@
 //
 //Note: LCD RW pin must be kept LOW
 //      E2 is not available on default Arduino hardware and so it does not support LCD40x4 (second controller)
-//      BL is used to control backlight
+//      BL is used to control backlight, reverse logic: Low turns on Backlight. This is handled in setBacklight()
 #define D_LCD_PIN_RS   0
 #define D_LCD_PIN_RW   1
 #define D_LCD_PIN_E    2
@@ -225,10 +227,15 @@
 #define SSD1803_SA0    0x78
 #define SSD1803_SA1    0x7A
 
-/* US2066 I2C slave address */
+/* US2066/SSD1311 I2C slave address */
 #define US2066_SA0     0x78
 #define US2066_SA1     0x7A
 
+/* AC780 I2C slave address */
+#define AC780_SA0      0x78
+#define AC780_SA1      0x7A
+#define AC780_SA2      0x7C
+#define AC780_SA3      0x7E
 
 //Some native I2C controllers dont support ACK. Set define to '0' to allow code to proceed even without ACK
 //#define LCD_I2C_ACK    0
@@ -285,30 +292,35 @@
 #define LCD_C_PDN      0x00080000  /*Power Down          */
 
 
-// Contrast setting, 5 significant bits (only supported for controllers with extended features)
+// Contrast setting, 6 significant bits (only supported for controllers with extended features)
 // Voltage Multiplier setting, 2 or 3 significant bits (only supported for controllers with extended features)
 #define LCD_DEF_CONTRAST    0x20
 
-//ST7032 EastRising display
-//ST7036 EA DOGM163 display
-//Contrast setting 5 significant bits
+//ST7032 EastRising ERC1602FS-4 display
+//Contrast setting 6 significant bits
 //Voltage Multiplier setting 3 significant bits
 #define LCD_ST7032_CONTRAST 0x18
 #define LCD_ST7032_RAB      0x04
 
+//ST7036 EA DOGM1603 display
+//Contrast setting 6 significant bits
+//Voltage Multiplier setting 3 significant bits
 #define LCD_ST7036_CONTRAST 0x28
 #define LCD_ST7036_RAB      0x04
 
-
 //SSD1803 EA DOGM204 display
-//Contrast setting 5 significant bits
+//Contrast setting 6 significant bits
 //Voltage Multiplier setting 3 significant bits
 #define LCD_SSD1_CONTRAST   0x28
 #define LCD_SSD1_RAB        0x06
 
+//US2066/SSD1311 EastRising ER-OLEDM2002-4 display
+//Contrast setting 8 significant bits, use 6 for compatibility
+#define LCD_US20_CONTRAST   0x3F
+//#define LCD_US20_CONTRAST   0x1F
 
 //PCF2113, PCF2119 display
-//Contrast setting 5 significant bits
+//Contrast setting 6 significant bits
 //Voltage Multiplier setting 2 significant bits
 #define LCD_PCF2_CONTRAST   0x20
 #define LCD_PCF2_S12        0x02
@@ -379,7 +391,7 @@
 
 /** A TextLCD interface for driving 4-bit HD44780-based LCDs
  *
- * @brief Currently supports 8x1, 8x2, 12x2, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2 and 40x4 panels
+ * @brief Currently supports 8x1, 8x2, 12x2, 12x3, 12x4, 16x1, 16x2, 16x3, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2 and 40x4 panels
  *        Interface options include direct mbed pins, I2C portexpander (PCF8474/PCF8574A or MCP23008) or SPI bus shiftregister (74595) and some native I2C or SPI devices 
  *
  */
@@ -387,6 +399,7 @@
 public:
 
     /** LCD panel format */
+    // The commented out types exist but have not yet been tested with the library
     enum LCDType {
 //        LCD6x1     = (LCD_T_A | LCD_T_C6 | LCD_T_R1),     /**<  6x1 LCD panel */          
 //        LCD6x2     = (LCD_T_A | LCD_T_C6 | LCD_T_R2),     /**<  6x2 LCD panel */          
@@ -422,10 +435,12 @@
 //        LCD24x3D   = (LCD_T_D | LCD_T_C24 | LCD_T_R3),    /**< 24x3 LCD panel */                
 //        LCD24x3D1  = (LCD_T_D | LCD_T_C24 | LCD_T_R3),    /**< 24x3 LCD panel */                        
         LCD24x4D   = (LCD_T_D | LCD_T_C24 | LCD_T_R4),    /**< 24x4 LCD panel, special mode KS0078 */                                                          
-//        LCD32x1    = (LCD_T_A | LCD_T_C32 | LCD_T_R1),    /**< 32x1 LCD panel */                
+//        LCD32x1    = (LCD_T_A | LCD_T_C32 | LCD_T_R1),    /**< 32x1 LCD panel */
+//        LCD32x1C   = (LCD_T_C | LCD_T_C32 | LCD_T_R1),    /**< 32x1 LCD panel (actually 16x2) */                                        
 //        LCD32x2    = (LCD_T_A | LCD_T_C32 | LCD_T_R2),    /**< 32x2 LCD panel */                        
 //        LCD32x4    = (LCD_T_A | LCD_T_C32 | LCD_T_R4),    /**< 32x4 LCD panel */                        
 //        LCD40x1    = (LCD_T_A | LCD_T_C40 | LCD_T_R1),    /**< 40x1 LCD panel */                        
+//        LCD40x1C   = (LCD_T_C | LCD_T_C40 | LCD_T_R1),    /**< 40x1 LCD panel (actually 20x2) */                        
         LCD40x2    = (LCD_T_A | LCD_T_C40 | LCD_T_R2),    /**< 40x2 LCD panel */                
         LCD40x4    = (LCD_T_E | LCD_T_C40 | LCD_T_R4)     /**< 40x4 LCD panel, Two controller version */                        
     };
@@ -446,10 +461,12 @@
         PCF2119_3V3 = 10 | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_CTR),                          /**<  PCF2119 3V3 with Booster, 4/8 bit, I2C       */                           
 //        PCF2119_5V  = 11 | (LCD_C_PAR | LCD_C_I2C),                                                      /**<  PCF2119 5V no Booster, 4/8 bit, I2C          */
         AIP31068    = 12 | (LCD_C_SPI3_9  | LCD_C_I2C | LCD_C_BST),                                      /**<  AIP31068 I2C, SPI3                           */                           
-        SSD1803_3V3 = 13 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_I2C | LCD_C_BST | LCD_C_CTR | LCD_C_PDN)   /**<  SSD1803 3V3 with Booster, 4/8 bit, I2C, SPI3 */
-//        SSD1803_5V  = 14 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_I2C | LCD_C_BST | LCD_C_CTR | LCD_C_PDN) /**<  SSD1803 3V3 with Booster, 4/8 bit, I2C, SPI3 */
-//        US2066_3V3  = 15 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_I2C | LCD_C_BST | LCD_C_CTR | LCD_C_PDN) /**<  US2066  3V3 with Booster, 4/8 bit, I2C, SPI3 */
-//        PT6314      = 16 | (LCD_C_PAR | LCD_C_SPI3_16 | LCD_C_CTR | LCD_C_PDN)                         /**<  PT6314  VFD, 4/8 bit, SPI3                   */
+        SSD1803_3V3 = 13 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_I2C | LCD_C_BST | LCD_C_CTR | LCD_C_PDN),  /**<  SSD1803 3V3 with Booster, 4/8 bit, I2C, SPI3 */
+//        SSD1803_5V  = 14 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_I2C | LCD_C_BST | LCD_C_CTR | LCD_C_PDN),  /**<  SSD1803 3V3 with Booster, 4/8 bit, I2C, SPI3 */
+        US2066_3V3  = 15 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_I2C | LCD_C_CTR | LCD_C_PDN),              /**<  US2066/SSD1311 3V3, 4/8 bit, I2C, SPI3 */
+//        PT6314      = 16 | (LCD_C_PAR | LCD_C_SPI3_16 | LCD_C_CTR | LCD_C_PDN),                          /**<  PT6314  VFD, 4/8 bit, SPI3                   */
+//        AC780       = 17 | (LCD_C_PAR | LCD_C_SPI4 | LCD_C_I2C | LCD_C_PDN),                             /**<  AC780  4/8 bit, SPI, I2C                     */
+//        KS0066      = 18 | (LCD_C_PAR | LCD_C_SPI4 | LCD_C_I2C | LCD_C_PDN)                              /**<  KS0066i == AC780  4/8 bit, SPI, I2C          */
     };
 
 
@@ -473,6 +490,19 @@
         LightOn          /**<  Backlight On */            
     };
 
+   /** LCD Blink control (UDC), supported for some Controllers */
+    enum LCDBlink {
+        BlinkOff,        /**<  Blink Off */    
+        BlinkOn          /**<  Blink On  */            
+    };
+
+   /** LCD Orientation control, supported for some Controllers */
+    enum LCDOrient {
+        Top,             /**<  Top view */    
+        Bottom           /**<  Upside down view */            
+    };
+
+
 #if DOXYGEN_ONLY
     /** Write a character to the LCD
      *
@@ -544,13 +574,20 @@
      */
     void setBacklight(LCDBacklight backlightMode); 
 
-    /** Set User Defined Characters
+    /** Set User Defined Characters (UDC)
      *
      * @param unsigned char c   The Index of the UDC (0..7)
      * @param char *udc_data    The bitpatterns for the UDC (8 bytes of 5 significant bits)     
      */
     void setUDC(unsigned char c, char *udc_data);
 
+    /** Set UDC Blink
+     * setUDCBlink method is supported by some compatible devices (eg SSD1803) 
+     *
+     * @param blinkMode The Blink mode (BlinkOff, BlinkOn)
+     */
+    void setUDCBlink(LCDBlink blinkMode);
+
     /** Set Contrast
      * setContrast method is supported by some compatible devices (eg ST7032i) that have onboard LCD voltage generation
      * Code imported from fork by JH1PJL
@@ -560,7 +597,6 @@
      */
     void setContrast(unsigned char c = LCD_DEF_CONTRAST);
 
-
     /** Set Power
      * setPower method is supported by some compatible devices (eg SSD1803) that have power down modes
      *
@@ -569,6 +605,14 @@
      */
     void setPower(bool powerOn = true);
 
+    /** Set Orient
+     * setOrient method is supported by some compatible devices (eg SSD1803, US2066) that have top/bottom view modes
+     *
+     * @param LCDOrient orient Orientation 
+     * @return none
+     */
+    void setOrient(LCDOrient orient = Top);
+
 
 //test
 //    void _initCtrl();    
@@ -626,7 +670,7 @@
   * Methods resets the RS bit and provides the required timing for the command.
   */
     void _writeCommand(int command);
-
+    
 /** Low level data byte write operation to LCD controller (serial or parallel).
   * Methods sets the RS bit and provides the required timing for the data.
   */   
@@ -656,7 +700,7 @@
   * Depending on the RS pin this byte will be interpreted as data or command
   */
     virtual void _writeByte(int value);
-    
+
 //Display type
     LCDType _type;
     int _nr_cols;    
@@ -980,9 +1024,6 @@
     SPI *_spi;
     DigitalOut _cs;    
 
-//Test
-    DigitalOut _ps;    
-
    
 // controlbyte to select between data and command. Internal value for serial bus only
     char _controlbyte;   
@@ -1119,8 +1160,6 @@
 #endif
 
 #if(1)
-//Code to be checked out on logic analyser. Not yet tested on hardware..
-
 //------- Start TextLCD_SPI_N_3_24 ---------
 
 /** Create a TextLCD interface using a controller with native SPI3 24 bits interface
@@ -1234,12 +1273,8 @@
     char _controlbyte;   
     
 //Backlight
-    DigitalOut *_bl;    
-    
-    
-//Test
-    DigitalOut _ps;    
-    
+    DigitalOut *_bl;       
+   
 };
 
 //---------- End TextLCD_I2C_N ------------