Commits

F Malpartida committed cbe36ae

First full version of the library LiquidCrystal class hierarchy.

  • Participants
  • Parent commits 1f3e40a

Comments (0)

Files changed (6)

File LiquidCrystal.cpp

-#include "LiquidCrystal.h"
-
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
+
 #include "Arduino.h"
+#include "LiquidCrystal.h"
 
-// When the display powers up, it is configured as follows:
-//
-// 1. Display clear
-// 2. Function set: 
-//    DL = 1; 8-bit interface data 
-//    N = 0; 1-line display 
-//    F = 0; 5x8 dot character font 
-// 3. Display on/off control: 
-//    D = 0; Display off 
-//    C = 0; Cursor off 
-//    B = 0; Blinking off 
-// 4. Entry mode set: 
-//    I/D = 1; Increment by 1 
-//    S = 0; No shift 
-//
-// Note, however, that resetting the Arduino doesn't reset the LCD, so we
-// can't assume that its in that state when a sketch starts (and the
-// LiquidCrystal constructor is called).
+// Constructor
+LiquidCrystal::LiquidCrystal () 
+{
 
-LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
-                             uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
-                             uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
-{
-   init(0, rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7);
-}
-
-LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable,
-                             uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
-                             uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
-{
-   init(0, rs, 255, enable, d0, d1, d2, d3, d4, d5, d6, d7);
-}
-
-LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
-                             uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
-{
-   init(1, rs, rw, enable, d0, d1, d2, d3, 0, 0, 0, 0);
-}
-
-LiquidCrystal::LiquidCrystal(uint8_t rs,  uint8_t enable,
-                             uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
-{
-   init(1, rs, 255, enable, d0, d1, d2, d3, 0, 0, 0, 0);
-}
-
-LiquidCrystal::LiquidCrystal ()
-{
-   
-}
-
-void LiquidCrystal::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
-                         uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
-                         uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
-{
-   _rs_pin = rs;
-   _rw_pin = rw;
-   _enable_pin = enable;
-   
-   _data_pins[0] = d0;
-   _data_pins[1] = d1;
-   _data_pins[2] = d2;
-   _data_pins[3] = d3; 
-   _data_pins[4] = d4;
-   _data_pins[5] = d5;
-   _data_pins[6] = d6;
-   _data_pins[7] = d7; 
-   
-   pinMode(_rs_pin, OUTPUT);
-   // we can save 1 pin by not using RW. Indicate by passing 255 instead of pin#
-   if (_rw_pin != 255) { 
-      pinMode(_rw_pin, OUTPUT);
-   }
-   pinMode(_enable_pin, OUTPUT);
-   
-   if (fourbitmode)
-      _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
-   else 
-      _displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS;
-   
-   begin(16, 1);
-}
-
-void LiquidCrystal::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) 
-{
-   if (lines > 1) 
-   {
-      _displayfunction |= LCD_2LINE;
-   }
-   _numlines = lines;
-   _currline = 0;
-   
-   // for some 1 line displays you can select a 10 pixel high font
-   if ((dotsize != 0) && (lines == 1)) 
-   {
-      _displayfunction |= LCD_5x10DOTS;
-   }
-   
-   // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
-   // according to datasheet, we need at least 40ms after power rises above 2.7V
-   // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50
-   delayMicroseconds(50000); 
-   // Now we pull both RS and R/W low to begin commands
-   digitalWrite(_rs_pin, LOW);
-   digitalWrite(_enable_pin, LOW);
-   if (_rw_pin != 255) { 
-      digitalWrite(_rw_pin, LOW);
-   }
-   
-   //put the LCD into 4 bit or 8 bit mode
-   if (! (_displayfunction & LCD_8BITMODE)) {
-      // this is according to the hitachi HD44780 datasheet
-      // figure 24, pg 46
-      
-      // we start in 8bit mode, try to set 4 bit mode
-      write4bits(0x03);
-      delayMicroseconds(4500); // wait min 4.1ms
-      
-      // second try
-      write4bits(0x03);
-      delayMicroseconds(4500); // wait min 4.1ms
-      
-      // third go!
-      write4bits(0x03); 
-      delayMicroseconds(150);
-      
-      // finally, set to 4-bit interface
-      write4bits(0x02); 
-   } else {
-      // this is according to the hitachi HD44780 datasheet
-      // page 45 figure 23
-      
-      // Send function set command sequence
-      command(LCD_FUNCTIONSET | _displayfunction);
-      delayMicroseconds(4500);  // wait more than 4.1ms
-      
-      // second try
-      command(LCD_FUNCTIONSET | _displayfunction);
-      delayMicroseconds(150);
-      
-      // third go
-      command(LCD_FUNCTIONSET | _displayfunction);
-   }
-   
-   // finally, set # lines, font size, etc.
-   command(LCD_FUNCTIONSET | _displayfunction);  
-   
-   // turn the display on with no cursor or blinking default
-   _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;  
-   display();
-   
-   // clear it off
-   clear();
-   
-   // Initialize to default text direction (for romance languages)
-   _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
-   // set the entry mode
-   command(LCD_ENTRYMODESET | _displaymode);
-   
 }
 
 /********** high level commands, for the user! */
 
 /*********** mid level commands, for sending data/cmds */
 
-void LiquidCrystal::command(uint8_t value) {
+void LiquidCrystal::command(uint8_t value) 
+{
    send(value, LOW);
 }
 
-size_t LiquidCrystal::write(uint8_t value) {
+size_t LiquidCrystal::write(uint8_t value) 
+{
    send(value, HIGH);
    return 1; // assume sucess
-}
-
-/************ low level data pushing commands **********/
-
-// write either command or data, with automatic 4/8-bit selection
-void LiquidCrystal::send(uint8_t value, uint8_t mode) {
-   digitalWrite(_rs_pin, mode);
-   
-   // if there is a RW pin indicated, set it low to Write
-   if (_rw_pin != 255) { 
-      digitalWrite(_rw_pin, LOW);
-   }
-   
-   if (_displayfunction & LCD_8BITMODE) {
-      write8bits(value); 
-   } else {
-      write4bits(value>>4);
-      write4bits(value);
-   }
-}
-
-void LiquidCrystal::pulseEnable(void) {
-   digitalWrite(_enable_pin, LOW);
-   delayMicroseconds(1);    
-   digitalWrite(_enable_pin, HIGH);
-   delayMicroseconds(1);    // enable pulse must be >450ns
-   digitalWrite(_enable_pin, LOW);
-   delayMicroseconds(100);   // commands need > 37us to settle
-}
-
-void LiquidCrystal::write4bits(uint8_t value) {
-   for (int i = 0; i < 4; i++) {
-      pinMode(_data_pins[i], OUTPUT);
-      digitalWrite(_data_pins[i], (value >> i) & 0x01);
-   }
-   
-   pulseEnable();
-}
-
-void LiquidCrystal::write8bits(uint8_t value) {
-   for (int i = 0; i < 8; i++) {
-      pinMode(_data_pins[i], OUTPUT);
-      digitalWrite(_data_pins[i], (value >> i) & 0x01);
-   }
-   
-   pulseEnable();
-}
+}

File LiquidCrystal.h

 
 class LiquidCrystal : public Print {
 public:
-  LiquidCrystal(uint8_t rs, uint8_t enable,
-		uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
-		uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
-  LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
-		uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
-		uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
-  LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
-		uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
-  LiquidCrystal(uint8_t rs, uint8_t enable,
-		uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
    
-  LiquidCrystal ( );
-
-  void init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
-	    uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
-	    uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
-    
-  virtual void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS);
-
-  void clear();
-  void home();
-
-  void noDisplay();
-  void display();
-  void noBlink();
-  void blink();
-  void noCursor();
-  void cursor();
-  void scrollDisplayLeft();
-  void scrollDisplayRight();
-  void leftToRight();
-  void rightToLeft();
-  void autoscroll();
-  void noAutoscroll();
-
-  void createChar(uint8_t, uint8_t[]);
-  void setCursor(uint8_t, uint8_t);
+   LiquidCrystal ( );
    
-  size_t write(uint8_t);
-  void command(uint8_t);
+   virtual void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS) = 0;
    
-  virtual void send(uint8_t, uint8_t);
-  virtual void write4bits(uint8_t);
-  virtual void pulseEnable();
-
-  using Print::write;
-
+   void clear();
+   void home();
+   void noDisplay();
+   void display();
+   void noBlink();
+   void blink();
+   void noCursor();
+   void cursor();
+   void scrollDisplayLeft();
+   void scrollDisplayRight();
+   void leftToRight();
+   void rightToLeft();
+   void autoscroll();
+   void noAutoscroll();
+   
+   void createChar(uint8_t, uint8_t[]);
+   void setCursor(uint8_t, uint8_t);
+   
+   void command(uint8_t);
+   size_t write(uint8_t);
+   
+   virtual void send(uint8_t, uint8_t) = 0;
+   virtual void write4bits(uint8_t) = 0;
+   //virtual void pulseEnable() = 0;
+   
+   using Print::write;
+   
 protected: 
-  uint8_t _numlines;
-  uint8_t _displayfunction;
-  uint8_t _displaycontrol;
-  uint8_t _displaymode;
+   uint8_t _displayfunction;
+   uint8_t _displaycontrol;
+   uint8_t _displaymode;
+   uint8_t _numlines;
    
 private:
-  void write8bits(uint8_t);
-
-  uint8_t _rs_pin; // LOW: command.  HIGH: character.
-  uint8_t _rw_pin; // LOW: write to LCD.  HIGH: read from LCD.
-  uint8_t _enable_pin; // activated by a HIGH pulse.
-  uint8_t _data_pins[8];
-
-
-  uint8_t _currline;
-  uint8_t _initialized;
-
-
+   
 };
 
 #endif

File LiquidCrystal_4bit.cpp

+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include "Arduino.h"
+#include "LiquidCrystal_4bit.h"
+
+// When the display powers up, it is configured as follows:
+//
+// 1. Display clear
+// 2. Function set: 
+//    DL = 1; 8-bit interface data 
+//    N = 0; 1-line display 
+//    F = 0; 5x8 dot character font 
+// 3. Display on/off control: 
+//    D = 0; Display off 
+//    C = 0; Cursor off 
+//    B = 0; Blinking off 
+// 4. Entry mode set: 
+//    I/D = 1; Increment by 1 
+//    S = 0; No shift 
+//
+// Note, however, that resetting the Arduino doesn't reset the LCD, so we
+// can't assume that its in that state when a sketch starts (and the
+// LiquidCrystal_4bit constructor is called).
+
+LiquidCrystal_4bit::LiquidCrystal_4bit(uint8_t rs, uint8_t rw, uint8_t enable,
+                                        uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
+                                        uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
+{
+   init(0, rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7);
+}
+
+LiquidCrystal_4bit::LiquidCrystal_4bit(uint8_t rs, uint8_t enable,
+                                       uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
+                                       uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
+{
+   init(0, rs, 255, enable, d0, d1, d2, d3, d4, d5, d6, d7);
+}
+
+LiquidCrystal_4bit::LiquidCrystal_4bit(uint8_t rs, uint8_t rw, uint8_t enable,
+                             uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
+{
+   init(1, rs, rw, enable, d0, d1, d2, d3, 0, 0, 0, 0);
+}
+
+LiquidCrystal_4bit::LiquidCrystal_4bit(uint8_t rs,  uint8_t enable,
+                             uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
+{
+   init(1, rs, 255, enable, d0, d1, d2, d3, 0, 0, 0, 0);
+}
+
+void LiquidCrystal_4bit::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
+                              uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
+                              uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
+{
+   _rs_pin = rs;
+   _rw_pin = rw;
+   _enable_pin = enable;
+   
+   _data_pins[0] = d0;
+   _data_pins[1] = d1;
+   _data_pins[2] = d2;
+   _data_pins[3] = d3; 
+   _data_pins[4] = d4;
+   _data_pins[5] = d5;
+   _data_pins[6] = d6;
+   _data_pins[7] = d7; 
+   
+   pinMode(_rs_pin, OUTPUT);
+   // we can save 1 pin by not using RW. Indicate by passing 255 instead of pin#
+   if (_rw_pin != 255) { 
+      pinMode(_rw_pin, OUTPUT);
+   }
+   pinMode(_enable_pin, OUTPUT);
+   
+   if (fourbitmode)
+      _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
+   else 
+      _displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS;
+   
+   //begin(16, 1);
+}
+
+void LiquidCrystal_4bit::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) 
+{
+   if (lines > 1) 
+   {
+      _displayfunction |= LCD_2LINE;
+   }
+   _numlines = lines;
+   
+   // for some 1 line displays you can select a 10 pixel high font
+   if ((dotsize != 0) && (lines == 1)) 
+   {
+      _displayfunction |= LCD_5x10DOTS;
+   }
+   
+   // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
+   // according to datasheet, we need at least 40ms after power rises above 2.7V
+   // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50
+   delayMicroseconds(50000); 
+   
+   // Now we pull both RS and R/W low to begin commands
+   digitalWrite(_rs_pin, LOW);
+   digitalWrite(_enable_pin, LOW);
+   if (_rw_pin != 255) { 
+      digitalWrite(_rw_pin, LOW);
+   }
+   
+   //put the LCD into 4 bit or 8 bit mode
+   if (! (_displayfunction & LCD_8BITMODE)) 
+   {
+      // this is according to the hitachi HD44780 datasheet
+      // figure 24, pg 46
+      
+      // we start in 8bit mode, try to set 4 bit mode
+      write4bits(0x03);
+      delayMicroseconds(4500); // wait min 4.1ms
+      
+      // second try
+      write4bits(0x03);
+      delayMicroseconds(4500); // wait min 4.1ms
+      
+      // third go!
+      write4bits(0x03); 
+      delayMicroseconds(150);
+      
+      // finally, set to 4-bit interface
+      write4bits(0x02); 
+   } 
+   else 
+   {
+      // this is according to the hitachi HD44780 datasheet
+      // page 45 figure 23
+      
+      // Send function set command sequence
+      command(LCD_FUNCTIONSET | _displayfunction);
+      delayMicroseconds(4500);  // wait more than 4.1ms
+      
+      // second try
+      command(LCD_FUNCTIONSET | _displayfunction);
+      delayMicroseconds(150);
+      
+      // third go
+      command(LCD_FUNCTIONSET | _displayfunction);
+   }
+   
+   // finally, set # lines, font size, etc.
+   command(LCD_FUNCTIONSET | _displayfunction);  
+   
+   // turn the display on with no cursor or blinking default
+   _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;  
+   display();
+   
+   // clear it off
+   clear();
+   
+   // Initialize to default text direction (for romance languages)
+   _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
+   // set the entry mode
+   command(LCD_ENTRYMODESET | _displaymode);
+   
+}
+
+/************ low level data pushing commands **********/
+
+// write either command or data, with automatic 4/8-bit selection
+void LiquidCrystal_4bit::send(uint8_t value, uint8_t mode) {
+   digitalWrite(_rs_pin, mode);
+   
+   // if there is a RW pin indicated, set it low to Write
+   if (_rw_pin != 255) { 
+      digitalWrite(_rw_pin, LOW);
+   }
+   
+   if (_displayfunction & LCD_8BITMODE) {
+      write8bits(value); 
+   } else {
+      write4bits(value>>4);
+      write4bits(value);
+   }
+}
+
+void LiquidCrystal_4bit::pulseEnable(void) {
+   digitalWrite(_enable_pin, LOW);
+   delayMicroseconds(1);    
+   digitalWrite(_enable_pin, HIGH);
+   delayMicroseconds(1);    // enable pulse must be >450ns
+   digitalWrite(_enable_pin, LOW);
+   delayMicroseconds(100);   // commands need > 37us to settle
+}
+
+void LiquidCrystal_4bit::write4bits(uint8_t value) {
+   for (int i = 0; i < 4; i++) {
+      pinMode(_data_pins[i], OUTPUT);
+      digitalWrite(_data_pins[i], (value >> i) & 0x01);
+   }
+   
+   pulseEnable();
+}
+
+void LiquidCrystal_4bit::write8bits(uint8_t value) {
+   for (int i = 0; i < 8; i++) {
+      pinMode(_data_pins[i], OUTPUT);
+      digitalWrite(_data_pins[i], (value >> i) & 0x01);
+   }
+   
+   pulseEnable();
+}

File LiquidCrystal_4bit.h

+#ifndef LiquidCrystal_4bit_h
+#define LiquidCrystal_4bit_h
+
+#include <inttypes.h>
+#include "LiquidCrystal.h"
+
+
+class LiquidCrystal_4bit : public LiquidCrystal
+{
+public:
+   LiquidCrystal_4bit(uint8_t rs, uint8_t enable,
+                      uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
+                      uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
+   LiquidCrystal_4bit(uint8_t rs, uint8_t rw, uint8_t enable,
+                      uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
+                      uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
+   LiquidCrystal_4bit(uint8_t rs, uint8_t rw, uint8_t enable,
+                      uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
+   LiquidCrystal_4bit(uint8_t rs, uint8_t enable,
+                      uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
+      
+
+   
+   virtual void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS);   
+   virtual void send(uint8_t, uint8_t);
+   virtual void write4bits(uint8_t);
+   virtual void pulseEnable();
+   
+private:
+   void init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
+             uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
+             uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
+   
+   void write8bits(uint8_t);
+   
+   uint8_t _rs_pin; // LOW: command.  HIGH: character.
+   uint8_t _rw_pin; // LOW: write to LCD.  HIGH: read from LCD.
+   uint8_t _enable_pin; // activated by a HIGH pulse.
+   uint8_t _data_pins[8];
+};
+
+#endif

File LiquidCrystal_I2C.cpp

 #include "Arduino.h" 
-extern "C" {
+
 #include <inttypes.h>
+#include "I2CIO.h"
+#include "LiquidCrystal.h"
 #include "LiquidCrystal_I2C.h"
-#include "I2CIO.h"
-}
-
 
 
 // When the display powers up, it is configured as follows:
 // can't assume that its in that state when a sketch starts (and the
 // LiquidCrystal constructor is called).
 
-LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows)
+LiquidCrystal_I2C::LiquidCrystal_I2C( uint8_t lcd_Addr )
 {
   _Addr = lcd_Addr;
-  _cols = lcd_cols;
-  _rows = lcd_rows;
+
   _backlightval = LCD_NOBACKLIGHT;
 }
 
 int LiquidCrystal_I2C::init()
 {
-	return ( init_priv() );
+	return ( init_priv( ) );
 }
 
 int LiquidCrystal_I2C::init_priv()
    {
       _i2cio.portMode ( OUTPUT );
       _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
-      begin(_cols, _rows);
+      //begin(_cols, _rows);
       status = 1;
    }
    return ( status );
 
 void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) 
 {
+   _cols = cols;
+   _rows = lines;
+   
+   init();
+   
 	if (lines > 1) 
    {
 		_displayfunction |= LCD_2LINE;
 }
 
 
-
-
-
 /************ low level data pushing commands **********/
 
 void LiquidCrystal_I2C::expanderWrite(uint8_t _data)

File LiquidCrystal_I2C.h

 #include <Wire.h>
 #include <I2CIO.h>
 
-// commands
-
-// flags for display entry mode
-
-
-// flags for display on/off control
-
-
-// flags for display/cursor shift
-
-
-// flags for function set
-
 
 // flags for backlight control
-#define LCD_BACKLIGHT 0x00
+#define LCD_BACKLIGHT   0x00
 #define LCD_NOBACKLIGHT 0x80
 
 #define En B01000000  // Enable bit
 class LiquidCrystal_I2C : public LiquidCrystal 
 {
 public:
-   LiquidCrystal_I2C (uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);
-   int init();
+   LiquidCrystal_I2C (uint8_t lcd_Addr);
    
-   // Virtual methods
-   virtual void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS );
-   virtual void send(uint8_t, uint8_t);
-   virtual void write4bits(uint8_t);
-   virtual void pulseEnable(uint8_t);
+
 
    void printLeft();
    void printRight();
    void noBacklight();
    void backlight();
    
+   // Virtual methods
+   virtual void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS );
+   virtual void send(uint8_t, uint8_t);
+   virtual void write4bits(uint8_t);
+   virtual void pulseEnable(uint8_t);
+
 private:
    int  init_priv();
-
+   int init();
    void expanderWrite(uint8_t);
 
    uint8_t _Addr;