1

Dependents:   Program_R11

Revision:
26:bd897a001012
Parent:
25:6162b31128c9
Child:
27:22d5086f6ba6
--- a/TextLCD.h	Sat May 10 21:34:51 2014 +0000
+++ b/TextLCD.h	Fri May 30 15:05:13 2014 +0000
@@ -9,6 +9,7 @@
  *               2013, v07: WH, Added support for backlight and include portdefinitions for LCD2004 Module from DFROBOT
  *               2014, v08: WH, Refactored in Base and Derived Classes to deal with mbed lib change regarding 'NC' defined DigitalOut pins
  *               2014, v09: WH/EO, Added Class for Native SPI controllers such as ST7032 
+ *               2014, v10: WH, Added Class for Native I2C controllers such as ST7032i, Added support for MCP23008 I2C portexpander, Added support for Adafruit module  
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -34,11 +35,10 @@
 
 #include "mbed.h"
 
-
 /** A TextLCD interface for driving 4-bit HD44780-based LCDs
  *
  * Currently supports 8x1, 8x2, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2 and 40x4 panels
- * Interface options include direct mbed pins, I2C portexpander (PCF8474, PCF8574A) or SPI bus shiftregister (74595)
+ * Interface options include direct mbed pins, I2C portexpander (PCF8474, PCF8574A, MCP23008) or SPI bus shiftregister (74595)
  * Supports some controllers that provide internal DC/DC converters for VLCD or VLED. 
  *
  * @code
@@ -55,7 +55,7 @@
  * //TextLCD_SPI lcd(&spi_lcd, p8, TextLCD::LCD40x4);                    // SPI bus, CS pin, LCD Type  
  * TextLCD_I2C lcd(&i2c_lcd, 0x42, TextLCD::LCD20x4);                  // I2C bus, PCF8574 Slaveaddress, LCD Type
  * //TextLCD_I2C lcd(&i2c_lcd, 0x42, TextLCD::LCD16x2, TextLCD::WS0010); // I2C bus, PCF8574 Slaveaddress, LCD Type, Device Type
- * //TextLCD_SPI_N lcd(&spi_lcd, p8, p9);                                  // SPI bus, CS pin, RS pin, LCDType=LCD16x2, BL=NC, LCDTCtrl=ST7032   
+ * //TextLCD_SPI_N lcd(&spi_lcd, p8, p9);                                // SPI bus, CS pin, RS pin, LCDType=LCD16x2, BL=NC, LCDTCtrl=ST7032   
  * 
  * int main() {
  *   lcd.printf("Hello World!\n");
@@ -63,14 +63,23 @@
  * @endcode
  */
 
-//Pin Defines for I2C PCF8574 and SPI 74595 Bus interfaces
+
+//Pin Defines for I2C PCF8574/PCF8574A or MCP23008 and SPI 74595 bus expander interfaces
 //LCD and serial portexpanders should be wired accordingly 
 //
-#if (1)
+//Select Hardware module (one option only)
+#define DEFAULT        1
+#define ADAFRUIT       0
+#define DFROBOT        0
+
+
+#if (DEFAULT==1)
 //Definitions for hardware used by WH 
+//This hardware supports the I2C bus expander (PCF8574/PCF8574A or MCP23008) and SPI bus expander (74595) interfaces
+//
 //Note: LCD RW pin must be connected to GND
 //      E2 is used for LCD40x4 (second controller)
-//      BL may be used for future expansion to control backlight
+//      BL may be used to control backlight
 #define D_LCD_PIN_D4   0
 #define D_LCD_PIN_D5   1
 #define D_LCD_PIN_D6   2
@@ -82,12 +91,40 @@
 
 #define D_LCD_PIN_RW   D_LCD_PIN_E2
 
-#else
+//Select I2C Portexpander type (one option only)
+#define PCF8574        1
+#define MCP23008       0
+#endif
 
+#if (ADAFRUIT==1)
+//Definitions for i2cspilcdbackpack from Adafruit, See http://www.ladyada.net/products/i2cspilcdbackpack
+//This hardware supports both an I2C expander (MCP23008) and an SPI expander (74595) selectable by a jumper.
+//
+//Note: LCD RW pin must be kept LOW
+//      E2 is not available on this hardware and so it does not support LCD40x4 (second controller)
+//      BL is used to control backlight
+#define D_LCD_PIN_0    0
+#define D_LCD_PIN_RS   1
+#define D_LCD_PIN_E    2
+#define D_LCD_PIN_D4   3
+#define D_LCD_PIN_D5   4
+#define D_LCD_PIN_D6   5
+#define D_LCD_PIN_D7   6
+#define D_LCD_PIN_BL   7
+
+#define D_LCD_PIN_E2   D_LCD_PIN_0
+
+//Force I2C portexpander type
+#define PCF8574        0
+#define MCP23008       1
+#endif
+
+#if (DFROBOT==1)
 //Definitions for LCD2004 Module from DFROBOT, See http://arduino-info.wikispaces.com/LCD-Blue-I2C
