Wim Huiskamp / TextLCD

Dependents:   Projeto_CCM_Maquinas_MotorPasso Projeto_CCM_Maquinas_MotorDC

Revision:
33:900a94bc7585
Parent:
32:59c4b8f648d4
Child:
34:e5a0dcb43ecc
--- 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 ------------