![]() |
LCD Library 1.2.0
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.cpp 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 HD44780 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 // 00030 // @version API 1.1.0 00031 // 00032 // @author F. Malpartida - fmalpartida@gmail.com 00033 // --------------------------------------------------------------------------- 00034 #include <stdio.h> 00035 #include <string.h> 00036 #include <inttypes.h> 00037 00038 #if (ARDUINO < 100) 00039 #include <WProgram.h> 00040 #else 00041 #include <Arduino.h> 00042 #endif 00043 #include "LCD.h" 00044 00045 // CLASS CONSTRUCTORS 00046 // --------------------------------------------------------------------------- 00047 // Constructor 00048 LCD::LCD () 00049 { 00050 00051 } 00052 00053 // PUBLIC METHODS 00054 // --------------------------------------------------------------------------- 00055 // When the display powers up, it is configured as follows: 00056 // 00057 // 1. Display clear 00058 // 2. Function set: 00059 // DL = 1; 8-bit interface data 00060 // N = 0; 1-line display 00061 // F = 0; 5x8 dot character font 00062 // 3. Display on/off control: 00063 // D = 0; Display off 00064 // C = 0; Cursor off 00065 // B = 0; Blinking off 00066 // 4. Entry mode set: 00067 // I/D = 1; Increment by 1 00068 // S = 0; No shift 00069 // 00070 // Note, however, that resetting the Arduino doesn't reset the LCD, so we 00071 // can't assume that its in that state when a sketch starts (and the 00072 // LiquidCrystal constructor is called). 00073 // A call to begin() will reinitialize the LCD. 00074 // 00075 void LCD::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) 00076 { 00077 if (lines > 1) 00078 { 00079 _displayfunction |= LCD_2LINE; 00080 } 00081 _numlines = lines; 00082 _cols = cols; 00083 00084 // for some 1 line displays you can select a 10 pixel high font 00085 // ------------------------------------------------------------ 00086 if ((dotsize != 0) && (lines == 1)) 00087 { 00088 _displayfunction |= LCD_5x10DOTS; 00089 } 00090 00091 // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION! 00092 // according to datasheet, we need at least 40ms after power rises above 2.7V 00093 // before sending commands. Arduino can turn on way before 4.5V so we'll wait 00094 // 50 00095 // --------------------------------------------------------------------------- 00096 delayMicroseconds(100000); 00097 00098 //put the LCD into 4 bit or 8 bit mode 00099 // ------------------------------------- 00100 if (! (_displayfunction & LCD_8BITMODE)) 00101 { 00102 // this is according to the hitachi HD44780 datasheet 00103 // figure 24, pg 46 00104 00105 // we start in 8bit mode, try to set 4 bit mode 00106 command ( 0x03 ); 00107 delayMicroseconds(4500); // wait min 4.1ms 00108 00109 // second try 00110 command ( 0x03 ); 00111 delayMicroseconds(4500); // wait min 4.1ms 00112 00113 // third go! 00114 command ( 0x03 ); 00115 delayMicroseconds(150); 00116 00117 // finally, set to 4-bit interface 00118 command ( 0x02 ); 00119 } 00120 else 00121 { 00122 // this is according to the hitachi HD44780 datasheet 00123 // page 45 figure 23 00124 00125 // Send function set command sequence 00126 command(LCD_FUNCTIONSET | _displayfunction); 00127 delayMicroseconds(4500); // wait more than 4.1ms 00128 00129 // second try 00130 command(LCD_FUNCTIONSET | _displayfunction); 00131 delayMicroseconds(150); 00132 00133 // third go 00134 command(LCD_FUNCTIONSET | _displayfunction); 00135 } 00136 00137 // finally, set # lines, font size, etc. 00138 command(LCD_FUNCTIONSET | _displayfunction); 00139 00140 // turn the display on with no cursor or blinking default 00141 _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF; 00142 display(); 00143 00144 // clear the LCD 00145 clear(); 00146 00147 // Initialize to default text direction (for romance languages) 00148 _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; 00149 // set the entry mode 00150 command(LCD_ENTRYMODESET | _displaymode); 00151 00152 } 00153 00154 // Common LCD Commands 00155 // --------------------------------------------------------------------------- 00156 void LCD::clear() 00157 { 00158 command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero 00159 delayMicroseconds(HOME_CLEAR_EXEC); // this command is time consuming 00160 } 00161 00162 void LCD::home() 00163 { 00164 command(LCD_RETURNHOME); // set cursor position to zero 00165 delayMicroseconds(HOME_CLEAR_EXEC); // This command is time consuming 00166 } 00167 00168 void LCD::setCursor(uint8_t col, uint8_t row) 00169 { 00170 const byte row_offsetsDef[] = { 0x00, 0x40, 0x14, 0x54 }; // For regular LCDs 00171 const byte row_offsetsLarge[] = { 0x00, 0x40, 0x10, 0x50 }; // For 16x4 LCDs 00172 00173 if ( row >= _numlines ) 00174 { 00175 row = _numlines-1; // rows start at 0 00176 } 00177 00178 // 16x4 LCDs have special memory map layout 00179 // ---------------------------------------- 00180 if ( _cols == 16 && _numlines == 4 ) 00181 { 00182 command(LCD_SETDDRAMADDR | (col + row_offsetsLarge[row])); 00183 } 00184 else 00185 { 00186 command(LCD_SETDDRAMADDR | (col + row_offsetsDef[row])); 00187 } 00188 00189 } 00190 00191 // Turn the display on/off 00192 void LCD::noDisplay() 00193 { 00194 _displaycontrol &= ~LCD_DISPLAYON; 00195 command(LCD_DISPLAYCONTROL | _displaycontrol); 00196 } 00197 00198 void LCD::display() 00199 { 00200 _displaycontrol |= LCD_DISPLAYON; 00201 command(LCD_DISPLAYCONTROL | _displaycontrol); 00202 } 00203 00204 // Turns the underline cursor on/off 00205 void LCD::noCursor() 00206 { 00207 _displaycontrol &= ~LCD_CURSORON; 00208 command(LCD_DISPLAYCONTROL | _displaycontrol); 00209 } 00210 void LCD::cursor() 00211 { 00212 _displaycontrol |= LCD_CURSORON; 00213 command(LCD_DISPLAYCONTROL | _displaycontrol); 00214 } 00215 00216 // Turns on/off the blinking cursor 00217 void LCD::noBlink() 00218 { 00219 _displaycontrol &= ~LCD_BLINKON; 00220 command(LCD_DISPLAYCONTROL | _displaycontrol); 00221 } 00222 00223 void LCD::blink() 00224 { 00225 _displaycontrol |= LCD_BLINKON; 00226 command(LCD_DISPLAYCONTROL | _displaycontrol); 00227 } 00228 00229 // These commands scroll the display without changing the RAM 00230 void LCD::scrollDisplayLeft(void) 00231 { 00232 command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT); 00233 } 00234 00235 void LCD::scrollDisplayRight(void) { 00236 command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT); 00237 } 00238 00239 // This is for text that flows Left to Right 00240 void LCD::leftToRight(void) 00241 { 00242 _displaymode |= LCD_ENTRYLEFT; 00243 command(LCD_ENTRYMODESET | _displaymode); 00244 } 00245 00246 // This is for text that flows Right to Left 00247 void LCD::rightToLeft(void) 00248 { 00249 _displaymode &= ~LCD_ENTRYLEFT; 00250 command(LCD_ENTRYMODESET | _displaymode); 00251 } 00252 00253 // This will 'right justify' text from the cursor 00254 void LCD::autoscroll(void) 00255 { 00256 _displaymode |= LCD_ENTRYSHIFTINCREMENT; 00257 command(LCD_ENTRYMODESET | _displaymode); 00258 } 00259 00260 // This will 'left justify' text from the cursor 00261 void LCD::noAutoscroll(void) 00262 { 00263 _displaymode &= ~LCD_ENTRYSHIFTINCREMENT; 00264 command(LCD_ENTRYMODESET | _displaymode); 00265 } 00266 00267 // Write to CGRAM of new characters 00268 void LCD::createChar(uint8_t location, uint8_t charmap[]) 00269 { 00270 location &= 0x7; // we only have 8 locations 0-7 00271 00272 command(LCD_SETCGRAMADDR | (location << 3)); 00273 delayMicroseconds(30); 00274 00275 for (int i=0; i<8; i++) 00276 { 00277 write(charmap[i]); // call the virtual write method 00278 delayMicroseconds(30); 00279 } 00280 } 00281 00282 // General LCD commands - generic methods used by the rest of the commands 00283 // --------------------------------------------------------------------------- 00284 void LCD::command(uint8_t value) 00285 { 00286 send(value, COMMAND); 00287 } 00288 00289 #if (ARDUINO < 100) 00290 void LCD::write(uint8_t value) 00291 { 00292 send(value, DATA); 00293 } 00294 #else 00295 size_t LCD::write(uint8_t value) 00296 { 00297 send(value, DATA); 00298 return 1; // assume OK 00299 } 00300 #endif
1.7.4