TextLCD_piano adapted to LCD screen with R/W
Fork of TextLCD by
Revision 9:05c9b97e4a91, committed 2018-07-02
- Comitter:
- Aliened
- Date:
- Mon Jul 02 17:58:56 2018 +0000
- Parent:
- 8:308d188a2d3a
- Commit message:
- Compatibility with R/W pin of Character LCD 16 x 2 character LCD display module:; Manufacturer: Newhaven Display Intl ; Manufacturer part number: NHD-0216HZ-FSW-FBW-33V3C-ND ; Part number: NHD-0216HZ-FSW-FBW-33V3C
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 02 21:07:01 2014 +0000 +++ b/TextLCD.cpp Mon Jul 02 17:58:56 2018 +0000 @@ -19,51 +19,60 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ - + #include "TextLCD.h" #include "mbed.h" - -TextLCD::TextLCD(PinName rs, PinName e, PinName d4, PinName d5, - PinName d6, PinName d7, LCDType type) : _rs(rs), - _e(e), _d(d4, d5, d6, d7), - _type(type) { - - _e = 1; + +TextLCD::TextLCD(PinName rs, PinName rw, PinName e, PinName d0, PinName d1, + PinName d2, PinName d3, LCDType type) : _rs(rs), _rw(rw), + _e(e), _d(d0, d1, d2, d3), _type(type) { _rs = 0; // command mode - - wait(0.015); // Wait 15ms to ensure powered up - + _rw = 0; + _e = 0; + _d.output(); // data out + + wait(0.05); // Wait 50ms to ensure powered up + // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus) for (int i=0; i<3; i++) { - writeByte(0x3); - wait(0.00164); // this command takes 1.64ms, so wait for it - } - writeByte(0x2); // 4-bit mode - wait(0.000040f); // most instructions take 40us - - writeCommand(0x28); // Function set 001 BW N F - - - writeCommand(0x0C); - writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes - cls(); + _e = 1; + wait(0.000001f); + _d = 0x3; + wait(0.000001f); + _e = 0; + wait(0.004f); // 4ms + } + _e = 1; + wait(0.000001f); + _d = 0x2; // 4 Bit mode + wait(0.000001f); + _e = 0; + + writeCommand(0x28); // Function set 4 Bit, 2Line, 5*7 + writeCommand(0x08); // Display off + writeCommand(0x01); // clear Display + writeCommand(0x04); // cursor right, Display is not shifted + writeCommand(0x0C); // Display on , Cursor off } - + void TextLCD::character(int column, int row, int c) { int a = address(column, row); writeCommand(a); writeData(c); } - + void TextLCD::cls() { writeCommand(0x01); // cls, and set cursor to 0 - wait(0.00164f); // This command takes 1.64 ms locate(0, 0); } - + void TextLCD::locate(int column, int row) { _column = column; _row = row; } - + + + int TextLCD::_putc(int value) { if (value == '\n') { _column = 0; @@ -84,34 +93,92 @@ } return value; } - + int TextLCD::_getc() { - return -1; + int a = address(_column, _row); + writeCommand(a); + return (readData()); } - + void TextLCD::writeByte(int value) { + _e = 1; + wait(0.000001f); _d = value >> 4; - wait(0.000040f); // most instructions take 40us + wait(0.000001f); _e = 0; - wait(0.000040f); + wait(0.000001f); _e = 1; + wait(0.000001f); _d = value >> 0; - wait(0.000040f); + wait(0.000001f); _e = 0; - wait(0.000040f); // most instructions take 40us - _e = 1; } - + void TextLCD::writeCommand(int command) { + waitBusy(); // check if display is ready _rs = 0; writeByte(command); } - + +int TextLCD::readData(){ + int input; + waitBusy(); + _rw = 1; + _rs = 1; + wait(0.000001f); + _d.input(); // switch Data port to input + _e = 1; + wait(0.000001f); + input = _d.read() << 4; // high nibble + _e = 0; + wait(0.000001f); + _e = 1; + wait(0.000001f); + input = input | _d.read(); // low nibble + _e = 0; + return (input); +} + + void TextLCD::waitBusy(){ + int input; + _rw = 1; + _rs = 0; + wait(0.000001f); + _d.input(); // switch Data port to input + do{ + _e = 1; + wait(0.000001f); + input = _d.read(); + _e = 0; + wait(0.000001f); + _e = 1; + wait(0.000001f); + _e = 0; + }while((0x8 & input) == 0x8); // wait until display is ready + _rw = 0; + _d.output(); // switch port back to output + } + void TextLCD::writeData(int data) { + waitBusy(); _rs = 1; writeByte(data); } - + + +// set user defined char +void TextLCD::writeCGRAM(int address, int pattern[8]){ + int i; + address = address & 0x07; //max 8 char + for(i=0;i<8;i++){ + waitBusy(); // check if display is ready + _rs = 0; + writeByte(0x40 + address * 8 + i); + writeData(pattern[i]); + } +} + + int TextLCD::address(int column, int row) { switch (_type) { case LCD20x4: @@ -133,7 +200,7 @@ return 0x80 + (row * 0x40) + column; } } - + int TextLCD::columns() { switch (_type) { case LCD20x4: @@ -145,7 +212,7 @@ return 16; } } - + int TextLCD::rows() { switch (_type) { case LCD20x4: @@ -156,4 +223,4 @@ default: return 2; } -} +} \ No newline at end of file
--- a/TextLCD.h Thu Jan 02 21:07:01 2014 +0000 +++ b/TextLCD.h Mon Jul 02 17:58:56 2018 +0000 @@ -19,13 +19,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ - + #ifndef MBED_TEXTLCD_H #define MBED_TEXTLCD_H - + #include "mbed.h" - -/** A TextLCD interface for driving 4-bit HD44780-based LCDs + +/** A TextLCD interface for driving 4-bit HD44780-based LCDs * * Currently supports 16x2, 20x2 and 20x4 panels * @@ -33,16 +33,44 @@ * #include "mbed.h" * #include "TextLCD.h" * - * TextLCD lcd(p10, p12, p15, p16, p29, p30); // rs, e, d4-d7 + * TextLCD lcd(p10, p12, ,p13, p15, p16, p29, p30); // rs, rw, e, d0-d3 * * int main() { - * lcd.printf("Hello World!\n"); + * lcd.printf("Hello mbed\n"); + * + * //define user chars + * int pattern[8]; + * int pattern1[8]; + * pattern[0] = 1; // * + * pattern[1] = 3; // ** + * pattern[2] = 5; // * * + * pattern[3] = 9; // * * + * pattern[4] = 0x11; // * * + * pattern[5] = 0x19; // ** * + * pattern[6] = 0x1d; // *** * + * pattern[7] = 0x1f; // ***** + * + * pattern1[0] = 0x10; // * + * pattern1[1] = 0x18; // ** + * pattern1[2] = 0x14; // * * + * pattern1[3] = 0x12; // * * + * pattern1[4] = 0x11; // * * + * pattern1[5] = 0x13; // * ** + * pattern1[6] = 0x17; // * *** + * pattern1[7] = 0x1f; // ***** + * + * lcd.writeCGRAM(0, pattern); + * lcd.writeCGRAM(1, pattern1); + * + * lcd.locate(15,0); + * lcd.putc(0); // user pattern 0 + * lcd.putc(1); // user pattern 1 * } * @endcode */ class TextLCD : public Stream { public: - + /** LCD panel format */ enum LCDType { LCD16x2 /**< 16x2 LCD panel (default) */ @@ -50,23 +78,24 @@ , LCD20x2 /**< 20x2 LCD panel */ , LCD20x4 /**< 20x4 LCD panel */ }; - + /** Create a TextLCD interface * * @param rs Instruction/data control line * @param e Enable line (clock) - * @param d4-d7 Data lines for using as a 4-bit interface + * @param rw read / write + * @param d0-d3 Data lines * @param type Sets the panel size/addressing mode (default = LCD16x2) */ - TextLCD(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7, LCDType type = LCD16x2); - + TextLCD(PinName rs, PinName rw, PinName e, PinName d0, PinName d1, PinName d2, PinName d3, LCDType type = LCD16x2); + #if DOXYGEN_ONLY /** Write a character to the LCD * * @param c The character to write to the display */ int putc(int c); - + /** Write a formated string to the LCD * * @param format A printf-style format string, followed by the @@ -74,38 +103,52 @@ */ int printf(const char* format, ...); #endif - + /** Locate to a screen column and row * * @param column The horizontal position from the left, indexed from 0 * @param row The vertical position from the top, indexed from 0 */ void locate(int column, int row); - + /** Clear the screen and locate to 0,0 */ void cls(); - + int rows(); int columns(); - + + /** write a user defined char + * + * @param address The user defined char (0-7) + * @param pattern[8] bit pattern 5*8 of char + */ + void writeCGRAM(int address, int pattern[8]); + + /** Get the char at the current position + * + * int getc() + */ + protected: - + // Stream implementation functions virtual int _putc(int value); virtual int _getc(); - + int address(int column, int row); void character(int column, int row, int c); void writeByte(int value); void writeCommand(int command); void writeData(int data); - - DigitalOut _rs, _e; - BusOut _d; + int readData(); + void waitBusy(); + DigitalOut _rs, _e, _rw; + BusInOut _d; LCDType _type; - + int _column; int _row; }; - + #endif + \ No newline at end of file