for

Dependents:   LV_FGSE_Controller_Interface

Revision:
36:9f5f86dfd44a
Parent:
35:311be6444a39
Child:
37:ce348c002929
--- a/TextLCD.h	Fri Oct 10 15:47:56 2014 +0000
+++ b/TextLCD.h	Tue Nov 25 19:21:18 2014 +0000
@@ -16,6 +16,7 @@
  *               2014, v14: WH, Added support for PT6314 (VFD), added setOrient() method for supported devices (eg SSD1803, US2066), added Double Height lines for supported devices, 
  *                              added 16 UDCs for supported devices (eg PCF2103), moved UDC defines to TextLCD_UDC file, added TextLCD_Config.h for feature and footprint settings.
  *               2014, v15: WH, Added AC780 support, added I2C expander modules, fixed setBacklight() for inverted logic modules. Fixed bug in LCD_SPI_N define 
+ *               2014, v16: WH, Added ST7070 and KS0073 support, added setIcon(), clrIcon() and setInvert() method for supported devices  
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -116,12 +117,13 @@
 // Interface encoded in b31..b24
 #define LCD_C_BUS_MSK  0xFF000000
 #define LCD_C_PAR      0x01000000  /*Parallel 4 or 8 bit data, E pin, RS pin, RW=GND            */
-#define LCD_C_SPI3_9   0x02000000  /*SPI 3 line (MOSI, SCL, CS pins),  9 bits (RS + 8 Data)     */
-#define LCD_C_SPI3_10  0x04000000  /*SPI 3 line (MOSI, SCL, CS pins), 10 bits (RS, RW + 8 Data) */
-#define LCD_C_SPI3_16  0x08000000  /*SPI 3 line (MOSI, SCL, CS pins), 16 bits (RS, RW + 8 Data) */
-#define LCD_C_SPI3_24  0x10000000  /*SPI 3 line (MOSI, SCL, CS pins), 24 bits (RS, RW + 8 Data) */
-#define LCD_C_SPI4     0x20000000  /*SPI 4 line (MOSI, SCL, CS, RS pin), RS pin + 8 Data        */
-#define LCD_C_I2C      0x40000000  /*I2C (SDA, SCL pin), 8 control bits (Co, RS, RW) + 8 Data   */
+#define LCD_C_SPI3_8   0x02000000  /*SPI 3 line (MOSI, SCL, CS pins),  8 bits (Count Command initiates Data transfer) */
+#define LCD_C_SPI3_9   0x04000000  /*SPI 3 line (MOSI, SCL, CS pins),  9 bits (RS + 8 Data)     */
+#define LCD_C_SPI3_10  0x08000000  /*SPI 3 line (MOSI, SCL, CS pins), 10 bits (RS, RW + 8 Data) */
+#define LCD_C_SPI3_16  0x10000000  /*SPI 3 line (MOSI, SCL, CS pins), 16 bits (RS, RW + 8 Data) */
+#define LCD_C_SPI3_24  0x20000000  /*SPI 3 line (MOSI, SCL, CS pins), 24 bits (RS, RW + 8 Data) */
+#define LCD_C_SPI4     0x40000000  /*SPI 4 line (MOSI, SCL, CS, RS pin), RS pin + 8 Data        */
+#define LCD_C_I2C      0x80000000  /*I2C (SDA, SCL pin), 8 control bits (Co, RS, RW) + 8 Data   */
 // Features encoded in b23..b16
 #define LCD_C_FTR_MSK  0x00FF0000 
 #define LCD_C_BST      0x00010000  /*Booster             */
@@ -157,11 +159,11 @@
         LCD8x2B    = (LCD_T_D | LCD_T_C8 | LCD_T_R2),     /**<  8x2 LCD panel (actually 16x1) */                  
         LCD12x1    = (LCD_T_A | LCD_T_C12 | LCD_T_R1),    /**< 12x1 LCD panel */                          
         LCD12x2    = (LCD_T_A | LCD_T_C12 | LCD_T_R2),    /**< 12x2 LCD panel */                          
