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.
Fork of TextLCD by
TextLCD.cpp
00001 /* mbed TextLCD Library, for a 4-bit LCD based on HD44780 00002 * Copyright (c) 2007-2010, sford, http://mbed.org 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 d4, PinName d5, 00027 PinName d6, PinName d7, LCDType type) : _rs(rs), 00028 _e(e), _d(d4, d5, d6, d7), 00029 _type(type) 00030 { 00031 } 00032 00033 void TextLCD::start() 00034 { 00035 _e = 1; 00036 _rs = 0; // command mode 00037 00038 wait(0.015); // Wait 15ms to ensure powered up 00039 00040 // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus) 00041 for (int i=0; i<3; i++) { 00042 writeByte(0x3); 00043 wait(0.00164); // this command takes 1.64ms, so wait for it 00044 } 00045 writeByte(0x2); // 4-bit mode 00046 wait(0.000040f); // most instructions take 40us 00047 00048 writeCommand(0x28); // Function set 001 BW N F - - 00049 writeCommand(0x0C); 00050 writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes 00051 cls(); 00052 } 00053 00054 void TextLCD::character(int column, int row, int c) 00055 { 00056 int a = address(column, row); 00057 writeCommand(a); 00058 writeData(c); 00059 } 00060 00061 void TextLCD::cls() 00062 { 00063 writeCommand(0x01); // cls, and set cursor to 0 00064 wait(0.00164f); // This command takes 1.64 ms 00065 locate(0, 0); 00066 } 00067 00068 void TextLCD::locate(int column, int row) 00069 { 00070 _column = column; 00071 _row = row; 00072 } 00073 00074 int TextLCD::_putc(int value) 00075 { 00076 if (value == '\n') { 00077 _column = 0; 00078 _row++; 00079 if (_row >= rows()) { 00080 _row = 0; 00081 } 00082 } else { 00083 character(_column, _row, value); 00084 _column++; 00085 if (_column >= columns()) { 00086 _column = 0; 00087 _row++; 00088 if (_row >= rows()) { 00089 _row = 0; 00090 } 00091 } 00092 } 00093 return value; 00094 } 00095 00096 int TextLCD::_getc() 00097 { 00098 return -1; 00099 } 00100 00101 void TextLCD::writeByte(int value) 00102 { 00103 _d = value >> 4; 00104 wait(0.000040f); // most instructions take 40us 00105 _e = 0; 00106 wait(0.000040f); 00107 _e = 1; 00108 _d = value >> 0; 00109 wait(0.000040f); 00110 _e = 0; 00111 wait(0.000040f); // most instructions take 40us 00112 _e = 1; 00113 } 00114 00115 void TextLCD::writeCommand(int command) 00116 { 00117 _rs = 0; 00118 writeByte(command); 00119 } 00120 00121 void TextLCD::writeData(int data) 00122 { 00123 _rs = 1; 00124 writeByte(data); 00125 } 00126 00127 int TextLCD::address(int column, int row) 00128 { 00129 switch (_type) { 00130 case LCD20x4: 00131 switch (row) { 00132 case 0: 00133 return 0x80 + column; 00134 case 1: 00135 return 0xc0 + column; 00136 case 2: 00137 return 0x94 + column; 00138 case 3: 00139 return 0xd4 + column; 00140 } 00141 case LCD16x2B: 00142 return 0x80 + (row * 40) + column; 00143 case LCD16x2: 00144 case LCD20x2: 00145 default: 00146 return 0x80 + (row * 0x40) + column; 00147 } 00148 } 00149 00150 int TextLCD::columns() 00151 { 00152 switch (_type) { 00153 case LCD20x4: 00154 case LCD20x2: 00155 return 20; 00156 case LCD16x2: 00157 case LCD16x2B: 00158 default: 00159 return 16; 00160 } 00161 } 00162 00163 int TextLCD::rows() 00164 { 00165 switch (_type) { 00166 case LCD20x4: 00167 return 4; 00168 case LCD16x2: 00169 case LCD16x2B: 00170 case LCD20x2: 00171 default: 00172 return 2; 00173 } 00174 }
Generated on Thu Jul 21 2022 05:21:08 by
