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); } }
SerialLCD.cpp@1:96f055419f71, 2013-05-22 (annotated)
- Committer:
- fossum_13
- Date:
- Wed May 22 02:10:44 2013 +0000
- Revision:
- 1:96f055419f71
- Parent:
- 0:df5850d83ee5
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Phlaphead | 0:df5850d83ee5 | 1 | #include "SerialLCD.h" |
Phlaphead | 0:df5850d83ee5 | 2 | |
fossum_13 | 1:96f055419f71 | 3 | SerialLCD::SerialLCD(PinName tx, uint8_t type) : |
fossum_13 | 1:96f055419f71 | 4 | Serial(tx, NC) |
Phlaphead | 0:df5850d83ee5 | 5 | { |
fossum_13 | 1:96f055419f71 | 6 | // Init |
Phlaphead | 0:df5850d83ee5 | 7 | baud(LCD_BAUD); |
fossum_13 | 1:96f055419f71 | 8 | setType(type); |
fossum_13 | 1:96f055419f71 | 9 | |
fossum_13 | 1:96f055419f71 | 10 | _rowoffset = 0; |
fossum_13 | 1:96f055419f71 | 11 | |
fossum_13 | 1:96f055419f71 | 12 | // Reset |
fossum_13 | 1:96f055419f71 | 13 | clear(); |
fossum_13 | 1:96f055419f71 | 14 | setBrightness(30); |
Phlaphead | 0:df5850d83ee5 | 15 | } |
Phlaphead | 0:df5850d83ee5 | 16 | |
Phlaphead | 0:df5850d83ee5 | 17 | void SerialLCD::clear() |
Phlaphead | 0:df5850d83ee5 | 18 | { |
fossum_13 | 1:96f055419f71 | 19 | command(LCD_CLEARDISPLAY); |
fossum_13 | 1:96f055419f71 | 20 | } |
fossum_13 | 1:96f055419f71 | 21 | |
fossum_13 | 1:96f055419f71 | 22 | void SerialLCD::clearLine(uint8_t line) |
fossum_13 | 1:96f055419f71 | 23 | { |
fossum_13 | 1:96f055419f71 | 24 | if(line > 0 && line <= _numlines){ |
fossum_13 | 1:96f055419f71 | 25 | setCursor(line, 1); |
fossum_13 | 1:96f055419f71 | 26 | printf(" "); |
fossum_13 | 1:96f055419f71 | 27 | setCursor(line, 1); |
fossum_13 | 1:96f055419f71 | 28 | } |
fossum_13 | 1:96f055419f71 | 29 | } |
fossum_13 | 1:96f055419f71 | 30 | |
fossum_13 | 1:96f055419f71 | 31 | void SerialLCD::selectLine(uint8_t line) |
fossum_13 | 1:96f055419f71 | 32 | { |
fossum_13 | 1:96f055419f71 | 33 | if(line > 0 && line <= _numlines){ |
fossum_13 | 1:96f055419f71 | 34 | setCursor(line, 1); |
fossum_13 | 1:96f055419f71 | 35 | } |
fossum_13 | 1:96f055419f71 | 36 | } |
fossum_13 | 1:96f055419f71 | 37 | |
fossum_13 | 1:96f055419f71 | 38 | void SerialLCD::setBrightness(uint8_t num) |
fossum_13 | 1:96f055419f71 | 39 | { |
fossum_13 | 1:96f055419f71 | 40 | if(num >= 1 && num <= 30){ |
fossum_13 | 1:96f055419f71 | 41 | specialCommand(LCD_BACKLIGHT | (num - 1)); |
fossum_13 | 1:96f055419f71 | 42 | } |
fossum_13 | 1:96f055419f71 | 43 | } |
fossum_13 | 1:96f055419f71 | 44 | |
fossum_13 | 1:96f055419f71 | 45 | void SerialLCD::home() |
fossum_13 | 1:96f055419f71 | 46 | { |
fossum_13 | 1:96f055419f71 | 47 | command(LCD_RETURNHOME); |
fossum_13 | 1:96f055419f71 | 48 | } |
fossum_13 | 1:96f055419f71 | 49 | |
fossum_13 | 1:96f055419f71 | 50 | void SerialLCD::setSplash() |
fossum_13 | 1:96f055419f71 | 51 | { |
fossum_13 | 1:96f055419f71 | 52 | specialCommand(LCD_SETSPLASHSCREEN); |
Phlaphead | 0:df5850d83ee5 | 53 | } |
Phlaphead | 0:df5850d83ee5 | 54 | |
fossum_13 | 1:96f055419f71 | 55 | void SerialLCD::setType(uint8_t type) |
Phlaphead | 0:df5850d83ee5 | 56 | { |
fossum_13 | 1:96f055419f71 | 57 | /* |
fossum_13 | 1:96f055419f71 | 58 | 3: type 2x16 |
fossum_13 | 1:96f055419f71 | 59 | 4: type 2x20 |
fossum_13 | 1:96f055419f71 | 60 | 5: type 4x16 |
fossum_13 | 1:96f055419f71 | 61 | 6: type 4x20 |
fossum_13 | 1:96f055419f71 | 62 | */ |
fossum_13 | 1:96f055419f71 | 63 | specialCommand(type); |
fossum_13 | 1:96f055419f71 | 64 | switch (type) { |
fossum_13 | 1:96f055419f71 | 65 | case 3: |
fossum_13 | 1:96f055419f71 | 66 | _numlines = LCD_2LINE; |
fossum_13 | 1:96f055419f71 | 67 | _numchars = LCD_16CHAR; |
fossum_13 | 1:96f055419f71 | 68 | |
fossum_13 | 1:96f055419f71 | 69 | break; |
fossum_13 | 1:96f055419f71 | 70 | case 4: |
fossum_13 | 1:96f055419f71 | 71 | _numlines = LCD_2LINE; |
fossum_13 | 1:96f055419f71 | 72 | _numchars = LCD_20CHAR; |
fossum_13 | 1:96f055419f71 | 73 | |
fossum_13 | 1:96f055419f71 | 74 | break; |
fossum_13 | 1:96f055419f71 | 75 | case 5: |
fossum_13 | 1:96f055419f71 | 76 | _numlines = LCD_4LINE; |
fossum_13 | 1:96f055419f71 | 77 | _numchars = LCD_16CHAR; |
fossum_13 | 1:96f055419f71 | 78 | |
fossum_13 | 1:96f055419f71 | 79 | break; |
fossum_13 | 1:96f055419f71 | 80 | case 6: |
fossum_13 | 1:96f055419f71 | 81 | _numlines = LCD_4LINE; |
fossum_13 | 1:96f055419f71 | 82 | _numchars = LCD_20CHAR; |
fossum_13 | 1:96f055419f71 | 83 | |
fossum_13 | 1:96f055419f71 | 84 | break; |
fossum_13 | 1:96f055419f71 | 85 | |
fossum_13 | 1:96f055419f71 | 86 | default: |
fossum_13 | 1:96f055419f71 | 87 | _numlines = LCD_2LINE; |
fossum_13 | 1:96f055419f71 | 88 | _numchars = LCD_16CHAR; |
fossum_13 | 1:96f055419f71 | 89 | } |
Phlaphead | 0:df5850d83ee5 | 90 | } |
Phlaphead | 0:df5850d83ee5 | 91 | |
fossum_13 | 1:96f055419f71 | 92 | void SerialLCD::toggleSplash() |
fossum_13 | 1:96f055419f71 | 93 | { |
fossum_13 | 1:96f055419f71 | 94 | specialCommand(LCD_SPLASHTOGGLE); |
fossum_13 | 1:96f055419f71 | 95 | } |
fossum_13 | 1:96f055419f71 | 96 | |
fossum_13 | 1:96f055419f71 | 97 | void SerialLCD::leftToRight() |
fossum_13 | 1:96f055419f71 | 98 | { |
fossum_13 | 1:96f055419f71 | 99 | _displaymode |= LCD_ENTRYLEFT; |
fossum_13 | 1:96f055419f71 | 100 | command(LCD_ENTRYMODESET | _displaymode); |
fossum_13 | 1:96f055419f71 | 101 | } |
fossum_13 | 1:96f055419f71 | 102 | |
fossum_13 | 1:96f055419f71 | 103 | void SerialLCD::rightToLeft() |
Phlaphead | 0:df5850d83ee5 | 104 | { |
fossum_13 | 1:96f055419f71 | 105 | _displaymode &= ~LCD_ENTRYLEFT; |
fossum_13 | 1:96f055419f71 | 106 | command(LCD_ENTRYMODESET | _displaymode); |
fossum_13 | 1:96f055419f71 | 107 | } |
fossum_13 | 1:96f055419f71 | 108 | |
fossum_13 | 1:96f055419f71 | 109 | void SerialLCD::blink() |
fossum_13 | 1:96f055419f71 | 110 | { |
fossum_13 | 1:96f055419f71 | 111 | _displaycontrol |= LCD_BLINKON; |
fossum_13 | 1:96f055419f71 | 112 | command(LCD_DISPLAYCONTROL | _displaycontrol); |
fossum_13 | 1:96f055419f71 | 113 | } |
fossum_13 | 1:96f055419f71 | 114 | |
fossum_13 | 1:96f055419f71 | 115 | void SerialLCD::noBlink() |
fossum_13 | 1:96f055419f71 | 116 | { |
fossum_13 | 1:96f055419f71 | 117 | _displaycontrol &= ~LCD_BLINKON; |
fossum_13 | 1:96f055419f71 | 118 | command(LCD_DISPLAYCONTROL | _displaycontrol); |
fossum_13 | 1:96f055419f71 | 119 | } |
fossum_13 | 1:96f055419f71 | 120 | |
fossum_13 | 1:96f055419f71 | 121 | void SerialLCD::cursor() |
fossum_13 | 1:96f055419f71 | 122 | { |
fossum_13 | 1:96f055419f71 | 123 | _displaycontrol |= LCD_CURSORON; |
fossum_13 | 1:96f055419f71 | 124 | command(LCD_DISPLAYCONTROL | _displaycontrol); |
Phlaphead | 0:df5850d83ee5 | 125 | } |
Phlaphead | 0:df5850d83ee5 | 126 | |
fossum_13 | 1:96f055419f71 | 127 | void SerialLCD::noCursor() |
fossum_13 | 1:96f055419f71 | 128 | { |
fossum_13 | 1:96f055419f71 | 129 | _displaycontrol &= ~LCD_CURSORON; |
fossum_13 | 1:96f055419f71 | 130 | command(LCD_DISPLAYCONTROL | _displaycontrol); |
fossum_13 | 1:96f055419f71 | 131 | } |
fossum_13 | 1:96f055419f71 | 132 | |
fossum_13 | 1:96f055419f71 | 133 | void SerialLCD::display() |
fossum_13 | 1:96f055419f71 | 134 | { |
fossum_13 | 1:96f055419f71 | 135 | _displaycontrol |= LCD_DISPLAYON; |
fossum_13 | 1:96f055419f71 | 136 | command(LCD_DISPLAYCONTROL | _displaycontrol); |
fossum_13 | 1:96f055419f71 | 137 | } |
fossum_13 | 1:96f055419f71 | 138 | |
fossum_13 | 1:96f055419f71 | 139 | void SerialLCD::noDisplay() |
fossum_13 | 1:96f055419f71 | 140 | { |
fossum_13 | 1:96f055419f71 | 141 | _displaycontrol &= ~LCD_DISPLAYON; |
fossum_13 | 1:96f055419f71 | 142 | command(LCD_DISPLAYCONTROL | _displaycontrol); |
fossum_13 | 1:96f055419f71 | 143 | } |
fossum_13 | 1:96f055419f71 | 144 | |
fossum_13 | 1:96f055419f71 | 145 | void SerialLCD::setCursor(uint8_t row, uint8_t col) |
Phlaphead | 0:df5850d83ee5 | 146 | { |
fossum_13 | 1:96f055419f71 | 147 | int row_offsets[2][4] = { |
fossum_13 | 1:96f055419f71 | 148 | { 0x00, 0x40, 0x10, 0x50 }, |
fossum_13 | 1:96f055419f71 | 149 | { 0x00, 0x40, 0x14, 0x54 } |
fossum_13 | 1:96f055419f71 | 150 | }; |
fossum_13 | 1:96f055419f71 | 151 | if((row > 0 && row < 3) && (col > 0 && col < 17)){ |
fossum_13 | 1:96f055419f71 | 152 | command(LCD_SETDDRAMADDR | ((col - 1) + row_offsets[_rowoffset][(row - 1)])); |
fossum_13 | 1:96f055419f71 | 153 | } |
fossum_13 | 1:96f055419f71 | 154 | } |
fossum_13 | 1:96f055419f71 | 155 | |
fossum_13 | 1:96f055419f71 | 156 | void SerialLCD::createChar(uint8_t location, uint8_t charmap[]) |
fossum_13 | 1:96f055419f71 | 157 | { |
fossum_13 | 1:96f055419f71 | 158 | location -= 1; |
fossum_13 | 1:96f055419f71 | 159 | location &= 0x07; |
fossum_13 | 1:96f055419f71 | 160 | for (int i=0; i<8; i++){ |
fossum_13 | 1:96f055419f71 | 161 | command(LCD_SETCGRAMADDR | (location << 3) | i); |
fossum_13 | 1:96f055419f71 | 162 | putc(charmap[i]); |
fossum_13 | 1:96f055419f71 | 163 | } |
fossum_13 | 1:96f055419f71 | 164 | } |
fossum_13 | 1:96f055419f71 | 165 | |
fossum_13 | 1:96f055419f71 | 166 | void SerialLCD::printCustomChar(uint8_t num) |
fossum_13 | 1:96f055419f71 | 167 | { |
fossum_13 | 1:96f055419f71 | 168 | putc((num - 1)); |
Phlaphead | 0:df5850d83ee5 | 169 | } |
Phlaphead | 0:df5850d83ee5 | 170 | |
Phlaphead | 0:df5850d83ee5 | 171 | void SerialLCD::scrollLeft() |
Phlaphead | 0:df5850d83ee5 | 172 | { |
fossum_13 | 1:96f055419f71 | 173 | command(0x18); |
Phlaphead | 0:df5850d83ee5 | 174 | } |
Phlaphead | 0:df5850d83ee5 | 175 | |
Phlaphead | 0:df5850d83ee5 | 176 | void SerialLCD::scrollRight() |
Phlaphead | 0:df5850d83ee5 | 177 | { |
fossum_13 | 1:96f055419f71 | 178 | command(0x1C); |
fossum_13 | 1:96f055419f71 | 179 | } |
fossum_13 | 1:96f055419f71 | 180 | |
fossum_13 | 1:96f055419f71 | 181 | // Private Functions |
fossum_13 | 1:96f055419f71 | 182 | |
fossum_13 | 1:96f055419f71 | 183 | void SerialLCD::command(uint8_t value) |
fossum_13 | 1:96f055419f71 | 184 | { |
Phlaphead | 0:df5850d83ee5 | 185 | putc(0xFE); |
fossum_13 | 1:96f055419f71 | 186 | putc(value); |
fossum_13 | 1:96f055419f71 | 187 | wait_ms(5); |
Phlaphead | 0:df5850d83ee5 | 188 | } |
fossum_13 | 1:96f055419f71 | 189 | |
fossum_13 | 1:96f055419f71 | 190 | void SerialLCD::specialCommand(uint8_t value) |
fossum_13 | 1:96f055419f71 | 191 | { |
fossum_13 | 1:96f055419f71 | 192 | putc(0x7C); |
fossum_13 | 1:96f055419f71 | 193 | putc(value); |
fossum_13 | 1:96f055419f71 | 194 | wait_ms(5); |
fossum_13 | 1:96f055419f71 | 195 | } |