TextLCD_piano adapted to LCD screen with R/W

Fork of TextLCD by Simon Ford

Files at this revision

API Documentation at this revision

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
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
diff -r 308d188a2d3a -r 05c9b97e4a91 TextLCD.h
--- 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