Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: ForEhab Serial_HelloWorld_Mbed ForOfek
Fork of LCDSerial by
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 |
--- 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);
+}
--- 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
