LCD Library 1.2.1
LCD Library - LCD control class hierarchy library. Drop in replacement for the LiquidCrystal Library.
|
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