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,1), _d(d4, d5, d6, d7), 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.00164); // 1.64ms 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 00051 void TextLCD::character(int column, int row, int c) { 00052 int a = address(column, row); 00053 writeCommand(a); 00054 writeData(c); 00055 } 00056 00057 void TextLCD::cls() { 00058 writeCommand(0x01); // cls, and set cursor to 0 00059 wait(0.00164f); // This command takes 1.64 ms 00060 locate(0, 0); 00061 } 00062 00063 void TextLCD::locate(int column, int row) { 00064 _column = column; 00065 _row = row; 00066 } 00067 00068 int TextLCD::_putc(int value) { 00069 if (value == '\n') { 00070 _column = 0; 00071 _row++; 00072 if (_row >= rows()) { 00073 _row = 0; 00074 } 00075 } else { 00076 character(_column, _row, value); 00077 _column++; 00078 if (_column >= columns()) { 00079 _column = 0; 00080 _row++; 00081 if (_row >= rows()) { 00082 _row = 0; 00083 } 00084 } 00085 } 00086 return value; 00087 } 00088 00089 int TextLCD::_getc() { 00090 return -1; 00091 } 00092 00093 void TextLCD::writeByte(int value) { 00094 _d = value >> 4; 00095 wait(0.000040f); // most instructions take 40us 00096 _e = 0; 00097 wait(0.000040f); 00098 _e = 1; 00099 _d = value >> 0; 00100 wait(0.000040f); 00101 _e = 0; 00102 wait(0.000040f); // most instructions take 40us 00103 _e = 1; 00104 } 00105 00106 void TextLCD::writeCommand(int command) { 00107 _rs = 0; 00108 writeByte(command); 00109 } 00110 00111 void TextLCD::writeData(int data) { 00112 _rs = 1; 00113 writeByte(data); 00114 } 00115 00116 int TextLCD::address(int column, int row) { 00117 switch (_type) { 00118 case LCD20x4: 00119 switch (row) { 00120 case 0: 00121 return 0x80 + column; 00122 case 1: 00123 return 0xc0 + column; 00124 case 2: 00125 return 0x94 + column; 00126 case 3: 00127 return 0xd4 + column; 00128 } 00129 case LCD16x2B: 00130 return 0x80 + (row * 40) + column; 00131 case LCD16x2: 00132 case LCD20x2: 00133 default: 00134 return 0x80 + (row * 0x40) + column; 00135 } 00136 } 00137 00138 int TextLCD::columns() { 00139 switch (_type) { 00140 case LCD20x4: 00141 case LCD20x2: 00142 return 20; 00143 case LCD16x2: 00144 case LCD16x2B: 00145 default: 00146 return 16; 00147 } 00148 } 00149 00150 int TextLCD::rows() { 00151 switch (_type) { 00152 case LCD20x4: 00153 return 4; 00154 case LCD16x2: 00155 case LCD16x2B: 00156 case LCD20x2: 00157 default: 00158 return 2; 00159 } 00160 }
Generated on Mon Jul 25 2022 00:47:10 by
1.7.2
