LCD Library 1.2.1
LCD Library - LCD control class hierarchy library. Drop in replacement for the LiquidCrystal Library.
/Users/fmalpartida/development/ardWorkspace/LiquidCrystal_I2C/LiquiCrystal_I2C/FastIO.cpp
Go to the documentation of this file.
00001 // ---------------------------------------------------------------------------
00002 // Created by Francisco Malpartida on 20/08/11.
00003 // Copyright 2011 - Under creative commons license 3.0:
00004 //        Attribution-ShareAlike CC BY-SA
00005 //
00006 // This software is furnished "as is", without technical support, and with no 
00007 // warranty, express or implied, as to its usefulness for any purpose.
00008 //
00009 // Thread Safe: No
00010 // Extendable: Yes
00011 //
00012 // @file LCD.h
00013 // This file implements a basic liquid crystal library that comes as standard
00014 // in the Arduino SDK.
00015 // 
00016 // @brief 
00017 // This is a basic implementation of the LiquidCrystal library of the
00018 // Arduino SDK. This library is a refactored version of the one supplied
00019 // in the Arduino SDK in such a way that it simplifies its extension
00020 // to support other mechanism to communicate to LCDs such as I2C, Serial, SR, 
00021 // The original library has been reworked in such a way that this will be
00022 // the base class implementing all generic methods to command an LCD based
00023 // on the Hitachi HD44780 and compatible chipsets.
00024 //
00025 // This base class is a pure abstract class and needs to be extended. As reference,
00026 // it has been extended to drive 4 and 8 bit mode control, LCDs and I2C extension
00027 // backpacks such as the I2CLCDextraIO using the PCF8574* I2C IO Expander ASIC.
00028 //
00029 // The functionality provided by this class and its base class is identical
00030 // to the original functionality of the Arduino LiquidCrystal library.
00031 //
00032 // @version API 1.1.0
00033 //
00034 //
00035 // @author F. Malpartida - [email protected]
00036 // ---------------------------------------------------------------------------
00037 #ifndef _LCD_H_
00038  #define _LCD_H_
00039  
00040 #if (ARDUINO <  100)
00041  #include <WProgram.h>
00042 #else
00043  #include <Arduino.h>
00044 #endif
00045  
00046 #include <inttypes.h>
00047 #include <Print.h>
00048 
00049 
00058 #ifdef __AVR__
00059  #define FAST_MODE
00060  #endif
00061  
00071 inline static void waitUsec ( uint16_t uSec )
00072 {
00073 #ifndef FAST_MODE
00074     delayMicroseconds ( uSec );
00075 #endif // FAST_MODE
00076  }
00077 
00078 
00086 // LCD Commands
00087 // ---------------------------------------------------------------------------
00088 #define LCD_CLEARDISPLAY        0x01
00089  #define LCD_RETURNHOME          0x02
00090  #define LCD_ENTRYMODESET        0x04
00091  #define LCD_DISPLAYCONTROL      0x08
00092  #define LCD_CURSORSHIFT         0x10
00093  #define LCD_FUNCTIONSET         0x20
00094  #define LCD_SETCGRAMADDR        0x40
00095  #define LCD_SETDDRAMADDR        0x80
00096  
00097 // flags for display entry mode
00098 // ---------------------------------------------------------------------------
00099 #define LCD_ENTRYRIGHT          0x00
00100  #define LCD_ENTRYLEFT           0x02
00101  #define LCD_ENTRYSHIFTINCREMENT 0x01
00102  #define LCD_ENTRYSHIFTDECREMENT 0x00
00103  
00104 // flags for display on/off and cursor control
00105 // ---------------------------------------------------------------------------
00106 #define LCD_DISPLAYON           0x04
00107  #define LCD_DISPLAYOFF          0x00
00108  #define LCD_CURSORON            0x02
00109  #define LCD_CURSOROFF           0x00
00110  #define LCD_BLINKON             0x01
00111  #define LCD_BLINKOFF            0x00
00112  
00113 // flags for display/cursor shift
00114 // ---------------------------------------------------------------------------
00115 #define LCD_DISPLAYMOVE         0x08
00116  #define LCD_CURSORMOVE          0x00
00117  #define LCD_MOVERIGHT           0x04
00118  #define LCD_MOVELEFT            0x00
00119  
00120 // flags for function set
00121 // ---------------------------------------------------------------------------
00122 #define LCD_8BITMODE            0x10
00123  #define LCD_4BITMODE            0x00
00124  #define LCD_2LINE               0x08
00125  #define LCD_1LINE               0x00
00126  #define LCD_5x10DOTS            0x04
00127  #define LCD_5x8DOTS             0x00
00128  
00129 
00130 // Define COMMAND and DATA LCD Rs (used by send method).
00131 // ---------------------------------------------------------------------------
00132 #define COMMAND                 0
00133  #define DATA                    1
00134  #define FOUR_BITS               2
00135  
00136 
00143 #define HOME_CLEAR_EXEC      2000
00144  
00151 #define BACKLIGHT_OFF           0
00152  
00159 #define BACKLIGHT_ON          255
00160  
00161 
00167 typedef enum { POSITIVE, NEGATIVE } t_backlighPol;
00168 
00169 class LCD : public Print 
00170 {
00171 public:
00172    
00179    LCD ( );
00180    
00196    virtual void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS);
00197    
00208    void clear();
00209    
00221    void home();
00222    
00231    void noDisplay();
00232    
00242    void display();
00243    
00250    void noBlink();
00251    
00260    void blink();
00261    
00268    void noCursor();
00269    
00278    void cursor();
00279    
00287    void scrollDisplayLeft();
00288    
00296    void scrollDisplayRight();
00297    
00309    void leftToRight();
00310    
00322    void rightToLeft();
00323    
00330    void moveCursorLeft();
00331    
00332    
00339    void moveCursorRight();
00340    
00354    void autoscroll();
00355    
00364    void noAutoscroll();
00365    
00382    void createChar(uint8_t location, uint8_t charmap[]);
00383    
00393    void setCursor(uint8_t col, uint8_t row);
00394    
00402    void backlight ( void );
00403    
00411    void noBacklight ( void );
00412    
00420    void on ( void );
00421 
00429    void off ( void );
00430    
00431    //
00432    // virtual class methods
00433    // --------------------------------------------------------------------------
00444     virtual void setBacklightPin ( uint8_t value, t_backlighPol pol ) { };
00445    
00463    virtual void setBacklight ( uint8_t value ) { };
00464    
00476 #if (ARDUINO <  100)
00477     virtual void write(uint8_t value);
00478 #else
00479     virtual size_t write(uint8_t value);
00480 #endif
00481     
00482 #if (ARDUINO <  100)
00483     using Print::write;
00484 #else
00485     using Print::write;
00486 #endif   
00487     
00488 protected:
00489    // Internal LCD variables to control the LCD shared between all derived
00490    // classes.
00491    uint8_t _displayfunction;  // LCD_5x10DOTS or LCD_5x8DOTS, LCD_4BITMODE or 
00492                               // LCD_8BITMODE, LCD_1LINE or LCD_2LINE
00493    uint8_t _displaycontrol;   // LCD base control command LCD on/off, blink, cursor
00494                               // all commands are "ored" to its contents.
00495    uint8_t _displaymode;      // Text entry mode to the LCD
00496    uint8_t _numlines;         // Number of lines of the LCD, initialized with begin()
00497    uint8_t _cols;             // Number of columns in the LCD
00498    t_backlighPol _polarity;   // Backlight polarity
00499    
00500 private:
00513    void command(uint8_t value);
00514 
00528 #if (ARDUINO <  100)
00529     virtual void send(uint8_t value, uint8_t mode) { };
00530 #else
00531     virtual void send(uint8_t value, uint8_t mode) = 0;
00532 #endif
00533     
00534 };
00535 
00536 #endif
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines