mirror of
https://github.com/fmalpartida/New-LiquidCrystal.git
synced 2026-07-28 04:07:33 +00:00
366 lines
11 KiB
C++
366 lines
11 KiB
C++
// ---------------------------------------------------------------------------
|
|
// 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.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. This library is a refactored version of the one supplied
|
|
// in the Arduino SDK in such a way that it simplifies its extension
|
|
// to support other mechanism to communicate to LCDs such as I2C, Serial.
|
|
// The original library has been reworked in such a way that this will be
|
|
// the base class implementing all generic methods to command an LCD based
|
|
// on the Hitachi HD44780 and compatible chipsets.
|
|
//
|
|
// This base class is a pure abstract class and needs to be extended. As reference,
|
|
// it has been extended to drive 4 and 8 bit mode control, LCDs and I2C extension
|
|
// backpacks such as the I2CLCDextraIO using the PCF8574* I2C IO Expander ASIC.
|
|
//
|
|
//
|
|
// This library is only compatible with Arduino's SDK version 1.0
|
|
//
|
|
// @version API 1.0.0
|
|
//
|
|
//
|
|
// @author F. Malpartida - fmalpartida@gmail.com
|
|
// ---------------------------------------------------------------------------
|
|
#ifndef _LCD_H_
|
|
#define _LCD_H_
|
|
|
|
#include <inttypes.h>
|
|
#include <Print.h>
|
|
|
|
|
|
/*!
|
|
@defined
|
|
@abstract All these definitions shouldn't be used unless you are writing
|
|
a driver.
|
|
@discussion All these definitions are for driver implementation only and
|
|
shouldn't be used by applications.
|
|
*/
|
|
// LCD Commands
|
|
// ---------------------------------------------------------------------------
|
|
#define LCD_CLEARDISPLAY 0x01
|
|
#define LCD_RETURNHOME 0x02
|
|
#define LCD_ENTRYMODESET 0x04
|
|
#define LCD_DISPLAYCONTROL 0x08
|
|
#define LCD_CURSORSHIFT 0x10
|
|
#define LCD_FUNCTIONSET 0x20
|
|
#define LCD_SETCGRAMADDR 0x40
|
|
#define LCD_SETDDRAMADDR 0x80
|
|
|
|
// flags for display entry mode
|
|
// ---------------------------------------------------------------------------
|
|
#define LCD_ENTRYRIGHT 0x00
|
|
#define LCD_ENTRYLEFT 0x02
|
|
#define LCD_ENTRYSHIFTINCREMENT 0x01
|
|
#define LCD_ENTRYSHIFTDECREMENT 0x00
|
|
|
|
// flags for display on/off and cursor control
|
|
// ---------------------------------------------------------------------------
|
|
#define LCD_DISPLAYON 0x04
|
|
#define LCD_DISPLAYOFF 0x00
|
|
#define LCD_CURSORON 0x02
|
|
#define LCD_CURSOROFF 0x00
|
|
#define LCD_BLINKON 0x01
|
|
#define LCD_BLINKOFF 0x00
|
|
|
|
// flags for display/cursor shift
|
|
// ---------------------------------------------------------------------------
|
|
#define LCD_DISPLAYMOVE 0x08
|
|
#define LCD_CURSORMOVE 0x00
|
|
#define LCD_MOVERIGHT 0x04
|
|
#define LCD_MOVELEFT 0x00
|
|
|
|
// flags for function set
|
|
// ---------------------------------------------------------------------------
|
|
#define LCD_8BITMODE 0x10
|
|
#define LCD_4BITMODE 0x00
|
|
#define LCD_2LINE 0x08
|
|
#define LCD_1LINE 0x00
|
|
#define LCD_5x10DOTS 0x04
|
|
#define LCD_5x8DOTS 0x00
|
|
|
|
class LCD : public Print
|
|
{
|
|
public:
|
|
|
|
/*!
|
|
@method
|
|
@abstract LiquidCrystal abstract constructor.
|
|
@discussion LiquidCrystal class abstract constructor needed to create
|
|
the base abstract class.
|
|
*/
|
|
LCD ( );
|
|
|
|
/*!
|
|
@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.
|
|
|
|
This method is pure abstract, it is dependent on each derived class from
|
|
this base class to implement the internals of how the LCD is initialized
|
|
and configured.
|
|
|
|
@param cols the number of columns that the display has
|
|
@param rows the number of rows that the display has
|
|
*/
|
|
virtual void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS) = 0;
|
|
|
|
/*!
|
|
@function
|
|
@abstract Clears the LCD.
|
|
@discussion Clears the LCD screen and positions the cursor in the upper-left
|
|
corner.
|
|
|
|
This operation is time consuming for the LCD.
|
|
|
|
@param none
|
|
*/
|
|
void clear();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Sets the cursor to the upper-left corner.
|
|
@discussion Positions the cursor in the upper-left of the LCD.
|
|
That is, use that location in outputting subsequent text to the display.
|
|
To also clear the display, use the clear() function instead.
|
|
|
|
This operation is time consuming for the LCD.
|
|
|
|
@param none
|
|
*/
|
|
void home();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Turns off the LCD display.
|
|
@discussion Turns off the LCD display, without losing the text currently
|
|
being displayed on it.
|
|
|
|
@param none
|
|
*/
|
|
void noDisplay();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Turns on the LCD display.
|
|
@discussion Turns on the LCD display, after it's been turned off with
|
|
noDisplay(). This will restore the text (and cursor location) that was on
|
|
the display prior to calling noDisplay().
|
|
|
|
@param none
|
|
*/
|
|
void display();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Turns off the blinking of the LCD cursor.
|
|
|
|
@param none
|
|
*/
|
|
void noBlink();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Display the cursor of the LCD.
|
|
@discussion Display the blinking LCD cursor. If used in combination with
|
|
the cursor() function, the result will depend on the particular display.
|
|
|
|
@param none
|
|
*/
|
|
void blink();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Hides the LCD cursor.
|
|
|
|
@param none
|
|
*/
|
|
void noCursor();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Display the LCD cursor.
|
|
@discussion Display the LCD cursor: an underscore (line) at the location
|
|
where the next character will be written.
|
|
|
|
@param none
|
|
*/
|
|
void cursor();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Scrolls the contents of the display (text and cursor) one space
|
|
to the left.
|
|
|
|
@param none
|
|
*/
|
|
void scrollDisplayLeft();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Scrolls the contents of the display (text and cursor) one space
|
|
to the right.
|
|
|
|
@param none
|
|
*/
|
|
void scrollDisplayRight();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Set the direction for text written to the LCD to left-to-right.
|
|
@discussion Set the direction for text written to the LCD to left-to-right.
|
|
All subsequent characters written to the display will go from left to right,
|
|
but does not affect previously-output text.
|
|
|
|
This is the default configuration.
|
|
|
|
@param none
|
|
*/
|
|
void leftToRight();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Set the direction for text written to the LCD to right-to-left.
|
|
@discussion Set the direction for text written to the LCD to right-to-left.
|
|
All subsequent characters written to the display will go from right to left,
|
|
but does not affect previously-output text.
|
|
|
|
left-to-right is the default configuration.
|
|
|
|
@param none
|
|
*/
|
|
void rightToLeft();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Turns on automatic scrolling of the LCD.
|
|
@discussion Turns on automatic scrolling of the LCD. This causes each
|
|
character output to the display to push previous characters over by one
|
|
space. If the current text direction is left-to-right (the default),
|
|
the display scrolls to the left; if the current direction is right-to-left,
|
|
the display scrolls to the right.
|
|
This has the effect of outputting each new character to the same location on
|
|
the LCD.
|
|
|
|
@param none
|
|
*/
|
|
void autoscroll();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Turns off automatic scrolling of the LCD.
|
|
@discussion Turns off automatic scrolling of the LCD, this is the default
|
|
configuration of the LCD.
|
|
|
|
@param none
|
|
*/
|
|
void noAutoscroll();
|
|
|
|
/*!
|
|
@function
|
|
@abstract Creates a custom character for use on the LCD.
|
|
@discussion Create a custom character (glyph) for use on the LCD.
|
|
Most chipsets only support up to eight characters of 5x8 pixels. Therefore,
|
|
this methods has been limited to locations (numbered 0 to 7).
|
|
|
|
The appearance of each custom character is specified by an array of eight
|
|
bytes, one for each row. The five least significant bits of each byte
|
|
determine the pixels in that row. To display a custom character on screen,
|
|
write()/print() its number, i.e. lcd.print (char(x)); // Where x is 0..7.
|
|
|
|
@param location: LCD memory location of the character to create
|
|
(0 to 7)
|
|
@param charmap: the bitmap array representing each row of the character.
|
|
*/
|
|
void createChar(uint8_t location, uint8_t charmap[]);
|
|
|
|
/*!
|
|
@function
|
|
@abstract Position the LCD cursor.
|
|
@discussion Sets the position of the LCD cursor. Set the location at which
|
|
subsequent text written to the LCD will be displayed.
|
|
|
|
@param col LCD column
|
|
@param row LCD row - line.
|
|
*/
|
|
void setCursor(uint8_t col, uint8_t row);
|
|
|
|
|
|
/*!
|
|
@function
|
|
@abstract Send a command to the LCD.
|
|
@discussion This method sends a command to the LCD by setting the Register
|
|
select line of the LCD.
|
|
|
|
This command shouldn't be used to drive the LCD, only to implement any other
|
|
feature that is not available on this library.
|
|
|
|
@param value Command value to send to the LCD.
|
|
*/
|
|
void command(uint8_t value);
|
|
|
|
/*!
|
|
@function
|
|
@abstract Writes to the LCD.
|
|
@discussion This method writes character to the LCD in the current cursor
|
|
position.
|
|
|
|
This is the virtual write method, implemented in the Print class, therefore
|
|
all Print class methods will end up calling this method.
|
|
|
|
@param value Value to write to the LCD.
|
|
*/
|
|
#if (ARDUINO < 100)
|
|
virtual oid write(uint8_t value);
|
|
#else
|
|
virtual size_t write(uint8_t value);
|
|
#endif
|
|
|
|
|
|
/*!
|
|
@function
|
|
@abstract Send a particular value to the LCD.
|
|
@discussion Sends a particular value to the LCD. This is a pure abstract
|
|
method, therefore, it is implementation dependent of each derived class how
|
|
to physically write to the LCD.
|
|
|
|
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) = 0;
|
|
|
|
using Print::write;
|
|
|
|
protected:
|
|
// Internal LCD variables to control the LCD shared between all derived
|
|
// classes.
|
|
uint8_t _displayfunction; // LCD_5x10DOTS or LCD_5x8DOTS, LCD_4BITMODE or
|
|
// LCD_8BITMODE, LCD_1LINE or LCD_2LINE
|
|
uint8_t _displaycontrol; // LCD base control command LCD on/off, blink, cursor
|
|
// all commands are "ored" to its contents.
|
|
uint8_t _displaymode; // Text entry mode to the LCD
|
|
uint8_t _numlines; // Number of lines of the LCD, initialized with begin()
|
|
|
|
private:
|
|
|
|
};
|
|
|
|
#endif
|