made some changes in config header file to make this library work with 1602A display and PCF8574AT I2C-bus interface
Fork of TextLCD by
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