-//This hardware is different from earlier/different Arduino I2C LCD displays
+//This hardware uses PCF8574 and is different from earlier/different Arduino I2C LCD displays
+//
 //Note: LCD RW pin must be kept LOW
-//      E2 is not available on default Arduino hardware and does not support LCD40x4 (second controller)
+//      E2 is not available on default Arduino hardware and so it does not support LCD40x4 (second controller)
 //      BL is used to control backlight
 #define D_LCD_PIN_RS   0
 #define D_LCD_PIN_RW   1
@@ -99,9 +136,13 @@
 #define D_LCD_PIN_D7   7
 
 #define D_LCD_PIN_E2   D_LCD_PIN_RW
+
+//Force I2C portexpander type
+#define PCF8574        1
+#define MCP23008       0
 #endif
 
-//Bitpattern Defines for I2C PCF8574 and SPI 74595 Bus
+//Bitpattern Defines for I2C PCF8574/PCF8574A, MCP23008 and SPI 74595 Bus expanders
 //
 #define D_LCD_D4       (1<<D_LCD_PIN_D4)
 #define D_LCD_D5       (1<<D_LCD_PIN_D5)
@@ -113,10 +154,56 @@
 #define D_LCD_BL       (1<<D_LCD_PIN_BL)
 //#define D_LCD_RW       (1<<D_LCD_PIN_RW)
 
-
 #define D_LCD_BUS_MSK  (D_LCD_D4 | D_LCD_D5 | D_LCD_D6 | D_LCD_D7)
 #define D_LCD_BUS_DEF  0x00
 
+/* PCF8574/PCF8574A I2C portexpander slave address */
+#define PCF8574_SA0   0x40
+#define PCF8574_SA1   0x42
+#define PCF8574_SA2   0x44
+#define PCF8574_SA3   0x46
+#define PCF8574_SA4   0x48
+#define PCF8574_SA5   0x4A
+#define PCF8574_SA6   0x4C
+#define PCF8574_SA7   0x4E
+
+#define PCF8574A_SA0  0x70
+#define PCF8574A_SA1  0x72
+#define PCF8574A_SA2  0x74
+#define PCF8574A_SA3  0x76
+#define PCF8574A_SA4  0x78
+#define PCF8574A_SA5  0x7A
+#define PCF8574A_SA6  0x7C
+#define PCF8574A_SA7  0x7E
+
+/* MCP23008 I2C portexpander slave address */
+#define MCP23008_SA0  0x40
+#define MCP23008_SA1  0x42
+#define MCP23008_SA2  0x44
+#define MCP23008_SA3  0x46
+#define MCP23008_SA4  0x48
+#define MCP23008_SA5  0x4A
+#define MCP23008_SA6  0x4C
+#define MCP23008_SA7  0x4E
+
+
+/* MCP23008 I2C portexpander internal registers */
+#define IODIR         0x00
+#define IPOL          0x01
+#define GPINTEN       0x02
+#define DEFVAL        0x03
+#define INTCON        0x04
+#define IOCON         0x05
+#define GPPU          0x06
+#define INTF          0x07
+#define INTCAP        0x08
+#define GPIO          0x09
+#define OLAT          0x0A
+
+
+/* ST7032I I2C slave address */
+#define ST7032_SA     0x7C
+
 
 /** Some sample User Defined Chars 5x7 dots */
 const char udc_ae[] = {0x00, 0x00, 0x1B, 0x05, 0x1F, 0x14, 0x1F, 0x00};  //æ
