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

SerialLCD.cpp

Committer:
fossum_13
Date:
2013-05-22
Revision:
1:96f055419f71
Parent:
0:df5850d83ee5

File content as of revision 1:96f055419f71:

#include "SerialLCD.h"

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()
{
    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::setType(uint8_t type)
{
/*
  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::toggleSplash()
{
    specialCommand(LCD_SPLASHTOGGLE);
}

void SerialLCD::leftToRight()
{
    _displaymode |= LCD_ENTRYLEFT;
    command(LCD_ENTRYMODESET | _displaymode);
}

void SerialLCD::rightToLeft()
{
    _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::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)
{
    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()
{
    command(0x18);
}

void SerialLCD::scrollRight()
{
    command(0x1C);
}

// Private Functions

void SerialLCD::command(uint8_t value)
{
    putc(0xFE);
    putc(value);
    wait_ms(5);
}

void SerialLCD::specialCommand(uint8_t value)
{
    putc(0x7C);
    putc(value);
    wait_ms(5);
}