Fork tetxldc
Fork of TextLCD_piano by
Diff: TextLCD.cpp
- Revision:
- 9:05c9b97e4a91
- Parent:
- 7:44f34c09bd37
- Child:
- 10:4276b56b4400
diff -r 308d188a2d3a -r 05c9b97e4a91 TextLCD.cpp --- 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