@@ -164,7 +251,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
- *        Interface options include direct mbed pins, I2C portexpander (PCF8474, PCF8574A) or SPI bus shiftregister (74595) 
+ *        Interface options include direct mbed pins, I2C portexpander (PCF8474, PCF8574A) or SPI bus shiftregister (74595) and some native I2C or SPI devices 
  *
  */
 class TextLCD_Base : public Stream {
@@ -191,10 +278,11 @@
 
     /** LCD Controller Device */
     enum LCDCtrl {
-        HD44780,    /**<  HD44780 (default)      */    
-        WS0010,     /**<  WS0010 OLED Controller */    
-        ST7036,      /**<  ST7036                 */   
-        ST7032      /**<  ST7032                 */   
+        HD44780,    /**<  HD44780 (default)       */    
+        WS0010,     /**<  WS0010 OLED Controller  */    
+        ST7036,     /**<  ST7036                  */   
+        ST7032_3V3, /**<  ST7032 3V3 with Booster */   
+        ST7032_5V   /**<  ST7032 5V  no Booster   */           
     };
 
 
@@ -424,26 +512,29 @@
 //--------- Start TextLCD_I2C -----------
 
 
-/** Create a TextLCD interface using an I2C PC8574 or PCF8574A portexpander
+/** Create a TextLCD interface using an I2C PCF8574 (or PCF8574A) or MCP23008 portexpander
   *
   */
 class TextLCD_I2C : public TextLCD_Base {    
 public:
-    /** Create a TextLCD interface using an I2C PC8574 or PCF8574A portexpander
+   /** Create a TextLCD interface using an I2C PCF8574 (or PCF8574A) or MCP23008 portexpander
      *
      * @param i2c             I2C Bus
-     * @param deviceAddress   I2C slave address (PCF8574 or PCF8574A, default = 0x40)
+     * @param deviceAddress   I2C slave address (PCF8574 or PCF8574A, default = PCF8574_SA0 = 0x40)
      * @param type            Sets the panel size/addressing mode (default = LCD16x2)
      * @param ctrl            LCD controller (default = HD44780)                
      */
-    TextLCD_I2C(I2C *i2c, char deviceAddress = 0x40, LCDType type = LCD16x2, LCDCtrl ctrl = HD44780);
+    TextLCD_I2C(I2C *i2c, char deviceAddress = PCF8574_SA0, LCDType type = LCD16x2, LCDCtrl ctrl = HD44780);
 
 private:
 //Low level writes to LCD Bus (serial or parallel)
     virtual void _setEnable(bool value);
     virtual void _setRS(bool value);  
     virtual void _setBL(bool value);
-    virtual void _setData(int value);   
+    virtual void _setData(int value); 
+
+// Write data to MCP23008 I2C portexpander
+    void _write_register (int reg, int value);     
   
 //I2C bus
     I2C *_i2c;
@@ -500,8 +591,8 @@
 //---------- End TextLCD_SPI ------------
 
 
-//--------- Start TextLCD_NativeSPI -----------
 
+//--------- Start TextLCD_SPI_N -----------
 
 /** Create a TextLCD interface using a controller with native SPI interface
   *
@@ -515,9 +606,9 @@
      * @param rs              Instruction/data control line
      * @param type            Sets the panel size/addressing mode (default = LCD16x2)
      * @param bl              Backlight control line (optional, default = NC)  
-     * @param ctrl            LCD controller (default = ST7032)                     
+     * @param ctrl            LCD controller (default = ST7032_3V3)                     
      */
-    TextLCD_SPI_N(SPI *spi, PinName cs, PinName rs, LCDType type = LCD16x2, PinName bl = NC, LCDCtrl ctrl = ST7032);
+    TextLCD_SPI_N(SPI *spi, PinName cs, PinName rs, LCDType type = LCD16x2, PinName bl = NC, LCDCtrl ctrl = ST7032_3V3);
     virtual ~TextLCD_SPI_N(void);
 
 private:
@@ -537,4 +628,40 @@
 
 //---------- End TextLCD_SPI_N ------------
 
+
+//--------- Start TextLCD_I2C_N -----------
+
+/** Create a TextLCD interface using a controller with native I2C interface
+  *
+  */
+class TextLCD_I2C_N : public TextLCD_Base {    
+public:
+    /** Create a TextLCD interface using a controller with native I2C interface
+     *
+     * @param i2c             I2C Bus
+     * @param deviceAddress   I2C slave address (default = 0x)  
+     * @param type            Sets the panel size/addressing mode (default = LCD16x2)
+     * @param ctrl            LCD controller (default = ST7032_3V3)                     
+     */
+    TextLCD_I2C_N(I2C *i2c, char deviceAddress = 0x40, LCDType type = LCD16x2, LCDCtrl ctrl = ST7032_3V3);
+    virtual ~TextLCD_I2C_N(void);
+
+private:
+    virtual void _setEnable(bool value);
+    virtual void _setRS(bool value);  
+    virtual void _setBL(bool value);
+    virtual void _setData(int value);
+    virtual void _writeByte(int value);
+
+//I2C bus
+    I2C *_i2c;
+    char _slaveAddress;
+    
+// Internal bus mirror value for serial bus only
+    char _lcd_bus;   
+};
+
+//---------- End TextLCD_I2C_N ------------
+
+
 #endif