1
Diff: TextLCD.h
- Revision:
- 15:b70ebfffb258
- Parent:
- 14:0c32b66b14b8
- Child:
- 16:c276b75e6585
--- a/TextLCD.h Sun Feb 10 18:43:51 2013 +0000 +++ b/TextLCD.h Tue Feb 19 22:09:09 2013 +0000 @@ -1,7 +1,8 @@ /* mbed TextLCD Library, for a 4-bit LCD based on HD44780 * Copyright (c) 2007-2010, sford, http://mbed.org * 2013, v01: WH, Added LCD types, fixed LCD address issues, added Cursor and UDCs - * 2013, v02: WH, Added I2C and SPI bus interfaces + * 2013, v02: WH, Added I2C and SPI bus interfaces + * 2013, v03: WH, Added support for LCD40x4 which uses 2 controllers * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,15 +28,20 @@ #include "mbed.h" + +//Test Only +//#define LCD40x4Test 0 +#define LCD40x4Test 1 + /** A TextLCD interface for driving 4-bit HD44780-based LCDs * - * Currently supports 8x1, 8x2, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4 and 40x2 panels + * Currently supports 8x1, 8x2, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4 and 40x2 panels * * @code * #include "mbed.h" * #include "TextLCD.h" * - * TextLCD lcd(p15, p16, p17, p18, p19, p20); // RS, E, D4-D7 + * TextLCD lcd(p15, p16, p17, p18, p19, p20); // RS, E, D4-D7, LCDType=LCD16x2 * * int main() { * lcd.printf("Hello World!\n"); @@ -47,19 +53,20 @@ //Pin Defines for I2C PCF8574 and SPI 74595 Bus //LCD and serial portexpanders should be wired accordingly //Note: LCD RW pin must be connected to GND -// E2 may be used for future expansion to LCD40x4 +// E2 is used for LCD40x4 (second controller) // BL may be used for future expansion to control backlight // -#define D_LCD_PIN_D4 0x00 -#define D_LCD_PIN_D5 0x01 -#define D_LCD_PIN_D6 0x02 -#define D_LCD_PIN_D7 0x03 -#define D_LCD_PIN_RS 0x04 -#define D_LCD_PIN_E 0x05 -#define D_LCD_PIN_E2 0x06 -#define D_LCD_PIN_BL 0x07 +#define D_LCD_PIN_D4 0 +#define D_LCD_PIN_D5 1 +#define D_LCD_PIN_D6 2 +#define D_LCD_PIN_D7 3 +#define D_LCD_PIN_RS 4 +#define D_LCD_PIN_E 5 +#define D_LCD_PIN_E2 6 +#define D_LCD_PIN_BL 7 #define D_LCD_BUS_MSK 0x0F +#define D_LCD_BUS_DEF 0x00 //Bitpattern Defines for I2C PCF8574 and SPI 74595 Bus // @@ -112,7 +119,7 @@ /** A TextLCD interface for driving 4-bit HD44780-based LCDs * - * Currently supports 8x1, 8x2, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4 and 40x2 panels + * Currently supports 8x1, 8x2, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2 and 40x4 panels * */ class TextLCD : public Stream { @@ -122,6 +129,8 @@ enum LCDType { LCD8x1, /**< 8x1 LCD panel */ LCD8x2, /**< 8x2 LCD panel */ + LCD12x2, /**< 12x2 LCD panel */ + LCD12x4, /**< 12x4 LCD panel */ LCD16x1, /**< 16x1 LCD panel (actually 8x2) */ LCD16x2, /**< 16x2 LCD panel (default) */ LCD16x2B, /**< 16x2 LCD panel alternate addressing */ @@ -130,7 +139,8 @@ LCD20x4, /**< 20x4 LCD panel */ LCD24x2, /**< 24x2 LCD panel */ LCD24x4, /**< 24x4 LCD panel, special mode KS0078 */ - LCD40x2 /**< 40x2 LCD panel */ + LCD40x2, /**< 40x2 LCD panel */ + LCD40x4 /**< 40x4 LCD panel, Two controller version */ }; /** LCD Cursor control */ @@ -142,14 +152,15 @@ }; - /** Create a TextLCD interface for using regural mbed pins + /** Create a TextLCD interface for using regular mbed pins * * @param rs Instruction/data control line * @param e Enable line (clock) * @param d4-d7 Data lines for using as a 4-bit interface * @param type Sets the panel size/addressing mode (default = LCD16x2) + * @param e2 Enable2 line (clock for second controller, LCD40x4 only) */ - TextLCD(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7, LCDType type = LCD16x2); + TextLCD(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7, LCDType type = LCD16x2, PinName e2 = NC); /** Create a TextLCD interface using an I2C PC8574 portexpander * @@ -243,17 +254,32 @@ enum _LCDBus { _PinBus, /*< Regular mbed pins */ _I2CBus, /*< I2C PCF8574 Portexpander */ - _SPIBus /*< SPI 74595 */ + _SPIBus /*< SPI 74595 Shiftregister */ }; + /* LCD controller select, mainly used for LCD40x4 */ + enum _LCDCtrl { + _LCDCtrl_0, /*< Primary */ + _LCDCtrl_1, /*< Secondary */ + }; + // Stream implementation functions virtual int _putc(int value); virtual int _getc(); +//Low level methods for LCD controller void _init(); + void _initCtrl(); int _address(int column, int row); void _character(int column, int row, int c); + void _setCursor(TextLCD::LCDCursor show); + void _setUDC(unsigned char c, char *udc_data); +//Low level write operations to LCD controller + void _writeByte(int value); + void _writeCommand(int command); + void _writeData(int data); + //Low level writes to LCD Bus (serial or parallel) void _setEnable(bool value); void _setRS(bool value); @@ -263,13 +289,9 @@ //Low level writes to LCD serial bus only void _writeBus(); -//Low level writes to LCD - void _writeByte(int value); - void _writeCommand(int command); - void _writeData(int data); // Regular mbed pins bus - DigitalOut _rs, _e; + DigitalOut _rs, _e, _e2; BusOut _d; // I2C bus @@ -283,16 +305,19 @@ //Bus Interface type _LCDBus _busType; -// Internal bus mirror value for serial only +// Internal bus mirror value for serial bus only char _lcd_bus; //Display type LCDType _type; +//Controller select, mainly used for LCD40x4 + _LCDCtrl _ctrl; + // Cursor int _column; int _row; - LCDCursor _cursor; + LCDCursor _currentCursor; }; #endif