/*
* This is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* DogLcd is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with DogLcd. If not, see .
*
* Copyright 2010 Eberhard Fahle
*/
#ifndef DOG_LCD_h
#define DOG_LCD_h
#include
#include "Print.h"
/** Define the available models */
#define DOG_LCD_M081 1
#define DOG_LCD_M162 2
#define DOG_LCD_M163 3
/** define the supply voltage for the display */
#define DOG_LCD_VCC_5V 0
#define DOG_LCD_VCC_3V3 1
/**
* A class for Dog text LCD's using the
* SPI-feature of the controller.
*/
class DogLcd : public Print {
private:
/** The model-type of the display connected */
int model;
/** The number of lines on the display */
int rows;
/** The number of vivible columns on the display */
int cols;
/** The size of the character memory on each row */
int memSize;
/** The starting address of each row */
int startAddress[3];
/** The (arduino-)pin used for the serial data */
int lcdSI;
/** The (arduino-)pin used for the serial clock */
int lcdCLK;
/**
* The (arduino-)pin that toggles between sending a command
* or character data to the display
*/
int lcdRS;
/** The (arduino-)pin used selecting the display */
int lcdCSB;
/** The (arduino-)pin used for resetting the dislay */
int lcdRESET;
/** The (arduino-)pin used for switching the backlight */
int backLight;
/**
* The supply voltage used for the display. This is
* one of the constants DOG_LCD_VCC_5V
* or DOG_LCD_VCC_3V3
.
*/
int vcc;
/** The contrast setting for the dipslay */
int contrast;
/** the mode the cursor is in */
int cursorMode;
/** the mode the display is in */
int displayMode;
/** the blink setting for the cursor */
int blinkMode;
/** the entrymode currently used */
int entryMode;
/** The template for changing the instruction set */
uint8_t instructionSetTemplate;
public:
/**
* Creates a new instance of DogLcd and asigns the (arduino-)pins
* used to control the display.
* @param lcdSI The (arduino-)pin connected to the SI-pin on the display
* @param lcdCLK The (arduino-)pin connected to the CLK-pin on the display
* @param lcdRS The (arduino-)pin connected to the RS-pin on the display
* @param lcdCSB The (arduino-)pin connected to the CSB-pin on the display
* @param backLight If you hardware supports switching the backlight
* on the display from software this is the (arduino-)pin to be used.
* @param lcdRESET If you want your code to reset the display from
* software this is the (arduino-)pin where the RESET-pin of
* the display is connected. If you don't need this feature simply
* connect the RESET-pin on the display to VCC.
*/
DogLcd(int lcdSI, int lcdCLK, int lcdRS, int lcdCSB,
int lcdRESET=-1, int backLight=-1);
/**
* Resets and initializes the Display.
* @param model the type of display that is connected.
* This must be one of the constants DOG_LCD_M081
,
* OG_LCD_M162
or DOG_LCD_M163
* defined in this class.
* @param contrast the contrast setting for the display. Values
* between 0x00 and 0x3f are allowed. The default 0x28 is a valuen that
* worked well with all displays I have tested so far.
* @param vcc the supply voltage on which the display runs. This must
* one of the constants DOG_LCD_VCC_5V
* or DOG_LCD_VCC_3V3
* @return 0 if the display was sucessfully initialized,
* -1 otherwise.
*/
int begin(int model, int contrast=0x28, int vcc=DOG_LCD_VCC_5V);
/**
* Reset the display.
*/
void reset();
/**
* Set the contrast for the display.
* @param contrast the contrast to be used for the display. Setting
* the contrast to a value < 32 will probably give the impression
* that the display isn't working because nothing is printed.
* The displays that I tested worked firn with a contrast >= 0x28.
* The valid range for the contrast value is 0.63 (0x00..0x3F hex).
* If the value is outside the valid range the method does nothing.
*/
void setContrast(int contrast);
/**
* Clears the display and moves the cursor back to
* the start of the first line.
*/
void clear();
/**
* Moves the cursor back to the start of the first line
* without clearing the display.
*/
void home();
/**
* Switches the display off
*/
void noDisplay();
/**
* Switches the display on
*/
void display();
/**
* Disables blinking of the cursor
*/
void noBlink();
/**
*Enables blinking of the cursor
*/
void blink();
/**
* Disables the (underline-)cursor
*/
void noCursor();
/**
* Enables the (underline-)cursor
*/
void cursor();
/**
* Scroll the contents of the display to the left
*/
void scrollDisplayLeft();
/**
* Scroll the contents of the display to the right
*/
void scrollDisplayRight();
/**
* Calling this method will change the way new characters
* are printed at the current cursor-position.
* The character is printed and then the cursor is advanced to the
* column on the right of the character.
* This is "sort of" the standard editor behaviour we are
* used to with western european languages.
* It is also the standard behaviuor when the display is reset.
*/
void leftToRight();
/**
* Calling this method will change the way new characters
* are printed at the current cursor-position.
* The character is printed and then the cursor is advanced to the
* column on the left of the character.
*/
void rightToLeft();
void autoscroll();
void noAutoscroll();
/**
* Set one of the eight user-defineable chars
* @param charCode the code of the char you want to define.
* Values from 0..7 are allowed here
* @param charMap an array of 8 bytes that contains the char
* definition.
*/
void createChar(int charCode, uint8_t charMap[]);
/**
* Set the cursor to a new loaction.
* @param col the column to move the cursor to
* @param row the row to move the cursor to
* If the column- or row-index does exceed
* the number of columns/rows on the hardware
* the cursor stays where it is.
*/
void setCursor(int col, int row);
/*
Using namespace Print::write makes it possible to
to send data to the Lcd via the lcd.write(const char *) or
a lcd.write(const uint8_t *,int) methods.
*/
using Print::write;
#if ARDUINO >= 100
//The Print::write() signatuire was changed with Arduino versions >= 1.0
/**
* Implements the write()-method from the base-class that
* is called whenever a character is to be printed to the
* display.
* @param c the character to be printed.
* @return int number of characters written
*/
virtual size_t write(uint8_t c) { writeChar(c); return 1; }
#else
//This keeps the library compatible with pre-1.0 versions of the Arduino core
/**
* Implements the write()-method from the base-class that
* is called whenever a character is to be printed to the
* display.
* @param c the character to be printed.
*/
virtual void write(uint8_t c) { writeChar(c); }
#endif
/**
* Set the backlight. This is obviously only possible
* if you have build a small circuit for switching/dimming the
* backlight of the display.
* @param value the new value for the backlight. If the
* backlight driver circuit is connected to a normal digital IO-pin
* on the arduino using value=LOW or value=HIGH will switch
* off/on as expected.
* @param usePWM set this to true if the driver is connected to
* a PWM pin on the arduino you can set any dim the backlight
* with values from 0..255
*/
void setBacklight(int value,bool PWM=false);
private:
/**
* Set the intruction set to use for the next command
* @param is the index of the instructionSet to use
*/
void setInstructionSet(int is);
/**
* Call the displaymode function when cursor settings
* have been changed
*/
void writeDisplayMode();
/**
* Send a command to the display
* @param cmd the command to send.
* @param executionTime the hardware needs some time to
* execute the instruction just send. This is the time in
* microseconds the code should wait after trandd´sfrerring the data
*/
void writeCommand(int cmd, int executionTime);
/**
* Send a character to the display
* @param c the character to send.
*/
void writeChar(int c);
/**
* Implements the low-level transfer of the data
* to the hardware.
* @param executionTime the hardware needs some time to
* execute the instruction just send. This is the time in
* microseconds the code should wait after trandd´sfrerring the data
*/
void spiTransfer(int c,int executionTime);
};
#endif