TextLCD
Revision 10:dd9b3a696acd, committed 2013-02-04
- Comitter:
- wim
- Date:
- Mon Feb 04 21:48:24 2013 +0000
- Parent:
- 9:0893d986e717
- Child:
- 11:9ec02df863a1
- Commit message:
- Added support for 24x4 LCDs using KS0078 controller; Added Cursor On/Off
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 Thu Jan 31 19:46:00 2013 +0000 +++ b/TextLCD.cpp Mon Feb 04 21:48:24 2013 +0000 @@ -42,10 +42,58 @@ writeByte(0x2); // 4-bit mode wait(0.000040f); // most instructions take 40us - writeCommand(0x28); // Function set 001 BW N F - - - writeCommand(0x0C); - writeCommand(0x06); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes - cls(); + // Display is now in 4-bit mode + switch (_type) { + case LCD8x1: + writeCommand(0x20); // Function set 001 BW N F - - + // N=0 (1 line) + // F=0 (5x7 dots font) + break; + + case LCD24x4: + // Special mode for KS0078 + writeCommand(0x2A); // Function set 001 BW N RE DH REV + // N=1 (Dont care for KS0078) + // RE=0 (Extended Regs, special mode for KS0078) + // DH=1 (Disp shift, special mode for KS0078) + // REV=0 (Reverse, special mode for KS0078) + + writeCommand(0x2E); // Function set 001 BW N RE DH REV + // N=1 (Dont care for KS0078) + // RE=1 (Ena Extended Regs, special mode for KS0078) + // DH=1 (Disp shift, special mode for KS0078) + // REV=0 (Reverse, special mode for KS0078) + + writeCommand(0x09); // Ext Function set 0000 1 FW BW NW + // FW=0 (5-dot font, special mode for KS0078) + // BW=0 (Cur BW invert disable, special mode for KS0078) + // NW=1 (4 Line, special mode for KS0078) + + writeCommand(0x2A); // Function set 001 BW N RE DH REV + // N=1 (Dont care for KS0078) + // RE=0 (Dis. Extended Regs, special mode for KS0078) + // DH=1 (Disp shift, special mode for KS0078) + // REV=0 (Reverse, special mode for KS0078) + break; + + default: + writeCommand(0x28); // Function set 001 BW N F - - + // N=1 (2 lines) + // F=0 (5x7 dots font) + + break; + } + + writeCommand(0x0C); // Display Ctrl 0000 1 D C B + // Display On, Cursor Off, Blink Off + _cursor = CurOff; + + writeCommand(0x06); // Entry Mode 0000 01 CD S + // Cursor Direction and Display Shift + // CD=1 (Cur incr) + // S=0 (No display shift) + + cls(); } @@ -184,6 +232,19 @@ return 0x54 + column; } +// Special mode for KS0078 + case LCD24x4: + switch (row) { + case 0: + return 0x00 + column; + case 1: + return 0x20 + column; + case 2: + return 0x40 + column; + case 3: + return 0x60 + column; + } + // Not sure about this one, seems wrong. case LCD16x2B: return 0x00 + (row * 40) + column; @@ -229,6 +290,7 @@ return 20; case LCD24x2: + case LCD24x4: return 24; case LCD40x2: @@ -255,9 +317,34 @@ case LCD16x4: case LCD20x4: + case LCD24x4: return 4; default: return 0; } } + + +TextLCD::LCDCursor TextLCD::cursor(TextLCD::LCDCursor show) { + LCDCursor cur = _cursor; + + switch (show) { + case CurOn : writeCommand(0x0F); // Cursor on and Blink char + wait_us(40); + _cursor = show; + break; + case CurOff : writeCommand(0x0C); + wait_us(40); + _cursor = show; + break; + default : + break; + + } + return cur; +} + + + +
--- a/TextLCD.h Thu Jan 31 19:46:00 2013 +0000 +++ b/TextLCD.h Mon Feb 04 21:48:24 2013 +0000 @@ -28,7 +28,7 @@ /** A TextLCD interface for driving 4-bit HD44780-based LCDs * - * Currently supports 8x1, 8x2, 16x2, 16x4, 20x2, 20x4, 24x2 and 40x2 panels + * Currently supports 8x1, 8x2, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4 and 40x2 panels * * @code * #include "mbed.h" @@ -42,6 +42,7 @@ * @endcode */ + class TextLCD : public Stream { public: @@ -55,9 +56,17 @@ LCD20x2, /**< 20x2 LCD panel */ LCD20x4, /**< 20x4 LCD panel */ LCD24x2, /**< 24x2 LCD panel */ + LCD24x4, /**< 24x4 LCD panel, special mode KS0078 */ LCD40x2 /**< 40x2 LCD panel */ }; + /** LCD Cursor control */ + enum LCDCursor { + CurOn, + CurOff + }; + + /** Create a TextLCD interface * * @param rs Instruction/data control line @@ -89,17 +98,46 @@ */ void locate(int column, int row); + + /** Return the memoryaddress of screen column and row location + * + * @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 + */ int getAddress(int column, int row); + + + /** Set the memoryaddress of screen column and row location + * + * @param column The horizontal position from the left, indexed from 0 + * @param row The vertical position from the top, indexed from 0 + */ void setAddress(int column, int row); + /** Set the Cursormode + * + * @param show The Cursor mode (CurOn or CurOff) + * @param return The current Cursor mode + */ + LCDCursor cursor(LCDCursor show); + /** Clear the screen and locate to 0,0 */ void cls(); + /** Return the number of rows + * + * @param return The number of rows + */ int rows(); - int columns(); + + /** Return the number of columns + * + * @param return The number of columns + */ + int columns(); protected: - // Stream implementation functions virtual int _putc(int value); virtual int _getc(); @@ -116,6 +154,7 @@ int _column; int _row; + LCDCursor _cursor; }; #endif