-        LCD12x3D   = (LCD_T_D | LCD_T_C12 | LCD_T_R3),    /**< 12x3 LCD panel, special mode PCF21XX */                                  
-        LCD12x3D1  = (LCD_T_D1 | LCD_T_C12 | LCD_T_R3),   /**< 12x3 LCD panel, special mode PCF21XX */                                          
+        LCD12x3D   = (LCD_T_D | LCD_T_C12 | LCD_T_R3),    /**< 12x3 LCD panel, special mode PCF21XX, KS0073 */                                  
+        LCD12x3D1  = (LCD_T_D1 | LCD_T_C12 | LCD_T_R3),   /**< 12x3 LCD panel, special mode PCF21XX, KS0073 */                                          
 //        LCD12x3G   = (LCD_T_G | LCD_T_C12 | LCD_T_R3),    /**< 12x3 LCD panel, special mode ST7036 */                                      
         LCD12x4    = (LCD_T_A | LCD_T_C12 | LCD_T_R4),    /**< 12x4 LCD panel */                  
-        LCD12x4D   = (LCD_T_B | LCD_T_C12 | LCD_T_R4),    /**< 12x4 LCD panel, special mode PCF21XX */                                          
+        LCD12x4D   = (LCD_T_B | LCD_T_C12 | LCD_T_R4),    /**< 12x4 LCD panel, special mode PCF21XX, KS0073 */                                          
         LCD16x1    = (LCD_T_A | LCD_T_C16 | LCD_T_R1),    /**< 16x1 LCD panel */                  
         LCD16x1C   = (LCD_T_C | LCD_T_C16 | LCD_T_R1),    /**< 16x1 LCD panel (actually 8x2) */          
         LCD16x2    = (LCD_T_A | LCD_T_C16 | LCD_T_R2),    /**< 16x2 LCD panel (default) */
@@ -203,7 +205,7 @@
         ST7036_5V   =  3 | (LCD_C_PAR | LCD_C_SPI4    | LCD_C_I2C | LCD_C_BST | LCD_C_CTR),               /**<  ST7036  5V no Booster, 4/8 bit, SPI4, I2C    */   
         ST7032_3V3  =  4 | (LCD_C_PAR | LCD_C_SPI4    | LCD_C_I2C | LCD_C_BST | LCD_C_CTR),               /**<  ST7032  3V3 with Booster, 4/8 bit, SPI4, I2C */   
         ST7032_5V   =  5 | (LCD_C_PAR | LCD_C_SPI4    | LCD_C_I2C | LCD_C_CTR),                           /**<  ST7032  5V no Booster, 4/8 bit, SPI4, I2C    */           
-        KS0078      =  6 | (LCD_C_PAR | LCD_C_SPI3_24),                                                   /**<  KS0078  24x4 support, 4/8 bit, SPI3          */                   
+        KS0078      =  6 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_PDN),                                       /**<  KS0078  24x4 support, 4/8 bit, SPI3          */                   
         PCF2103_3V3 =  7 | (LCD_C_PAR | LCD_C_I2C),                                                       /**<  PCF2103 3V3 no Booster, 4/8 bit, I2C         */                                   
         PCF2113_3V3 =  8 | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_CTR),                           /**<  PCF2113 3V3 with Booster, 4/8 bit, I2C       */                           
         PCF2116_3V3 =  9 | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST),                                       /**<  PCF2116 3V3 with Booster, 4/8 bit, I2C       */                           
@@ -215,8 +217,10 @@
 //        SSD1803_5V  = 15 | (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  = 16 | (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      = 17 | (LCD_C_PAR | LCD_C_SPI3_16 | LCD_C_CTR),                                       /**<  PT6314  VFD, 4/8 bit, SPI3                   */
