SparkFun SerLCD v2.5 controller; Copied from the Arduino.cc SerLCD library; http://playground.arduino.cc/Code/SerLCD
Dependents: ForEhab Serial_HelloWorld_Mbed ForOfek
Fork of LCDSerial by
Test Code
#include "mbed.h" #include "SerialLCD.h" SerialLCD lcd(PTC4); uint8_t smiley[8] = { 0x00, 0x11, 0x00, 0x00, 0x11, 0x0E, 0x00 }; int main() { lcd.clear(); while(true) { /// Test code /// lcd.clearLine(1); lcd.printf("Full Bright Test"); lcd.setBrightness(30); wait(3); lcd.clearLine(1); lcd.printf("Blink Test"); lcd.setCursor(2, 1); lcd.printf("Blinking"); lcd.blink(); wait(3); lcd.clearLine(1); lcd.printf("Clear Test"); wait(2); lcd.clear(); wait(3); lcd.clearLine(1); lcd.printf("New Char Test"); lcd.setCursor(2, 1); lcd.createChar(1, smiley); lcd.printCustomChar(1); wait(3); lcd.clearLine(1); lcd.printf("Cursor Test"); lcd.setCursor(2, 1); lcd.cursor(); wait(3); lcd.clearLine(1); lcd.printf("Display Test"); lcd.noDisplay(); wait(2); lcd.display(); wait(3); lcd.clearLine(1); lcd.printf("Home Test"); lcd.setCursor(2, 1); lcd.home(); lcd.printf("Got home"); wait(3); lcd.leftToRight(); lcd.clearLine(1); lcd.printf("LeftToRight Test"); wait(3); lcd.clearLine(1); lcd.printf("noBlink Test"); lcd.setCursor(2, 1); lcd.noBlink(); wait(3); lcd.clearLine(1); lcd.printf("noCursor Test"); lcd.setCursor(2, 1); lcd.noCursor(); wait(3); lcd.rightToLeft(); lcd.clearLine(1); lcd.printf("rightToLeft Test"); wait(3); lcd.clearLine(1); lcd.printf("Half Bright Test"); lcd.setBrightness(15); wait(3); } }
Revision 1:96f055419f71, committed 2013-05-22
- Comitter:
- fossum_13
- Date:
- Wed May 22 02:10:44 2013 +0000
- Parent:
- 0:df5850d83ee5
- Commit message:
- Initial commit
Changed in this revision
SerialLCD.cpp | Show annotated file Show diff for this revision Revisions of this file |
SerialLCD.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r df5850d83ee5 -r 96f055419f71 SerialLCD.cpp --- a/SerialLCD.cpp Sun Feb 13 15:16:20 2011 +0000 +++ b/SerialLCD.cpp Wed May 22 02:10:44 2013 +0000 @@ -1,48 +1,195 @@ - #include "SerialLCD.h" - -SerialLCD::SerialLCD(PinName tx, PinName rx) : - Serial(tx, rx) +SerialLCD::SerialLCD(PinName tx, uint8_t type) : + Serial(tx, NC) { + // Init baud(LCD_BAUD); + setType(type); + + _rowoffset = 0; + + // Reset + clear(); + setBrightness(30); } - void SerialLCD::clear() { - putc(0xFE); - putc(0x01); + command(LCD_CLEARDISPLAY); +} + +void SerialLCD::clearLine(uint8_t line) +{ + if(line > 0 && line <= _numlines){ + setCursor(line, 1); + printf(" "); + setCursor(line, 1); + } +} + +void SerialLCD::selectLine(uint8_t line) +{ + if(line > 0 && line <= _numlines){ + setCursor(line, 1); + } +} + +void SerialLCD::setBrightness(uint8_t num) +{ + if(num >= 1 && num <= 30){ + specialCommand(LCD_BACKLIGHT | (num - 1)); + } +} + +void SerialLCD::home() +{ + command(LCD_RETURNHOME); +} + +void SerialLCD::setSplash() +{ + specialCommand(LCD_SETSPLASHSCREEN); } -void SerialLCD::setBacklight(int brightness) +void SerialLCD::setType(uint8_t type) { - putc(0x7C); - putc(128+brightness); +/* + 3: type 2x16 + 4: type 2x20 + 5: type 4x16 + 6: type 4x20 +*/ + specialCommand(type); + switch (type) { + case 3: + _numlines = LCD_2LINE; + _numchars = LCD_16CHAR; + + break; + case 4: + _numlines = LCD_2LINE; + _numchars = LCD_20CHAR; + + break; + case 5: + _numlines = LCD_4LINE; + _numchars = LCD_16CHAR; + + break; + case 6: + _numlines = LCD_4LINE; + _numchars = LCD_20CHAR; + + break; + + default: + _numlines = LCD_2LINE; + _numchars = LCD_16CHAR; + } } -void SerialLCD::setPosition(int row, int col) +void SerialLCD::toggleSplash() +{ + specialCommand(LCD_SPLASHTOGGLE); +} + +void SerialLCD::leftToRight() +{ + _displaymode |= LCD_ENTRYLEFT; + command(LCD_ENTRYMODESET | _displaymode); +} + +void SerialLCD::rightToLeft() { - int position = row == 0 ? (128 + col) : (192 + col); - putc(0xFE); - putc(position); + _displaymode &= ~LCD_ENTRYLEFT; + command(LCD_ENTRYMODESET | _displaymode); +} + +void SerialLCD::blink() +{ + _displaycontrol |= LCD_BLINKON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +void SerialLCD::noBlink() +{ + _displaycontrol &= ~LCD_BLINKON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +void SerialLCD::cursor() +{ + _displaycontrol |= LCD_CURSORON; + command(LCD_DISPLAYCONTROL | _displaycontrol); } -void SerialLCD::setVisible(bool visible) +void SerialLCD::noCursor() +{ + _displaycontrol &= ~LCD_CURSORON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +void SerialLCD::display() +{ + _displaycontrol |= LCD_DISPLAYON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +void SerialLCD::noDisplay() +{ + _displaycontrol &= ~LCD_DISPLAYON; + command(LCD_DISPLAYCONTROL | _displaycontrol); +} + +void SerialLCD::setCursor(uint8_t row, uint8_t col) { - putc(0xFE); - putc(visible ? 0x0C : 0x08); + int row_offsets[2][4] = { + { 0x00, 0x40, 0x10, 0x50 }, + { 0x00, 0x40, 0x14, 0x54 } + }; + if((row > 0 && row < 3) && (col > 0 && col < 17)){ + command(LCD_SETDDRAMADDR | ((col - 1) + row_offsets[_rowoffset][(row - 1)])); + } +} + +void SerialLCD::createChar(uint8_t location, uint8_t charmap[]) +{ + location -= 1; + location &= 0x07; + for (int i=0; i<8; i++){ + command(LCD_SETCGRAMADDR | (location << 3) | i); + putc(charmap[i]); + } +} + +void SerialLCD::printCustomChar(uint8_t num) +{ + putc((num - 1)); } void SerialLCD::scrollLeft() { - putc(0xFE); - putc(0x18); + command(0x18); } void SerialLCD::scrollRight() { + command(0x1C); +} + +// Private Functions + +void SerialLCD::command(uint8_t value) +{ putc(0xFE); - putc(0x1C); + putc(value); + wait_ms(5); } - \ No newline at end of file + +void SerialLCD::specialCommand(uint8_t value) +{ + putc(0x7C); + putc(value); + wait_ms(5); +}
diff -r df5850d83ee5 -r 96f055419f71 SerialLCD.h --- a/SerialLCD.h Sun Feb 13 15:16:20 2011 +0000 +++ b/SerialLCD.h Wed May 22 02:10:44 2013 +0000 @@ -3,55 +3,218 @@ #include "mbed.h" -#define LCD_WIDTH 16 #define LCD_BAUD 9600 +// Commands +#define LCD_BACKLIGHT 0x80 +#define LCD_CLEARDISPLAY 0x01 +#define LCD_CURSORSHIFT 0x10 +#define LCD_DISPLAYCONTROL 0x08 +#define LCD_ENTRYMODESET 0x04 +#define LCD_FUNCTIONSET 0x20 +#define LCD_SETCGRAMADDR 0x40 +#define LCD_SETDDRAMADDR 0x80 +#define LCD_SETSPLASHSCREEN 0x0A +#define LCD_SPLASHTOGGLE 0x09 +#define LCD_RETURNHOME 0x02 + +// Flags for display entry mode +#define LCD_ENTRYRIGHT 0x00 +#define LCD_ENTRYLEFT 0x02 + +// Flags for display on/off control +#define LCD_BLINKON 0x01 +#define LCD_CURSORON 0x02 +#define LCD_DISPLAYON 0x04 + +// Flags for display size +#define LCD_2LINE 0x02 +#define LCD_4LINE 0x04 +#define LCD_16CHAR 0x10 +#define LCD_20CHAR 0x14 + +// Flags for setting display size +#define LCD_SET2LINE 0x06 +#define LCD_SET4LINE 0x05 +#define LCD_SET16CHAR 0x04 +#define LCD_SET20CHAR 0x03 + +// LCD Types +#define LCD_2X16 3 +#define LCD_2X20 4 +#define LCD_4X16 5 +#define LCD_4X20 6 + /** * SparkFun SerLCD v2.5 Controller + * + * Copied from the Arduino.cc SerLCD library. + * @see http://playground.arduino.cc/Code/SerLCD */ class SerialLCD : public Serial { public: - - /** - * Constructor. + /** Constructor. * @param tx Connected to rx pin of LCD - * @param rx Not connected but needs to be specified for serial interface. + * @param type Type of LCD (Optional default 16x2) */ - SerialLCD(PinName tx, PinName rx); + SerialLCD(PinName tx, uint8_t type = 3); - /** - * Clear the LCD. + /** Blinks the cursor. This blinks the whole + * box or just the cursor bar. + */ + void blink(); + + /** Clears the whole LCD and sets the + * cursor to the first row, first column. */ void clear(); - - /** - * Set backlight brightness; + /** Clears the current line and resets + * the cursor to the beginning of the + * line. */ - void setBacklight(int brightness); - - /** - * Set cursor position. + void clearLine(uint8_t); + /** Creates a custom character for the + * LCD. + * @param location Location to store the char (1-8) + * @param data Byte array containing the enabled pixel bits + * @code + * #include <NewSoftSerial.h> + * #include <serLCD.h> + * + * // Set pin to the LCD's rxPin + * int pin = 2; + * + * serLCD lcd(pin); + * + * byte bars[8][8] = { + * {B00000,B00000,B00000,B00000,B00000,B00000,B00000,B11111}, + * {B00000,B00000,B00000,B00000,B00000,B00000,B11111,B11111}, + * {B00000,B00000,B00000,B00000,B00000,B11111,B11111,B11111}, + * {B00000,B00000,B00000,B00000,B11111,B11111,B11111,B11111}, + * {B00000,B00000,B00000,B11111,B11111,B11111,B11111,B11111}, + * {B00000,B00000,B11111,B11111,B11111,B11111,B11111,B11111}, + * {B00000,B11111,B11111,B11111,B11111,B11111,B11111,B11111}, + * {B11111,B11111,B11111,B11111,B11111,B11111,B11111,B11111} + * }; + * + * void main() { + * for (int i=1; i < 9; i++){ + * lcd.createChar(i, bars[i-1]); + * } + * for (int i=1; i < 9; i++){ + * lcd.printCustomChar(i); + * } + * while(1); + * } + * + * @endcode */ - void setPosition(int row, int col); - - /** - * Make LCD text visible or invisible. + void createChar(uint8_t, uint8_t[]); + /** Display the LCD cursor: an underscore (line) at the + * position to which the next character will be written. + * This does not define if it blinks or not. + */ + void cursor(); + /** Turns on the LCD display, after it's been turned off + * with noDisplay(). This will restore the text (and + * cursor) that was on the display. + */ + void display(); + /** Positions the cursor in the upper-left of the LCD. + */ + void home(); + /** Set the direction for text written to the LCD to + * left-to-right, the default. This means that subsequent + * characters written to the display will go from left to + * right, but does not affect previously-output text. + */ + void leftToRight(); + /** Turns off the blinking LCD cursor. */ - void setVisible(bool visible); - - /** - * Start scrolling to the left. + void noBlink(); + /** Hides the LCD cursor. + */ + void noCursor(); + /** Turns off the LCD display, without losing the text + * currently shown on it. + */ + void noDisplay(); + /** Print a custom character (gylph) on to the LCD. Up + * to eight characters of 5x8 pixels are supported + * (numbered 1 to 8). The custom characters are designed + * by the createChar() command. + * @param location Which character to print (1 to 8), created by createChar() + */ + void printCustomChar(uint8_t); + /** Set the direction for text written to the LCD to + * right-to-left (the default is left-to-right). This + * means that subsequent characters written to the + * display will go from right to left, but does not + * affect previously-output text. + */ + void rightToLeft(); + /** Scrolls the text on the LCD one position to the left. */ void scrollLeft(); - - /** - * Start scrolling to the right. + /** Scrolls the text on the LCD one position to the right. */ void scrollRight(); + /** Moves the cursor to the beginning of selected line. + * Line numbers start with 1. Valid line numbers are 1-4. + * @param line Line number to go to + */ + void selectLine(uint8_t line); + /** Sets the backlight brightness based on input value. + * Values range from 1-30. + * @params brightness 1 = Off -> 30 = Full Brightness + */ + void setBrightness(uint8_t num); + /** Position the LCD cursor. + * @param row Row position of the cursor (1 being the first row) + * @param col Column position the cursor (1 being the first column) + */ + void setCursor(uint8_t row, uint8_t col); + /** Saves the first 2 lines of text that are currently + * printed on the LCD screen to memory as the new splash screen. + * @code + * void setup() + * { + * lcd.print(" New "); + * lcd.print(" Splash Screen! "); + * lcd.setSplash(); + * } + * @endcode + */ + void setSplash(); + /** The SerLCD firmware v2.5 supports setting different types + * of LCD's. This function allows to easily set the type of LCD. + * + * The function expects a parameter value of 3 - 6: + * Defines: + * LCD_2X16(3) - 2x16 LCD + * LCD_2X20(4) - 2x20 LCD + * LCD_4X16(5) - 4x16 LCD + * LCD_4X20(6) - 4x20 LCD + * + * After changing the settings, the value is written to the EEPROM + * so the SerialLCD will remember it even after a power-off. + */ + void setType(uint8_t type); + /** Toggles the splash screen on/off. + */ + void toggleSplash(); - +private: + void command(uint8_t); + void specialCommand(uint8_t); + + uint8_t _displayfunction; + uint8_t _displaycontrol; + uint8_t _displaymode; + uint8_t _numlines; + uint8_t _numchars; + uint8_t _rowoffset; }; - #endif