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.
TextOLED20x4.cpp
00001 /* mbed TextOLED20x4 Library, for a 4-bit LCD based on HD44780 00002 * CopyLeft Rod Coleman 2012 00003 * Copyright (c) 2007-2010, sford, http://mbed.org 00004 * 00005 * Permission is hereby granted, free of charge, to any person obtaining a copy 00006 * of this software and associated documentation files (the "Software"), to deal 00007 * in the Software without restriction, including without limitation the rights 00008 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00009 * copies of the Software, and to permit persons to whom the Software is 00010 * furnished to do so, subject to the following conditions: 00011 * 00012 * The above copyright notice and this permission notice shall be included in 00013 * all copies or substantial portions of the Software. 00014 * 00015 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00016 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00017 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00018 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00019 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00020 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00021 * THE SOFTWARE. 00022 */ 00023 00024 #include "TextOLED20x4.h" 00025 #include "mbed.h" 00026 00027 TextOLED20x4::TextOLED20x4(PinName rs, PinName e, PinName d4, PinName d5, 00028 PinName d6, PinName d7, LCDType type) : _rs(rs), 00029 _e(e), _d(d4, d5, d6, d7), 00030 _type(type) { 00031 00032 _e = 1; 00033 _rs = 0; // command mode 00034 00035 // Winstar 20x4 WH2004-NYG- needs 40ms after VDD> 4,5V 00036 /* 00037 wait(0.5); 00038 writeCommand(0x2); // 4-bit mode 00039 wait(0.05); 00040 writeCommand(0x28); // Function set 001 BW N F - - 00041 wait(0.05); 00042 */ 00043 //RC:2011-11-23: Newhaven 20x4 OLED data sheet method 00044 wait(0.33); 00045 writeCommand(0x2); // 4-bit mode 00046 wait(0.05); 00047 writeCommand(0x2); // 4-bit mode 00048 wait(0.05); 00049 writeCommand(0x28); // display OFF, "Function Set". 5x8 Font. UK/JP table. Newhaven say 0x08, but this loses 2 rows! 00050 wait(0.05); 00051 writeCommand(0x1); // display clear. takes 6,2ms@fosc=250kHz 00052 wait(0.05); 00053 writeCommand(0x6); // entry mode set 00054 wait(0.05); 00055 writeCommand(0x2); // 4-bit mode 00056 wait(0.05); 00057 writeCommand(0x0C); // ON-OFF ctrl: turns display ON, no cursor. Use 0x0E for cursor ON. 00058 /* 0x28 also works for Winstar WEH002004ALPP5N00000 OLED display. 0x29= westEuro fon table, 0x2A = UK/Russian 00059 */ 00060 00061 wait(0.015); // Wait 15ms to ensure powered up 00062 /* 00063 // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus) 00064 for (int i=0; i<3; i++) { 00065 writeByte(0x3); 00066 wait(0.00164); // this command takes 1.64ms, so wait for it 00067 } 00068 writeByte(0x2); // 4-bit mode 00069 wait(0.000040f); // most instructions take 40us 00070 00071 writeCommand(0x28); // Function set 001 BW N F - - 00072 writeCommand(0x0C); 00073 writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes 00074 cls();*/ 00075 } 00076 00077 void TextOLED20x4::character(int column, int row, int c) { 00078 int a = address(column, row); 00079 writeCommand(a); 00080 writeData(c); 00081 } 00082 00083 void TextOLED20x4::cls() { 00084 writeCommand(0x01); // cls, and set cursor to 0 00085 wait(0.00164f); // This command takes 1.64 ms 00086 locate(0, 0); 00087 } 00088 00089 void TextOLED20x4::locate(int column, int row) { 00090 _column = column; 00091 _row = row; 00092 } 00093 00094 int TextOLED20x4::_putc(int value) { 00095 if (value == '\n') { 00096 _column = 0; 00097 _row++; 00098 if (_row >= rows()) { 00099 _row = 0; 00100 } 00101 } else { 00102 character(_column, _row, value); 00103 _column++; 00104 if (_column >= columns()) { 00105 _column = 0; 00106 _row++; 00107 if (_row >= rows()) { 00108 _row = 0; 00109 } 00110 } 00111 } 00112 return value; 00113 } 00114 00115 int TextOLED20x4::_getc() { 00116 return -1; 00117 } 00118 00119 void TextOLED20x4::writeByte(int value) { 00120 wait_us(1); 00121 _e = 1; // RC added. Must go high at least 20ns after RS settled. 00122 _d = value >> 4; 00123 wait_us(1); 00124 _e = 0; 00125 wait_us(1); 00126 _d = value >> 0; 00127 _e = 1; 00128 wait_us(1); // E high time is 250ns min, and low time 250ns min. 00129 _e = 0; 00130 wait_us(100); // most instructions take 40us 00131 //_e = 1; 00132 } 00133 00134 void TextOLED20x4::writeCommand(int command) { 00135 _e = 0; 00136 _rs = 0; 00137 writeByte(command); 00138 } 00139 00140 void TextOLED20x4::writeData(int data) { 00141 _e = 0; 00142 _rs = 1; 00143 writeByte(data); 00144 } 00145 00146 int TextOLED20x4::address(int column, int row) { 00147 /* switch (_type) { 00148 case LCD20x4:*/ 00149 switch (row) { 00150 case 0: 00151 return 0x80 + column; 00152 case 1: 00153 return 0xc0 + column; 00154 case 2: 00155 return 0x94 + column; 00156 case 3: 00157 return 0xd4 + column; 00158 } 00159 return 0x80 + column; 00160 /* 00161 case LCD16x2B: 00162 return 0x80 + (row * 40) + column; 00163 case LCD16x2: 00164 case LCD20x2: 00165 default: 00166 return 0x80 + (row * 0x40) + column; 00167 }*/ 00168 } 00169 00170 int TextOLED20x4::columns() { 00171 return 20; 00172 /* switch (_type) { 00173 case LCD20x4: 00174 case LCD20x2: 00175 return 20; 00176 case LCD16x2: 00177 case LCD16x2B: 00178 default: 00179 return 16; 00180 }*/ 00181 } 00182 00183 int TextOLED20x4::rows() { 00184 return 4; 00185 /*switch (_type) { 00186 case LCD20x4: 00187 return 4; 00188 case LCD16x2: 00189 case LCD16x2B: 00190 case LCD20x2: 00191 default: 00192 return 2; 00193 }*/ 00194 }
Generated on Tue Jul 12 2022 17:29:58 by
1.7.2