-        AC780       = 18 | (LCD_C_PAR | LCD_C_SPI4 | LCD_C_I2C | LCD_C_PDN)                               /**<  AC780/KS0066i 4/8 bit, SPI, I2C              */
-//        WS0012      = 19 | (LCD_C_PAR | LCD_C_SPI3_10 | LCD_C_I2C | LCD_C_PDN)                            /**<  WS0012 4/8 bit, SPI, I2C                     */
+        AC780       = 18 | (LCD_C_PAR | LCD_C_SPI4 | LCD_C_I2C | LCD_C_PDN),                              /**<  AC780/KS0066i 4/8 bit, SPI, I2C              */
+//        WS0012      = 19 | (LCD_C_PAR | LCD_C_SPI3_10 | LCD_C_I2C | LCD_C_PDN),                           /**<  WS0012 4/8 bit, SPI, I2C                     */
+        ST7070      = 20 | (LCD_C_PAR | LCD_C_SPI3_8 | LCD_C_SPI4),                                       /**<  ST7070 4/8 bit, SPI3                         */
+        KS0073      = 21 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_PDN)                                        /**<  KS0073 4/8 bit, SPI3                         */
     };
 
 
@@ -304,7 +308,7 @@
      *
      * @param column  The horizontal position from the left, indexed from 0
      * @param row     The vertical position from the top, indexed from 0
-     * @param return  The memoryaddress of screen column and row location
+     * @return        The memoryaddress of screen column and row location
      */
     int  getAddress(int column, int row);     
     
@@ -321,13 +325,13 @@
 
     /** Return the number of rows
      *
-     * @param return  The number of rows
+     * @return  The number of rows
      */
     int rows();
     
     /** Return the number of columns
      *
-     * @param return  The number of columns
+     * @return  The number of columns
      */  
     int columns();  
 
@@ -356,7 +360,7 @@
      */
     void setUDC(unsigned char c, char *udc_data);
 
-    /** Set UDC Blink
+    /** Set UDC Blink and Icon blink
      * setUDCBlink method is supported by some compatible devices (eg SSD1803) 
      *
      * @param blinkMode The Blink mode (BlinkOff, BlinkOn)
@@ -397,11 +401,32 @@
      */
     void setBigFont(LCDBigFont lines);
 
-//test
-//    void _initCtrl();    
-//    int _column;
-//    int _row;
-    
+    /** Set Icons
+    *
+    * @param unsigned char idx   The Index of the icon pattern (0..15) for KS0073 and similar controllers
+    *                            and Index (0..31) for PCF2103 and similar controllers  
+    * @param unsigned char data  The bitpattern for the icons (6 lsb for KS0073 bitpattern (5 lsb for KS0078) and 2 msb for blinkmode)       
+    *                            The bitpattern for the PCF2103 icons is 5 lsb (UDC 0..2) and 5 lsb for blinkmode (UDC 4..6)         
+    */    
+    void setIcon(unsigned char idx, unsigned char data);
+
+    /** Clear Icons
+     *
+     * @param  none
+     * @return none
+     */
+    //@TODO Add support for 40x4 dual controller       
+    void clrIcon();
+
+   /** Set Invert
+     * setInvert method is supported by some compatible devices (eg KS0073) to swap between black and white 
+     *
+     * @param bool invertOn  Invert on/off   
+     * @return none
+     */
+   //@TODO Add support for 40x4 dual controller  
+   void setInvert(bool invertOn);
+
 protected:
 
    /** LCD controller select, mainly used for LCD40x4
@@ -411,6 +436,12 @@
         _LCDCtrl_1,  /*<  Secondary */            
     };
 
+    /** LCD Datalength control to select between 4 or 8 bit data/commands, used for native Serial interface */
+    enum _LCDDatalength {
+        _LCD_DL_4 = 0x00,  /**<  Datalength 4 bit */    
+        _LCD_DL_8 = 0x10   /**<  Datalength 8 bit */            
+    };
+
     /** Create a TextLCD_Base interface
       * @brief Base class, can not be instantiated
       *
@@ -423,13 +454,21 @@
     virtual int _putc(int value);
     virtual int _getc();
 
-/** Low level method for LCD controller
+/** Medium level initialisation method for LCD controller
+  *  @param _LCDDatalength dl sets the datalength of data/commands
+  *  @return none
   */
-    void _init();    
+    void _init(_LCDDatalength dl = _LCD_DL_4);     
 
 /** Low level initialisation method for LCD controller
+  *   Set number of lines, fonttype, no cursor etc
+  *   The controller is accessed in 4-bit parallel mode either directly via mbed pins or through I2C or SPI expander.
+  *   Some controllers also support native I2C or SPI interfaces. 
+  *
+  *  @param _LCDDatalength dl sets the 4 or 8 bit datalength of data/commands. Required for some native serial modes.
+  *  @return none  
   */
