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);
    }
}
Revision:
1:96f055419f71
Parent:
0:df5850d83ee5
--- 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);
+}