diff --git a/LiquidCrystal_4bit.cpp b/LiquidCrystal_4bit.cpp deleted file mode 100644 index 99533e8..0000000 --- a/LiquidCrystal_4bit.cpp +++ /dev/null @@ -1,303 +0,0 @@ -// --------------------------------------------------------------------------- -// Created by Francisco Malpartida on 20/08/11. -// Copyright 2011 - Under creative commons license 3.0: -// Attribution-ShareAlike CC BY-SA -// -// This software is furnished "as is", without technical support, and with no -// warranty, express or implied, as to its usefulness for any purpose. -// -// Thread Safe: No -// Extendable: Yes -// -// @file LiquidCrystal_4bit.cpp -// This file implements a basic liquid crystal library that comes as standard -// in the Arduino SDK. -// -// @brief -// This is a basic implementation of the LiquidCrystal library of the -// Arduino SDK. The original library has been reworked in such a way that -// this class implements the all methods to command an LCD based -// on the Hitachi HD44780 and compatible chipsets using the parallel port of -// the LCD (4 bit and 8 bit). -// -// The functionality provided by this class and its base class is identical -// to the original functionality of the Arduino LiquidCrystal library. -// -// -// This library is only compatible with Arduino's SDK version 1.0 -// -// -// @author F. Malpartida - fmalpartida@gmail.com -// --------------------------------------------------------------------------- -#include -#include -#include -#include -#include - -// 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). -// A call to begin() will reinitialize the LCD. - - -// CONSTRUCTORS -// --------------------------------------------------------------------------- -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); -} - -// PRIVATE METHODS -// --------------------------------------------------------------------------- - -// -// init -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) -{ - uint8_t i; - - // Initialize the IO pins - // ----------------------- - - _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; - - // Initialize the IO port direction to OUTPUT - // ------------------------------------------ - - for ( uint8_t i = 0; i < 4; i++ ) - { - pinMode ( _data_pins[i], OUTPUT ); - } - - // Initialize the rest of the ports if it is an 8bit controlled LCD - // ---------------------------------------------------------------- - - if ( !fourbitmode ) - { - for ( uint8_t i = 4; i < 7; i++ ) - { - pinMode ( _data_pins[i], OUTPUT ); - } - } - 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); - - // Initialise displaymode functions to defaults: LCD_1LINE and LCD_5x8DOTS - // ------------------------------------------------------------------------- - if (fourbitmode) - _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; - else - _displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS; -} - -// PUBLIC METHODS -// --------------------------------------------------------------------------- - -// -// begin -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 before 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 the LCD - 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 **********/ - -// send -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); - } -} - -// -// pulseEnable -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 -} - -// -// write4bits -void LiquidCrystal_4bit::write4bits(uint8_t value) -{ - for (uint8_t i = 0; i < 4; i++) - { - digitalWrite(_data_pins[i], (value >> i) & 0x01); - } - - pulseEnable(); -} - -// -// write8bits -void LiquidCrystal_4bit::write8bits(uint8_t value) -{ - for (uint8_t i = 0; i < 8; i++) - { - digitalWrite(_data_pins[i], (value >> i) & 0x01); - } - - pulseEnable(); -} diff --git a/LiquidCrystal_4bit.h b/LiquidCrystal_4bit.h deleted file mode 100644 index 6a703c8..0000000 --- a/LiquidCrystal_4bit.h +++ /dev/null @@ -1,135 +0,0 @@ -// --------------------------------------------------------------------------- -// Created by Francisco Malpartida on 20/08/11. -// Copyright 2011 - Under creative commons license 3.0: -// Attribution-ShareAlike CC BY-SA -// -// This software is furnished "as is", without technical support, and with no -// warranty, express or implied, as to its usefulness for any purpose. -// -// Thread Safe: No -// Extendable: Yes -// -// @file LiquidCrystal_4bit.h -// This file implements a basic liquid crystal library that comes as standard -// in the Arduino SDK. -// -// @brief -// This is a basic implementation of the LiquidCrystal library of the -// Arduino SDK. The original library has been reworked in such a way that -// this class implements the all methods to command an LCD based -// on the Hitachi HD44780 and compatible chipsets using the parallel port of -// the LCD (4 bit and 8 bit). -// -// The functionality provided by this class and its base class is identical -// to the original functionality of the Arduino LiquidCrystal library. -// -// -// This library is only compatible with Arduino's SDK version 1.0 -// -// -// @author F. Malpartida - fmalpartida@gmail.com -// --------------------------------------------------------------------------- -#ifndef LiquidCrystal_4bit_h -#define LiquidCrystal_4bit_h - -#include -#include - - -class LiquidCrystal_4bit : public LiquidCrystal -{ -public: - /*! - @method - @abstract 8 bit LCD constructors. - @discussion Defines the pin assignment that the LCD will have. - The constructor does not initialize the LCD. - */ - 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); - - /*! - @method - @abstract 4 bit LCD constructors. - @discussion Defines the pin assignment that the LCD will have. - The constructor does not initialize the LCD. - */ - 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); - - - /*! - @function - @abstract LCD initialization. - @discussion Initializes the LCD to a given size (col, row). This methods - initializes the LCD, therefore, it MUST be called prior to using any other - method from this class. - - @param cols: the number of columns that the display has - @param rows: the number of rows that the display has - @param charsize: size of the characters of the LCD: LCD_5x8DOTS or - LCD_5x10DOTS. - */ - virtual void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS); - - /*! - @function - @abstract Send a particular value to the LCD. - @discussion Sends a particular value to the LCD for writing to the LCD or - as an LCD command. - - Users should never call this method. - - @param value Value to send to the LCD. - @result mode LOW - write to the LCD CGRAM, HIGH - write a command to - the LCD. - */ - virtual void send(uint8_t value, uint8_t mode); - - -private: - - /*! - @method - @abstract Initializes the LCD pin allocation - @discussion Initializes the LCD pin allocation and configuration. - */ - 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); - - /*! - @method - @abstract Writes an 8 bit value to the LCD. - @discussion Writes 8 bits to the LCD control data lines. - */ - void write8bits(uint8_t value); - - /*! - @method - @abstract Writes an 4 bit value to the LCD. - @discussion Writes 4 bits (the least significant) to the LCD control data lines. - */ - void write4bits(uint8_t value); - - /*! - @method - @abstract Pulse the LCD enable line (En). - @discussion Sends a pulse of 1 uS to the Enable pin to execute an command - or write operation. - */ - void pulseEnable(); - - 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]; // Data pins. -}; - -#endif