-    void _initCtrl();    
+    void _initCtrl(_LCDDatalength dl = _LCD_DL_4);    
 
 /** Low level character address set method
   */  
@@ -509,13 +548,12 @@
     int _row;
     LCDCursor _currentCursor; 
 
-// Function mode saved to allow switch between Instruction sets after initialisation time 
+// Function modes saved to allow switch between Instruction sets after initialisation time 
+    int _function, _function_1, _function_x;
+
 // Icon, Booster mode and contrast saved to allow contrast change at later time
 // Only available for controllers with added features
-    int _function, _function_1, _function_x;
-    int _icon_power;
-    int _contrast;    
-       
+    int _icon_power, _contrast;          
 };
 
 //--------- End TextLCD_Base -----------
@@ -760,6 +798,67 @@
 //---------- End TextLCD_SPI_N ------------
 
 
+//-------- Start TextLCD_SPI_N_3_8 --------
+#if(LCD_SPI_N_3_8 == 1) /* Native SPI bus     */
+
+class TextLCD_SPI_N_3_8 : public TextLCD_Base {    
+public:
+ /** Create a TextLCD interface using a controller with a native SPI3 8 bits interface
+   * This mode is supported by ST7070. Note that implementation in TexTLCD is not very efficient due to
+   * structure of the TextLCD library: each databyte is written separately and requires a separate 'count command' set to 1 byte.
+   *
+   * @param spi             SPI Bus
+   * @param cs              chip select pin (active low)
+   * @param type            Sets the panel size/addressing mode (default = LCD16x2)
+   * @param bl              Backlight control line (optional, default = NC)  
+   * @param ctrl            LCD controller (default = ST7070) 
+   */       
+  TextLCD_SPI_N_3_8(SPI *spi, PinName cs, LCDType type = LCD16x2, PinName bl = NC, LCDCtrl ctrl = ST7070);
+
+  virtual ~TextLCD_SPI_N_3_8(void);
+
+private:
+
+/** Implementation of pure Virtual Low level writes to LCD Bus (serial native)
+  * Set the Enable pin.
+  */
+    virtual void _setEnable(bool value);
+
+/** Implementation of pure Virtual Low level writes to LCD Bus (serial native)
+  * Set the RS pin (0 = Command, 1 = Data).
+  */   
+    virtual void _setRS(bool value);  
+
+/** Implementation of pure Virtual Low level writes to LCD Bus (serial native)
+  * Set the BL pin (0 = Backlight Off, 1 = Backlight On).
+  */   
+    virtual void _setBL(bool value);
+    
+/** Implementation of pure Virtual Low level writes to LCD Bus (serial native)
+  * Set the databus value (4 bit).
+  */   
+    virtual void _setData(int value);
+
+/** Low level writes to LCD serial bus only (serial native)
+  */
+    virtual void _writeByte(int value);
+   
+// SPI bus        
+    SPI *_spi;
+    DigitalOut _cs;    
+
+// controlbyte to select between data and command. Internal value for serial bus only
+    char _controlbyte;   
+    
+//Backlight    
+    DigitalOut *_bl;
+};
+ 
+#endif /* Native SPI bus     */  
+//------- End TextLCD_SPI_N_3_8 -----------
+
+
+
 //------- Start TextLCD_SPI_N_3_9 ---------
 #if(LCD_SPI_N_3_9 == 1) /* Native SPI bus     */
 //Code checked out on logic analyser. Not yet tested on hardware..
@@ -811,7 +910,6 @@
 // SPI bus        
     SPI *_spi;
     DigitalOut _cs;    
-
    
 // controlbyte to select between data and command. Internal value for serial bus only
     char _controlbyte;   
@@ -873,8 +971,7 @@
 // SPI bus        
     SPI *_spi;
     DigitalOut _cs;    
-    
-   
+       
 // controlbyte to select between data and command. Internal value for serial bus only
     char _controlbyte;