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 Robert Ellis

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);
    }
}

Files at this revision

API Documentation at this revision

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