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.
TextLCD.cpp
00001 /* mbed TextLCD Library, for a 4-bit LCD based on HD44780 00002 * Copyright (c) 2007-2010, sford 00003 * 00004 * Permission is hereby granted, free of charge, to any person obtaining a copy 00005 * of this software and associated documentation files (the "Software"), to deal 00006 * in the Software without restriction, including without limitation the rights 00007 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00008 * copies of the Software, and to permit persons to whom the Software is 00009 * furnished to do so, subject to the following conditions: 00010 * 00011 * The above copyright notice and this permission notice shall be included in 00012 * all copies or substantial portions of the Software. 00013 * 00014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00017 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00019 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00020 * THE SOFTWARE. 00021 */ 00022 00023 #include "TextLCD.h" 00024 #include "mbed.h" 00025 00026 TextLCD::TextLCD(PinName rs, PinName e, PinName d0, PinName d1, 00027 PinName d2, PinName d3, LCDType type) : _rs(rs), 00028 _e(e), _d(d0, d1, d2, d3), 00029 _type(type) { 00030 00031 _e = 1; 00032 _rs = 0; // command mode 00033 00034 wait(0.015); // Wait 15ms to ensure powered up 00035 00036 // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus) 00037 for (int i=0; i<3; i++) { 00038 writeByte(0x3); 00039 wait(0.00164); // this command takes 1.64ms, so wait for it 00040 } 00041 writeByte(0x2); // 4-bit mode 00042 wait(0.000040f); // most instructions take 40us 00043 00044 writeCommand(0x28); // Function set 001 BW N F - - 00045 writeCommand(0x0C); 00046 writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes 00047 cls(); 00048 } 00049 00050 void TextLCD::character(int column, int row, int c) { 00051 int a = address(column, row); 00052 writeCommand(a); 00053 writeData(c); 00054 } 00055 00056 void TextLCD::cls() { 00057 writeCommand(0x01); // cls, and set cursor to 0 00058 wait(0.00164f); // This command takes 1.64 ms 00059 locate(0, 0); 00060 } 00061 00062 void TextLCD::locate(int column, int row) { 00063 _column = column; 00064 _row = row; 00065 } 00066 00067 int TextLCD::_putc(int value) { 00068 if (value == '\n') { 00069 _column = 0; 00070 _row++; 00071 if (_row >= rows()) { 00072 _row = 0; 00073 } 00074 } else { 00075 character(_column, _row, value); 00076 _column++; 00077 if (_column >= columns()) { 00078 _column = 0; 00079 _row++; 00080 if (_row >= rows()) { 00081 _row = 0; 00082 } 00083 } 00084 } 00085 return value; 00086 } 00087 00088 int TextLCD::_getc() { 00089 return -1; 00090 } 00091 00092 void TextLCD::writeByte(int value) { 00093 _d = value >> 4; 00094 wait(0.000040f); // most instructions take 40us 00095 _e = 0; 00096 wait(0.000040f); 00097 _e = 1; 00098 _d = value >> 0; 00099 wait(0.000040f); 00100 _e = 0; 00101 wait(0.000040f); // most instructions take 40us 00102 _e = 1; 00103 } 00104 00105 void TextLCD::writeCommand(int command) { 00106 _rs = 0; 00107 writeByte(command); 00108 } 00109 00110 void TextLCD::writeData(int data) { 00111 _rs = 1; 00112 writeByte(data); 00113 } 00114 00115 int TextLCD::address(int column, int row) { 00116 switch (_type) { 00117 case LCD20x4: 00118 switch (row) { 00119 case 0: 00120 return 0x80 + column; 00121 case 1: 00122 return 0xc0 + column; 00123 case 2: 00124 return 0x94 + column; 00125 case 3: 00126 return 0xd4 + column; 00127 } 00128 case LCD16x2B: 00129 return 0x80 + (row * 40) + column; 00130 case LCD16x2: 00131 case LCD20x2: 00132 default: 00133 return 0x80 + (row * 0x40) + column; 00134 } 00135 } 00136 00137 int TextLCD::columns() { 00138 switch (_type) { 00139 case LCD20x4: 00140 case LCD20x2: 00141 return 20; 00142 case LCD16x2: 00143 case LCD16x2B: 00144 default: 00145 return 16; 00146 } 00147 } 00148 00149 int TextLCD::rows() { 00150 switch (_type) { 00151 case LCD20x4: 00152 return 4; 00153 case LCD16x2: 00154 case LCD16x2B: 00155 case LCD20x2: 00156 default: 00157 return 2; 00158 } 00159 }
Generated on Sun Jul 17 2022 00:55:54 by
