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 LCDs based on HD44780 controllers 00002 * Copyright (c) 2007-2010, sford, http://mbed.org 00003 * 2013, v01: WH, Added LCD types, fixed LCD address issues, added Cursor and UDCs 00004 * 2013, v02: WH, Added I2C and SPI bus interfaces 00005 * 2013, v03: WH, Added support for LCD40x4 which uses 2 controllers 00006 * 2013, v04: WH, Added support for Display On/Off, improved 4bit bootprocess 00007 * 2013, v05: WH, Added support for 8x2B, added some UDCs 00008 * 2013, v06: WH, Added support for devices that use internal DC/DC converters 00009 * 2013, v07: WH, Added support for backlight and include portdefinitions for LCD2004 Module from DFROBOT 00010 * 2014, v08: WH, Refactored in Base and Derived Classes to deal with mbed lib change regarding 'NC' defined pins 00011 * 2014, v09: WH/EO, Added Class for Native SPI controllers such as ST7032 00012 * 2014, v10: WH, Added Class for Native I2C controllers such as ST7032i, Added support for MCP23008 I2C portexpander, Added support for Adafruit module 00013 * 2014, v11: WH, Added support for native I2C controllers such as PCF21XX, Improved the _initCtrl() method to deal with differences between all supported controllers 00014 * 2014, v12: WH, Added support for native I2C controller PCF2119 and native I2C/SPI controllers SSD1803, ST7036, added setContrast method (by JH1PJL) for supported devices (eg ST7032i) 00015 * 2014, v13: WH, Added support for controllers US2066/SSD1311 (OLED), added setUDCBlink() method for supported devices (eg SSD1803), fixed issue in setPower() 00016 * 2014, v14: WH, Added support for PT6314 (VFD), added setOrient() method for supported devices (eg SSD1803, US2066), added Double Height lines for supported devices, 00017 * added 16 UDCs for supported devices (eg PCF2103), moved UDC defines to TextLCD_UDC file, added TextLCD_Config.h for feature and footprint settings. 00018 * 2014, v15: WH, Added AC780 support, added I2C expander modules, fixed setBacklight() for inverted logic modules. Fixed bug in LCD_SPI_N define 00019 * 2014, v16: WH, Added ST7070 and KS0073 support, added setIcon(), clrIcon() and setInvert() method for supported devices 00020 * 2015, v17: WH, Clean up low-level _writeCommand() and _writeData(), Added support for alternative fonttables (eg PCF21XX), Added ST7066_ACM controller for ACM1602 module 00021 * 2015, v18: WH, Performance improvement I2C portexpander 00022 * 2015, v19: WH, Fixed Adafruit I2C/SPI portexpander pinmappings, fixed SYDZ Backlight 00023 * 2015, v20: WH, Fixed occasional Init fail caused by insufficient wait time after ReturnHome command (0x02), Added defines to reduce memory footprint (eg LCD_ICON), 00024 * Fixed and Added more fonttable support for PCF2119R_3V3, Added HD66712 controller. 00025 * 00026 * Permission is hereby granted, free of charge, to any person obtaining a copy 00027 * of this software and associated documentation files (the "Software"), to deal 00028 * in the Software without restriction, including without limitation the rights 00029 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00030 * copies of the Software, and to permit persons to whom the Software is 00031 * furnished to do so, subject to the following conditions: 00032 * 00033 * The above copyright notice and this permission notice shall be included in 00034 * all copies or substantial portions of the Software. 00035 * 00036 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00037 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00038 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00039 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00040 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00041 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00042 * THE SOFTWARE. 00043 */ 00044 #include "mbed.h" 00045 #include "TextLCD.h" 00046 #include "TextLCD_UDC.inc" 00047 00048 /** Create a TextLCD_Base interface 00049 * 00050 * @param type Sets the panel size/addressing mode (default = LCD16x2) 00051 * @param ctrl LCD controller (default = HD44780) 00052 */ 00053 TextLCD_Base::TextLCD_Base(LCDType type, LCDCtrl ctrl) : _type(type), _ctrl(ctrl) { 00054 00055 // Extract LCDType data 00056 00057 // Columns encoded in b7..b0 00058 _nr_cols = (_type & 0xFF); 00059 00060 // Rows encoded in b15..b8 00061 _nr_rows = ((_type >> 8) & 0xFF); 00062 00063 // Addressing mode encoded in b19..b16 00064 _addr_mode = _type & LCD_T_ADR_MSK; 00065 00066 // Font table, encoded in LCDCtrl 00067 _font = _ctrl & LCD_C_FNT_MSK; 00068 } 00069 00070 /** Init the LCD Controller(s) 00071 * Clear display 00072 * @param _LCDDatalength dl sets the datalength of data/commands 00073 * @return none 00074 */ 00075 void TextLCD_Base::_init(_LCDDatalength dl) { 00076 00077 wait_ms(100); // Wait 100ms to ensure powered up 00078 00079 // Select and configure second LCD controller when needed 00080 if(_type==LCD40x4) { 00081 _ctrl_idx=_LCDCtrl_1; // Select 2nd controller 00082 _initCtrl(dl); // Init 2nd controller 00083 } 00084 00085 // Select and configure primary LCD controller 00086 _ctrl_idx=_LCDCtrl_0; // Select primary controller 00087 _initCtrl(dl); // Init primary controller 00088 00089 // Clear whole display and Reset Cursor location 00090 // Note: This will make sure that some 3-line displays that skip topline of a 4-line configuration 00091 // are cleared and init cursor correctly. 00092 cls(); 00093 } 00094 00095 /** Init the LCD controller 00096 * Set number of lines, fonttype, no cursor etc 00097 * The controller is accessed in 4-bit parallel mode either directly via mbed pins or through I2C or SPI expander. 00098 * Some controllers also support native I2C or SPI interfaces. 00099 * 00100 * @param _LCDDatalength dl sets the 4 or 8 bit datalength of data/commands. Required for some native serial modes. 00101 * @return none 00102 * 00103 * Note: some configurations are commented out because they have not yet been tested due to lack of hardware 00104 */ 00105 void TextLCD_Base::_initCtrl(_LCDDatalength dl) { 00106 int _bias_lines=0; // Set Bias and lines (Instr Set 1), temporary variable. 00107 int _lines=0; // Set lines (Ext Instr Set), temporary variable. 00108 00109 this->_setRS(false); // command mode 00110 00111 if (dl == _LCD_DL_4) { 00112 // The Controller could be in 8 bit mode (power-on reset) or in 4 bit mode (warm reboot) at this point. 00113 // Follow this procedure to make sure the Controller enters the correct state. The hardware interface 00114 // between the uP and the LCD can only write the 4 most significant bits (Most Significant Nibble, MSN). 00115 // In 4 bit mode the LCD expects the MSN first, followed by the LSN. 00116 // 00117 // Current state: 8 bit mode | 4 bit mode, MSN is next | 4 bit mode, LSN is next 00118 //------------------------------------------------------------------------------------------------- 00119 _writeNibble(0x3); // set 8 bit mode (MSN) and dummy LSN, | set 8 bit mode (MSN), | set dummy LSN, 00120 // remains in 8 bit mode | remains in 4 bit mode | remains in 4 bit mode 00121 wait_ms(15); // 00122 00123 _writeNibble(0x3); // set 8 bit mode (MSN) and dummy LSN, | set dummy LSN, | set 8bit mode (MSN), 00124 // remains in 8 bit mode | change to 8 bit mode | remains in 4 bit mode 00125 wait_ms(15); // 00126 00127 _writeNibble(0x3); // set 8 bit mode (MSN) and dummy LSN, | set 8 bit mode (MSN) and dummy LSN, | set dummy LSN, 00128 // remains in 8 bit mode | remains in 8 bit mode | change to 8 bit mode 00129 wait_ms(15); // 00130 00131 // Controller is now in 8 bit mode 00132 00133 _writeNibble(0x2); // Change to 4-bit mode (MSN), the LSN is undefined dummy 00134 wait_us(40); // most instructions take 40us 00135 00136 // Controller is now in 4-bit mode 00137 // Note: 4/8 bit mode is ignored for most native SPI and I2C devices. They dont use the parallel bus. 00138 // However, _writeNibble() method is void anyway for native SPI and I2C devices. 00139 } 00140 else { 00141 // Reset in 8 bit mode, final Function set will follow 00142 _writeCommand(0x30); // Function set 0 0 1 DL=1 N F x x 00143 wait_ms(1); // most instructions take 40us 00144 } 00145 00146 // Device specific initialisations: DC/DC converter to generate VLCD or VLED, number of lines etc 00147 switch (_ctrl) { 00148 00149 case KS0073: 00150 // Initialise Display configuration 00151 switch (_type) { 00152 case LCD8x1: //8x1 is a regular 1 line display 00153 case LCD12x1: 00154 case LCD16x1: 00155 case LCD20x1: 00156 case LCD24x1: 00157 // case LCD32x1: // EXT pin is High, extension driver needed 00158 // case LCD40x1: // EXT pin is High, extension driver needed 00159 _function = 0x02; // Function set 001 DL N RE(0) DH REV (Std Regs) 00160 // DL=0 (4 bits bus) 00161 // N=0 (1-line mode, N=1 2-line mode) 00162 // RE=0 (Dis. Extended Regs, special mode for KS0073) 00163 // DH=1 (Disp shift enable, special mode for KS0073) 00164 // REV=0 (Reverse normal, special mode for KS0073) 00165 00166 _function_1 = 0x04; // Function set 001 DL N RE(1) BE LP (Ext Regs) 00167 // DL=0 (4 bits bus) 00168 // N=0 (1-line mode, N=1 2-line mode) 00169 // RE=1 (Ena Extended Regs, special mode for KS0073) 00170 // BE=0 (Blink Enable, CG/SEG RAM, special mode for KS0073) 00171 // LP=0 (LP=1 Low power mode, LP=0 Normal) 00172 00173 _function_x = 0x00; // Ext Function set 0000 1 FW BW NW (Ext Regs) 00174 // NW=0 (1,2 line), NW=1 (4 Line, special mode for KS0073) 00175 break; 00176 00177 // case LCD12x3D: // Special mode for KS0073, KS0078 and PCF21XX 00178 // case LCD12x3D1: // Special mode for KS0073, KS0078 and PCF21XX 00179 case LCD12x4D: // Special mode for KS0073, KS0078 and PCF21XX 00180 // case LCD16x3D: // Special mode for KS0073, KS0078 00181 // case LCD16x4D: // Special mode for KS0073, KS0078 00182 case LCD20x4D: // Special mode for KS0073, KS0078 00183 _function = 0x02; // Function set 001 DL N RE(0) DH REV (Std Regs) 00184 // DL=0 (4 bits bus) 00185 // N=0 (dont care for 4 line mode) 00186 // RE=0 (Dis. Extended Regs, special mode for KS0073) 00187 // DH=1 (Disp shift enable, special mode for KS0073) 00188 // REV=0 (Reverse normal, special mode for KS0073) 00189 00190 _function_1 = 0x04; // Function set 001 DL N RE(1) BE LP (Ext Regs) 00191 // DL=0 (4 bits bus) 00192 // N=0 (1-line mode), N=1 (2-line mode) 00193 // RE=1 (Ena Extended Regs, special mode for KS0073) 00194 // BE=0 (Blink Enable, CG/SEG RAM, special mode for KS0073) 00195 // LP=0 (LP=1 Low power mode, LP=0 Normal) 00196 00197 _function_x = 0x01; // Ext Function set 0000 1 FW BW NW (Ext Regs) 00198 // NW=0 (1,2 line), NW=1 (4 Line, special mode for KS0073) 00199 break; 00200 00201 00202 case LCD16x3G: // Special mode for ST7036 00203 // case LCD24x3D: // Special mode for KS0078 00204 // case LCD24x3D1: // Special mode for KS0078 00205 case LCD24x4D: // Special mode for KS0078 00206 error("Error: LCD Controller type does not support this Display type\n\r"); 00207 break; 00208 00209 default: 00210 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4) 00211 _function = 0x0A; // Function set 001 DL N RE(0) DH REV (Std Regs) 00212 // DL=0 (4 bits bus) 00213 // N=1 (2-line mode), N=0 (1-line mode) 00214 // RE=0 (Dis. Extended Regs, special mode for KS0073) 00215 // DH=1 (Disp shift enable, special mode for KS0073) 00216 // REV=0 (Reverse normal, special mode for KS0073) 00217 00218 _function_1 = 0x0C; // Function set 001 DL N RE(1) BE LP (Ext Regs) 00219 // DL=0 (4 bits bus) 00220 // N=1 (2 line mode), N=0 (1-line mode) 00221 // RE=1 (Ena Extended Regs, special mode for KS0073) 00222 // BE=0 (Blink Enable, CG/SEG RAM, special mode for KS0073) 00223 // LP=0 (LP=1 Low power mode, LP=0 Normal) 00224 00225 _function_x = 0x00; // Ext Function set 0000 1 FW BW NW (Ext Regs) 00226 // NW=0 (1,2 line), NW=1 (4 Line, special mode for KS0073) 00227 break; 00228 } // switch type 00229 00230 // init special features 00231 _writeCommand(0x20 | _function_1);// Function set 001 DL N RE(1) BE LP (Ext Regs) 00232 // DL=0 (4 bits bus), DL=1 (8 bits mode) 00233 // N=0 (1 line mode), N=1 (2 line mode) 00234 // RE=1 (Ena Extended Regs, special mode for KS0073) 00235 // BE=0 (Blink Enable/Disable, CG/SEG RAM, special mode for KS0073) 00236 // LP=0 (LP=1 Low power mode, LP=0 Normal) 00237 00238 _writeCommand(0x08 | _function_x); // Ext Function set 0000 1 FW BW NW (Ext Regs) 00239 // FW=0 (5-dot font, special mode for KS0073) 00240 // BW=0 (Cur BW invert disable, special mode for KS0073) 00241 // NW=0 (1,2 Line), NW=1 (4 line, special mode for KS0073) 00242 00243 _writeCommand(0x10); // Scroll/Shift set 0001 DS/HS4 DS/HS3 DS/HS2 DS/HS1 (Ext Regs) 00244 // Dotscroll/Display shift enable (Special mode for KS0073) 00245 00246 _writeCommand(0x80); // Scroll Quantity set 1 0 SQ5 SQ4 SQ3 SQ2 SQ1 SQ0 (Ext Regs) 00247 // Scroll quantity (Special mode for KS0073) 00248 00249 _writeCommand(0x20 | _function); // Function set 001 DL N RE(0) DH REV (Std Regs) 00250 // DL=0 (4 bits bus), DL=1 (8 bits mode) 00251 // N=0 (1 line mode), N=1 (2 line mode) 00252 // RE=0 (Dis. Extended Regs, special mode for KS0073) 00253 // DH=1 (Disp shift enable/disable, special mode for KS0073) 00254 // REV=0 (Reverse/Normal, special mode for KS0073) 00255 break; // case KS0073 Controller 00256 00257 00258 case KS0078: 00259 // Initialise Display configuration 00260 switch (_type) { 00261 case LCD8x1: //8x1 is a regular 1 line display 00262 case LCD8x2B: //8x2B is a special case of 16x1 00263 // case LCD12x1: 00264 case LCD16x1: 00265 // case LCD20x1: 00266 case LCD24x1: 00267 _function = 0x02; // Function set 001 DL N RE(0) DH REV (Std Regs) 00268 // DL=0 (4 bits bus) 00269 // N=0 (1 line mode), N=1 (2 line mode) 00270 // RE=0 (Dis. Extended Regs, special mode for KS0078) 00271 // DH=1 (Disp shift enable, special mode for KS0078) 00272 // REV=0 (Reverse normal, special mode for KS0078) 00273 00274 _function_1 = 0x04; // Function set 001 DL N RE(1) BE 0 (Ext Regs) 00275 // DL=0 (4 bits bus) 00276 // N=0 (1 line mode), N=1 (2 line mode) 00277 // RE=1 (Ena Extended Regs, special mode for KS0078) 00278 // BE=0 (Blink Enable, CG/SEG RAM, special mode for KS0078) 00279 // 0 00280 00281 _function_x = 0x00; // Ext Function set 0000 1 FW BW NW (Ext Regs) 00282 // NW=0 (1,2 line), NW=1 (4 Line, special mode for KS0078) 00283 break; 00284 00285 // case LCD12x3D: // Special mode for KS0073, KS0078 and PCF21XX 00286 // case LCD12x3D1: // Special mode for KS0073, KS0078 and PCF21XX 00287 // case LCD12x4D: // Special mode for KS0073, KS0078 and PCF21XX 00288 // case LCD16x3D: // Special mode for KS0073, KS0078 00289 // case LCD16x4D: // Special mode for KS0073, KS0078 00290 // case LCD20x4D: // Special mode for KS0073, KS0078 00291 // case LCD24x3D: // Special mode for KS0078 00292 // case LCD24x3D1: // Special mode for KS0078 00293 case LCD24x4D: // Special mode for KS0078 00294 _function = 0x02; // Function set 001 DL N RE(0) DH REV (Std Regs) 00295 // DL=0 (4 bits bus) 00296 // N=0 (dont care for 4 line mode) 00297 // RE=0 (Dis. Extended Regs, special mode for KS0078) 00298 // DH=1 (Disp shift enable, special mode for KS0078) 00299 // REV=0 (Reverse normal, special mode for KS0078) 00300 00301 _function_1 = 0x04; // Function set 001 DL N RE(1) BE 0 (Ext Regs) 00302 // DL=0 (4 bits bus) 00303 // N=0 (1 line mode), N=1 (2 line mode) 00304 // RE=1 (Ena Extended Regs, special mode for KS0078) 00305 // BE=0 (Blink Enable, CG/SEG RAM, special mode for KS0078) 00306 // 0 00307 00308 _function_x = 0x01; // Ext Function set 0000 1 FW BW NW (Ext Regs) 00309 // NW=0 (1,2 line), NW=1 (4 Line, special mode for KS0078) 00310 break; 00311 00312 case LCD16x3G: // Special mode for ST7036 00313 error("Error: LCD Controller type does not support this Display type\n\r"); 00314 break; 00315 00316 default: 00317 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4) 00318 _function = 0x0A; // Function set 001 DL N RE(0) DH REV (Std Regs) 00319 // DL=0 (4 bits bus) 00320 // N=1 (1 line mode), N=1 (2 line mode) 00321 // RE=0 (Dis. Extended Regs, special mode for KS0078) 00322 // DH=1 (Disp shift enable, special mode for KS0078) 00323 // REV=0 (Reverse normal, special mode for KS0078) 00324 00325 _function_1 = 0x0C; // Function set 001 DL N RE(1) BE 0 (Ext Regs) 00326 // DL=0 (4 bits bus) 00327 // N=1 (1 line mode), N=1 (2 line mode) 00328 // RE=1 (Ena Extended Regs, special mode for KS0078) 00329 // BE=0 (Blink Enable, CG/SEG RAM, special mode for KS0078) 00330 // 0 00331 00332 _function_x = 0x00; // Ext Function set 0000 1 FW BW NW (Ext Regs) 00333 // NW=0 (1,2 line), NW=1 (4 Line, special mode for KS0078) 00334 break; 00335 } // switch type 00336 00337 // init special features 00338 _writeCommand(0x20 | _function_1);// Function set 001 DL N RE(1) BE 0 (Ext Regs) 00339 // DL=0 (4 bits bus), DL=1 (8 bits mode) 00340 // N=0 (1 line mode), N=1 (2 line mode) 00341 // RE=1 (Ena Extended Regs, special mode for KS0078) 00342 // BE=0 (Blink Enable/Disable, CG/SEG RAM, special mode for KS0078) 00343 // 0 00344 00345 _writeCommand(0x08 | _function_x); // Ext Function set 0000 1 FW BW NW (Ext Regs) 00346 // FW=0 (5-dot font, special mode for KS0078) 00347 // BW=0 (Cur BW invert disable, special mode for KS0078) 00348 // NW=0 (1,2 Line), NW=1 (4 line, special mode for KS0078) 00349 00350 _writeCommand(0x10); // Scroll/Shift set 0001 DS/HS4 DS/HS3 DS/HS2 DS/HS1 (Ext Regs) 00351 // Dotscroll/Display shift enable (Special mode for KS0078) 00352 00353 _writeCommand(0x80); // Scroll Quantity set 1 0 SQ5 SQ4 SQ3 SQ2 SQ1 SQ0 (Ext Regs) 00354 // Scroll quantity (Special mode for KS0078) 00355 00356 _writeCommand(0x20 | _function); // Function set 001 DL N RE(0) DH REV (Std Regs) 00357 // DL=0 (4 bits bus), DL=1 (8 bits mode) 00358 // N=0 (1 line mode), N=1 (2 line mode) 00359 // RE=0 (Dis. Extended Regs, special mode for KS0078) 00360 // DH=1 (Disp shift enable/disable, special mode for KS0078) 00361 // REV=0 (Reverse/Normal, special mode for KS0078) 00362 break; // case KS0078 Controller 00363 00364 case ST7032_3V3: 00365 // ST7032 controller: Initialise Voltage booster for VLCD. VDD=3V3 00366 case ST7032_5V: 00367 // ST7032 controller: Disable Voltage booster for VLCD. VDD=5V 00368 00369 // Initialise Display configuration 00370 switch (_type) { 00371 case LCD8x1: //8x1 is a regular 1 line display 00372 case LCD8x2B: //8x2B is a special case of 16x1 00373 // case LCD12x1: 00374 case LCD16x1: 00375 // case LCD20x1: 00376 case LCD24x1: 00377 _function = 0x00; // FUNCTION SET 0 0 1 DL=0 (4 bit), N=0 (1-line display mode), F=0 (5*7dot), 0, IS 00378 // Note: 4 bit mode is ignored for native SPI and I2C devices 00379 // Saved to allow switch between Instruction sets at later time 00380 break; 00381 00382 case LCD12x3D: // Special mode for KS0078 and PCF21XX 00383 case LCD12x3D1: // Special mode for KS0078 and PCF21XX 00384 case LCD12x4D: // Special mode for KS0078 and PCF21XX 00385 case LCD16x3G: // Special mode for ST7036 00386 case LCD24x4D: // Special mode for KS0078 00387 error("Error: LCD Controller type does not support this Display type\n\r"); 00388 break; 00389 00390 default: 00391 // All other LCD types are initialised as 2 Line displays 00392 _function = 0x08; // FUNCTION SET 0 0 1 DL=0 (4 bit), N=1 (2-line display mode), F=0 (5*7dot), 0, IS 00393 // Note: 4 bit mode is ignored for native SPI and I2C devices 00394 // Saved to allow switch between Instruction sets at later time 00395 break; 00396 } // switch type 00397 00398 // init special features 00399 _writeCommand(0x20 | _function | 0x01); // Set function, 0 0 1 DL N F 0 IS=1 Select Instr Set = 1 00400 00401 _writeCommand(0x1C); // Internal OSC frequency adjustment Framefreq=183HZ, Bias will be 1/4 (Instr Set=1) 00402 00403 _contrast = LCD_ST7032_CONTRAST; 00404 _writeCommand(0x70 | (_contrast & 0x0F)); // Set Contrast Low bits, 0 1 1 1 C3 C2 C1 C0 (IS=1) 00405 00406 00407 if (_ctrl == ST7032_3V3) { 00408 // _icon_power = 0x04; // Icon display off, Booster circuit is turned on (IS=1) 00409 _icon_power = 0x0C; // Icon display on, Booster circuit is turned on (IS=1) 00410 // Saved to allow contrast change at later time 00411 } 00412 else { 00413 // _icon_power = 0x00; // Icon display off, Booster circuit is turned off (IS=1) 00414 _icon_power = 0x08; // Icon display on, Booster circuit is turned off (IS=1) 00415 // Saved to allow contrast change at later time 00416 } 00417 _writeCommand(0x50 | _icon_power | ((_contrast >> 4) & 0x03)); // Set Icon, Booster and Contrast High bits, 0 1 0 1 Ion Bon C5 C4 (IS=1) 00418 wait_ms(10); // Wait 10ms to ensure powered up 00419 00420 _writeCommand(0x68 | (LCD_ST7032_RAB & 0x07)); // Voltage follower, 0 1 1 0 FOn=1, Ampl ratio Rab2=1, Rab1=0, Rab0=0 (IS=1) 00421 wait_ms(10); // Wait 10ms to ensure powered up 00422 00423 _writeCommand(0x20 | _function); // Select Instruction Set = 0 00424 00425 break; // case ST7032_3V3 Controller 00426 // case ST7032_5V Controller 00427 00428 case ST7036_3V3: 00429 // ST7036 controller: Initialise Voltage booster for VLCD. VDD=3V3 00430 // Note: supports 1,2 (LCD_T_A) or 3 lines (LCD_T_G) 00431 case ST7036_5V: 00432 // ST7036 controller: Disable Voltage booster for VLCD. VDD=5V 00433 // Note: supports 1,2 (LCD_T_A) or 3 lines (LCD_T_G) 00434 00435 // Initialise Display configuration 00436 switch (_type) { 00437 case LCD8x1: //8x1 is a regular 1 line display 00438 case LCD8x2B: //8x2D is a special case of 16x1 00439 // case LCD12x1: 00440 case LCD16x1: 00441 case LCD24x1: 00442 _function = 0x00; // Set function, 0 0 1 DL=0 (4-bit Databus), N=0 (1 Line), DH=0 (5x7font), IS2, IS1 (Select Instruction Set) 00443 // Note: 4 bit mode is ignored for native SPI and I2C devices 00444 // Saved to allow switch between Instruction sets at later time 00445 00446 _bias_lines = 0x04; // Bias: 1/5, 1 or 2-Lines LCD 00447 break; 00448 00449 // case LCD12x3G: // Special mode for ST7036 00450 case LCD16x3G: // Special mode for ST7036 00451 _function = 0x08; // Set function, 0 0 1 DL=0 (4-bit Databus), N=1 (2 Line), DH=0 (5x7font), IS2,IS1 (Select Instruction Set) 00452 // Note: 4 bit mode is ignored for native SPI and I2C devices 00453 // Saved to allow switch between Instruction sets at later time 00454 00455 _bias_lines = 0x05; // Bias: 1/5, 3-Lines LCD 00456 break; 00457 00458 // case LCD12x3D1: // Special mode for KS0078 and PCF21XX 00459 // case LCD16x3D1: // Special mode for SSD1803 00460 case LCD12x4D: // Special mode for PCF2116 00461 case LCD24x4D: // Special mode for KS0078 00462 error("Error: LCD Controller type does not support this Display type\n\r"); 00463 break; 00464 00465 default: 00466 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4) 00467 _function = 0x08; // Set function, 0 0 1 DL=0 (4-bit Databus), N=1 (2 Line), DH=0 (5x7font), IS2,IS1 (Select Instruction Set) 00468 // Note: 4 bit mode is ignored for native SPI and I2C devices 00469 // Saved to allow switch between Instruction sets at later time 00470 00471 _bias_lines = 0x04; // Bias: 1/5, 1 or 2-Lines LCD 00472 break; 00473 } // switch type 00474 00475 00476 // init special features 00477 _writeCommand(0x20 | _function | 0x01); // Set function, IS2,IS1 = 01 (Select Instr Set = 1) 00478 _writeCommand(0x10 | _bias_lines); // Set Bias and 1,2 or 3 lines (Instr Set 1) 00479 00480 _contrast = LCD_ST7036_CONTRAST; 00481 _writeCommand(0x70 | (_contrast & 0x0F)); // Set Contrast, 0 1 1 1 C3 C2 C1 C0 (Instr Set 1) 00482 00483 if (_ctrl == ST7036_3V3) { 00484 _icon_power = 0x0C; // Set Icon, Booster, Contrast High bits, 0 1 0 1 Ion=1 Bon=1 C5 C4 (Instr Set 1) 00485 // _icon_power = 0x04; // Set Icon, Booster, Contrast High bits, 0 1 0 1 Ion=0 Bon=1 C5 C4 (Instr Set 1) 00486 // Saved to allow contrast change at later time 00487 } 00488 else { 00489 _icon_power = 0x08; // Set Icon, Booster, Contrast High bits, 0 1 0 1 Ion=1 Bon=0 C5 C4 (Instr Set 1) 00490 // _icon_power = 0x00; // Set Icon, Booster, Contrast High bits, 0 1 0 1 Ion=0 Bon=0 C5 C4 (Instr Set 1) 00491 } 00492 00493 _writeCommand(0x50 | _icon_power | ((_contrast >> 4) & 0x03)); // Set Contrast C5, C4 (Instr Set 1) 00494 wait_ms(10); // Wait 10ms to ensure powered up 00495 00496 _writeCommand(0x68 | (LCD_ST7036_RAB & 0x07)); // Voltagefollower On = 1, Ampl ratio Rab2, Rab1, Rab0 = 1 0 1 (Instr Set 1) 00497 wait_ms(10); // Wait 10ms to ensure powered up 00498 00499 _writeCommand(0x20 | _function); // Set function, IS2,IS1 = 00 (Select Instruction Set = 0) 00500 00501 break; // case ST7036_3V3 Controller 00502 // case ST7036_5V Controller 00503 00504 case ST7070: 00505 // Initialise Display configuration 00506 switch (_type) { 00507 case LCD8x1: //8x1 is a regular 1 line display 00508 case LCD8x2B: //8x2D is a special case of 16x1 00509 // case LCD12x1: 00510 case LCD16x1: 00511 case LCD24x1: 00512 _function = dl | 0x00; // Set function, 0 0 1 DL=0 (4-bit Databus), N=0 (1 Line), EXT=0, x, x 00513 // Note: 4 bit mode is NOT ignored for native SPI ! 00514 // Saved to allow switch between Instruction sets at later time 00515 break; 00516 00517 // case LCD12x3D1: // Special mode for KS0078 and PCF21XX 00518 // case LCD16x3D1: // Special mode for SSD1803 00519 case LCD12x4D: // Special mode for PCF2116 00520 case LCD24x4D: // Special mode for KS0078 00521 // case LCD12x3G: // Special mode for ST7036 00522 case LCD16x3G: // Special mode for ST7036 00523 error("Error: LCD Controller type does not support this Display type\n\r"); 00524 break; 00525 00526 default: 00527 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4) 00528 _function = dl | 0x08; // Set function, 0 0 1 DL, N=1 (2 Line), EXT=0, x, x 00529 // Note: 4 bit mode is NOT ignored for native SPI ! 00530 // Saved to allow switch between Instruction sets at later time 00531 break; 00532 } // switch type 00533 00534 // _writeCommand(0x00); // NOP, make sure to sync SPI 00535 00536 // init special features 00537 _writeCommand(0x20 | _function | 0x04); // Set function, 0 0 1 DL N EXT=1 x x (Select Instr Set = 1) 00538 00539 _writeCommand(0x04 | 0x00); // Set Bias resistors 0 0 0 0 0 1 Rb1,Rb0= 0 0 (Extern Res) (Instr Set 1) 00540 00541 _writeCommand(0x40 | 0x00); // COM/SEG directions 0 1 0 0 C1, C2, S1, S2 (Instr Set 1) 00542 // C1=1: Com1-8 -> Com8-1; C2=1: Com9-16 -> Com16-9 00543 // S1=1: Seg1-40 -> Seg40-1; S2=1: Seg41-80 -> Seg80-41 00544 00545 _writeCommand(0x20 | _function); // Set function, EXT=0 (Select Instr Set = 0) 00546 00547 break; // case ST7070 Controller 00548 00549 case SSD1803_3V3: 00550 // SSD1803 controller: Initialise Voltage booster for VLCD. VDD=3V3 00551 // Note: supports 1,2, 3 or 4 lines 00552 // case SSD1803_5V: 00553 // SSD1803 controller: No Voltage booster for VLCD. VDD=5V 00554 00555 // Initialise Display configuration 00556 switch (_type) { 00557 case LCD8x1: //8x1 is a regular 1 line display 00558 case LCD8x2B: //8x2D is a special case of 16x1 00559 // case LCD12x1: 00560 case LCD16x1: 00561 case LCD24x1: 00562 _function = 0x00; // Set function 0 0 1 DL N DH RE(0) IS 00563 // Saved to allow switch between Instruction sets at later time 00564 // DL=0 4-bit Databus, 00565 // Note: 4 bit mode is ignored for native SPI and I2C devices 00566 // N=0 1 Line / 3 Line 00567 // DH=0 Double Height disable 00568 // IS=0 00569 00570 _function_1 = 0x02; // Set function, 0 0 1 DL N BE RE(1) REV 00571 // Saved to allow switch between Instruction sets at later time 00572 // DL=0 4-bit Databus, 00573 // Note: 4 bit mode is ignored for native SPI and I2C devices 00574 // N=0 1 Line / 3 Line 00575 // BE=0 Blink Enable off, special feature of SSD1803 00576 // REV=0 Reverse off, special feature of SSD1803 00577 00578 _lines = 0x00; // Ext function set 0 0 0 0 1 FW BW NW 00579 // NW=0 1-Line LCD (N=0) 00580 break; 00581 00582 case LCD12x3D: // Special mode for KS0078 and PCF21XX 00583 // case LCD12x3D1: // Special mode for KS0078 and PCF21XX 00584 case LCD16x3D: // Special mode for KS0078 00585 // case LCD16x3D1: // Special mode for SSD1803 00586 // case LCD20x3D: // Special mode for SSD1803 00587 _function = 0x00; // Set function 0 0 1 DL N DH RE(0) IS 00588 // Saved to allow switch between Instruction sets at later time 00589 // DL=0 4-bit Databus, 00590 // Note: 4 bit mode is ignored for native SPI and I2C devices 00591 // N=0 1 Line / 3 Line 00592 // DH=0 Double Height disable 00593 // IS=0 00594 00595 _function_1 = 0x02; // Set function, 0 0 1 DL N BE RE(1) REV 00596 // Saved to allow switch between Instruction sets at later time 00597 // DL=0 4-bit Databus, 00598 // Note: 4 bit mode is ignored for native SPI and I2C devices 00599 // N=0 1 Line / 3 Line 00600 // BE=0 Blink Enable off, special feature of SSD1803 00601 // REV=0 Reverse off, special feature of SSD1803 00602 00603 _lines = 0x00; // Ext function set 0 0 0 0 1 FW BW NW 00604 // NW=1 3-Line LCD (N=0) 00605 break; 00606 00607 // case LCD10x2D: // Special mode for SSD1803, 4-line mode but switch to double height font 00608 case LCD10x4D: // Special mode for SSD1803 00609 case LCD20x4D: // Special mode for SSD1803 00610 _function = 0x08; // Set function 0 0 1 DL N DH RE(0) IS 00611 // Saved to allow switch between Instruction sets at later time 00612 // DL=0 4-bit Databus, 00613 // Note: 4 bit mode is ignored for native SPI and I2C devices 00614 // N=1 4 Line 00615 // DH=0 Double Height disable 00616 // IS=0 00617 00618 _function_1 = 0x0A; // Set function, 0 0 1 DL N BE RE(1) REV 00619 // Saved to allow switch between Instruction sets at later time 00620 // DL=0 4-bit Databus, 00621 // Note: 4 bit mode is ignored for native SPI and I2C devices 00622 // N=1 4 Line 00623 // BE=0 Blink Enable off, special feature of SSD1803 00624 // REV=0 Reverse off, special feature of SSD1803 00625 00626 _lines = 0x01; // Ext function set 0 0 0 0 1 FW BW NW 00627 // NW=1 4-Line LCD (N=1) 00628 break; 00629 00630 case LCD16x3G: // Special mode for ST7036 00631 case LCD24x4D: // Special mode for KS0078 00632 error("Error: LCD Controller type does not support this Display type\n\r"); 00633 break; 00634 00635 default: 00636 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4) 00637 _function = 0x08; // Set function 0 0 1 DL N DH RE(0) IS 00638 // Saved to allow switch between Instruction sets at later time 00639 // DL=0 4-bit Databus, 00640 // Note: 4 bit mode is ignored for native SPI and I2C devices 00641 // N=1 2 line / 4 Line 00642 // DH=0 Double Height disable 00643 // RE=0 00644 // IS=0 00645 00646 _function_1 = 0x0A; // Set function, 0 0 1 DL N BE RE(1) REV 00647 // Saved to allow switch between Instruction sets at later time 00648 // DL=0 4-bit Databus, 00649 // Note: 4 bit mode is ignored for native SPI and I2C devices 00650 // N=1 2 line / 4 Line 00651 // BE=0 Blink Enable off, special feature of SSD1803 00652 // RE=1 00653 // REV=0 Reverse off, special feature of SSD1803 00654 00655 _lines = 0x00; // Ext function set 0 0 0 0 1 FW BW NW 00656 // NW=0 2-Line LCD (N=1) 00657 break; 00658 } // switch type 00659 00660 00661 // init special features 00662 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 DL N BE RE(1) REV 00663 // Select Extended Instruction Set 00664 00665 _writeCommand(0x06); // Set ext entry mode, 0 0 0 0 0 1 BDC=1 COM1-32, BDS=0 SEG100-1 "Bottom View" (Ext Instr Set) 00666 // _writeCommand(0x05); // Set ext entry mode, 0 0 0 0 0 1 BDC=0 COM32-1, BDS=1 SEG1-100 "Top View" (Ext Instr Set) 00667 wait_ms(5); // Wait to ensure completion or SSD1803 fails to set Top/Bottom after reset.. 00668 00669 _writeCommand(0x08 | _lines); // Set ext function 0 0 0 0 1 FW BW NW 1,2,3 or 4 lines (Ext Instr Set) 00670 00671 _writeCommand(0x10); // Double Height and Bias, 0 0 0 1 UD2=0, UD1=0, BS1=0 Bias 1/5, DH=0 (Ext Instr Set) 00672 00673 // _writeCommand(0x76); // Set TC Control, 0 1 1 1 0 1 1 0 (Ext Instr Set) 00674 // _writeData(0x02); // Set TC data, 0 0 0 0 0 TC2,TC1,TC0 = 0 1 0 (Ext Instr Set) 00675 00676 _writeCommand(0x20 | _function | 0x01); // Set function, 0 0 1 DL N DH RE(0) IS=1 Select Instruction Set 1 00677 // Select Std Instr set, Select IS=1 00678 00679 _contrast = LCD_SSD1_CONTRAST; 00680 _writeCommand(0x70 | (_contrast & 0x0F)); // Set Contrast 0 1 1 1 C3, C2, C1, C0 (Instr Set 1) 00681 00682 // _icon_power = 0x04; // Icon off, Booster on (Instr Set 1) 00683 _icon_power = 0x0C; // Icon on, Booster on (Instr Set 1) 00684 // Saved to allow contrast change at later time 00685 _writeCommand(0x50 | _icon_power | ((_contrast >> 4) & 0x03)); // Set Power, Icon and Contrast, 0 1 0 1 Ion Bon C5 C4 (Instr Set 1) 00686 wait_ms(10); // Wait 10ms to ensure powered up 00687 00688 _writeCommand(0x68 | (LCD_SSD1_RAB & 0x07)); // Set Voltagefollower 0 1 1 0 Don = 1, Ampl ratio Rab2, Rab1, Rab0 = 1 1 0 (Instr Set 1) 00689 wait_ms(10); // Wait 10ms to ensure powered up 00690 00691 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 DL N BE RE(1) REV 00692 // Select Extended Instruction Set 1 00693 _writeCommand(0x10); // Shift/Scroll enable, 0 0 0 1 DS4/HS4 DS3/HS3 DS2/HS2 DS1/HS1 (Ext Instr Set 1) 00694 00695 00696 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0 00697 // Select Std Instr set, Select IS=0 00698 00699 break; // case SSD1803 Controller 00700 00701 00702 // Note1: The PCF21XX family of controllers has several types that dont have an onboard voltage generator for V-LCD. 00703 // You must supply this LCD voltage externally and not try to enable VGen. 00704 // Note2: The early versions of PCF2116 controllers (eg PCF2116C) can not generate sufficiently negative voltage for the LCD at a VDD of 3V3. 00705 // You must supply this voltage externally and not enable VGen or you must use a higher VDD (e.g. 5V) and enable VGen. 00706 // More recent versions of the controller (eg PCF2116K) have an improved VGen that will work with 3V3. 00707 // Note3: See datasheet, PCF2116 and other types provide a V0 pin to control the LCD contrast voltage that is provided by VGen. This pins allows 00708 // contrast control similar to that of pin 3 on the standard 14pin LCD module connector. 00709 // You can disable VGen by connecting Vo to VDD. VLCD will then be used directly as LCD voltage. 00710 // Note4: PCF2113 and PCF2119 are different wrt to VLCD generator! There is no V0 pin. The contrast voltage is software controlled by setting the VA and VB registers. 00711 // Vgen is automatically switched off when the contrast voltage VA or VB is set to 0x00. Note that certain limits apply to allowed values for VA and VB. 00712 // Note5: See datasheet, members of the PCF21XX family support different numbers of rows/columns. Not all can support 3 or 4 rows. 00713 // Note6: See datasheet, the PCF21XX-C and PCF21XX-K use a non-standard character set. This may result is strange looking text when not corrected.. 00714 00715 case PCF2103_3V3: 00716 // PCF2103 controller: No Voltage generator for VLCD, VDD=3V3..5V, VLCD input controls contrast voltage. 00717 // Initialise Display configuration 00718 switch (_type) { 00719 case LCD24x1: 00720 _function = 0x00; //FUNCTION SET 0 0 1 DL=0 4-bit, 0, M=0 1-line/24 chars display mode, 0, H=0 00721 //Note: 4 bit mode is ignored for I2C mode 00722 break; 00723 00724 // case LCD12x1D: //Special mode for PCF21XX, Only top line used 00725 case LCD12x2: 00726 _function = 0x04; //FUNCTION SET 0 0 1 DL=0 4-bit, 0, M=1 2-line/12 chars display mode, 0, H=0 00727 //Note: 4 bit mode is ignored for I2C mode 00728 break; 00729 00730 default: 00731 error("Error: LCD Controller type does not support this Display type\n\r"); 00732 break; 00733 00734 } // switch type 00735 00736 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1 00737 wait_ms(10); // Wait 10ms to ensure powered up 00738 00739 // Note: Display from GA628 shows 12 chars. This is actually the right half of a 24x1 display. The commons have been connected in reverse order. 00740 _writeCommand(0x05); // Display Conf Set 0000 0, 1, P=0, Q=1 (Instr. Set 1) 00741 00742 _writeCommand(0x02); // Screen Config 0000 001, L=0 (Instr. Set 1) 00743 _writeCommand(0x08); // ICON Conf 0000 1, IM=0 (Char mode), IB=0 (no Icon blink), 0 (Instr. Set 1) 00744 00745 _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0 00746 00747 #if(0) 00748 // Select CG RAM 00749 _writeCommand(0x40); //Set CG-RAM address, 8 sequential locations needed per UDC 00750 // Store UDC/Icon pattern: 00751 // 3 x 8 rows x 5 bits = 120 bits for Normal pattern (UDC 0..2) and 00752 // 3 x 8 rows x 5 bits = 120 bits for Blink pattern (UDC 4..6) 00753 for (int i=0; i<(8 * 8); i++) { 00754 // _writeData(0x1F); // All On 00755 _writeData(0x00); // All Off 00756 } 00757 #endif 00758 break; // case PCF2103_3V3 Controller 00759 00760 case PCF2113_3V3: 00761 // PCF2113 controller: Initialise Voltage booster for VLCD. VDD=3V3. VA and VB control contrast. 00762 // Initialise Display configuration 00763 switch (_type) { 00764 // case LCD12x1: 00765 // _function = 0x02; // FUNCTION SET 0 0 1 DL=0 4 bit, 0, M=0 1-line/12 chars display mode, SL=1, IS=0 00766 // Note: 4 bit mode is ignored for I2C mode 00767 case LCD24x1: 00768 _function = 0x00; // FUNCTION SET 0 0 1 DL=0 4 bit, 0, M=0 1-line/24 chars display mode, SL=0, IS=0 00769 // Note: 4 bit mode is ignored for I2C mode 00770 break; 00771 00772 case LCD12x2: 00773 _function = 0x04; // FUNCTION SET 0 0 1 DL=0 4 bit, 0, M=1 2-line/12 chars display mode, SL=0, IS=0 00774 break; 00775 00776 default: 00777 error("Error: LCD Controller type does not support this Display type\n\r"); 00778 break; 00779 00780 } // switch type 00781 00782 // Init special features 00783 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1 00784 00785 _writeCommand(0x04); // Display Conf Set 0000 0, 1, P=0, Q=0 (Instr. Set 1) 00786 _writeCommand(0x10); // Temp Compensation Set 0001 0, 0, TC1=0, TC2=0 (Instr. Set 1) 00787 // _writeCommand(0x42); // HV GEN 0100 S1=1, S2=0 (2x multiplier) (Instr. Set 1) 00788 _writeCommand(0x40 | (LCD_PCF2_S12 & 0x03)); // HV Gen 0100 S1=1, S2=0 (2x multiplier) (Instr. Set 1) 00789 00790 _contrast = LCD_PCF2_CONTRAST; 00791 _writeCommand(0x80 | 0x00 | (_contrast & 0x3F)); // VLCD_set (Instr. Set 1) 1, V=0, VA=contrast 00792 _writeCommand(0x80 | 0x40 | (_contrast & 0x3F)); // VLCD_set (Instr. Set 1) 1, V=1, VB=contrast 00793 wait_ms(10); // Wait 10ms to ensure powered up 00794 00795 _writeCommand(0x02); // Screen Config 0000 001, L=0 (Instr. Set 1) 00796 _writeCommand(0x08); // ICON Conf 0000 1, IM=0 (Char mode), IB=0 (no icon blink) DM=0 (no direct mode) (Instr. Set 1) 00797 00798 _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0 00799 00800 break; // case PCF2113_3V3 Controller 00801 00802 00803 // case PCF2113_5V: 00804 // PCF2113 controller: No Voltage generator for VLCD. VDD=5V. Contrast voltage controlled by VA or VB. 00805 //@TODO 00806 00807 00808 case PCF2116_3V3: 00809 // PCF2116 controller: Voltage generator for VLCD. VDD=5V. V0 controls contrast voltage. 00810 // Initialise Display configuration 00811 switch (_type) { 00812 // case LCD12x1: 00813 // case LCD12x2: 00814 case LCD24x1: 00815 _writeCommand(0x22); //FUNCTION SET 0 0 1 DL=0 4-bit, N=0/M=0 1-line/24 chars display mode, G=1 Vgen on, 0 00816 //Note: 4 bit mode is ignored for I2C mode 00817 wait_ms(10); // Wait 10ms to ensure powered up 00818 break; 00819 00820 case LCD12x3D: // Special mode for KS0078 and PCF21XX 00821 case LCD12x3D1: // Special mode for PCF21XX 00822 case LCD12x4D: // Special mode for PCF21XX: 00823 _writeCommand(0x2E); //FUNCTION SET 0 0 1 DL=0 4-bit, N=1/M=1 4-line/12 chars display mode, G=1 VGen on, 0 00824 //Note: 4 bit mode is ignored for I2C mode 00825 wait_ms(10); // Wait 10ms to ensure powered up 00826 break; 00827 00828 case LCD24x2: 00829 _writeCommand(0x2A); //FUNCTION SET 0 0 1 DL=0 4-bit, N=1/M=0 2-line/24 chars display mode, G=1 VGen on, 0 00830 //Note: 4 bit mode is ignored for I2C mode 00831 wait_ms(10); // Wait 10ms to ensure powered up 00832 break; 00833 00834 default: 00835 error("Error: LCD Controller type does not support this Display type\n\r"); 00836 break; 00837 00838 } // switch type 00839 00840 break; // case PCF2116_3V3 Controller 00841 00842 00843 //Experimental for cellphone 3-line display, SA=0x74, No Ack supported, Character set C or K, DL = 8 bit, N=0,M=1 (reserved mode !!), external VLCD -2V5 00844 //@TODO 00845 case PCF2116_5V: 00846 // PCF2116 controller: No Voltage generator for VLCD. VDD=5V. V0 controls contrast voltage. 00847 // Initialise Display configuration 00848 switch (_type) { 00849 // case LCD12x1: 00850 // case LCD12x2: 00851 // case LCD24x1: 00852 // _writeCommand(0x20); //FUNCTION SET 0 0 1 DL=0 4-bit, N=0/M=0 1-line/24 chars display mode, G=0 no Vgen, 0 00853 //Note: 4 bit mode is ignored for I2C mode 00854 // wait_ms(10); // Wait 10ms to ensure powered up 00855 // break; 00856 00857 case LCD12x3D: // Special mode for KS0078 and PCF21XX 00858 case LCD12x3D1: // Special mode for PCF21XX 00859 case LCD12x4D: // Special mode for PCF21XX: 00860 // _writeCommand(0x34); //FUNCTION SET 8 bit, N=0/M=1 4-line/12 chars display mode OK 00861 // _writeCommand(0x24); //FUNCTION SET 4 bit, N=0/M=1 4-line/12 chars display mode OK 00862 _writeCommand(0x2C); //FUNCTION SET 0 0 1 DL=0 4-bit, N=1/M=1 4-line/12 chars display mode, G=0 no Vgen, 0 OK 00863 //Note: 4 bit mode is ignored for I2C mode 00864 wait_ms(10); // Wait 10ms to ensure powered up 00865 break; 00866 00867 // case LCD24x2: 00868 // _writeCommand(0x28); //FUNCTION SET 4 bit, N=1/M=0 2-line/24 chars display mode 00869 //Note: 4 bit mode is ignored for I2C mode 00870 // wait_ms(10); // Wait 10ms to ensure powered up 00871 // break; 00872 00873 default: 00874 error("Error: LCD Controller type does not support this Display type\n\r"); 00875 break; 00876 00877 } // switch type 00878 00879 break; // case PCF2116_5V Controller 00880 00881 case PCF2119_3V3: 00882 case PCF2119R_3V3: 00883 // PCF2119 controller: Initialise Voltage booster for VLCD. VDD=3V3. VA and VB control contrast. 00884 // Note1: See datasheet, the PCF2119 supports icons and provides separate constrast control for Icons and characters. 00885 // Note2: Vgen is switched off when the contrast voltage VA or VB is set to 0x00. 00886 00887 //POR or Hardware Reset should be applied 00888 wait_ms(10); // Wait 10ms to ensure powered up 00889 00890 // Initialise Display configuration 00891 switch (_type) { 00892 case LCD8x1: 00893 // case LCD12x1: 00894 case LCD16x1: 00895 _function = 0x02; // FUNCTION SET 0 0 1 DL=0 4-bit, 0 , M=0 1-line/16 chars display mode, SL=1 00896 // Note: 4 bit mode is ignored for I2C mode 00897 break; 00898 00899 case LCD24x1: 00900 // case LCD32x1: 00901 _function = 0x00; // FUNCTION SET 0 0 1 DL=0 4-bit, 0 , M=0 1-line/32 chars display mode, SL=0 00902 // Note: 4 bit mode is ignored for I2C mode 00903 break; 00904 00905 case LCD8x2: 00906 // case LCD12x2: 00907 case LCD16x2: 00908 _function = 0x04; // FUNCTION SET 0 0 1 DL=0 4-bit, 0, M=1 2-line/16 chars display mode, SL=0 00909 // Note: 4 bit mode is ignored for I2C mode 00910 break; 00911 00912 default: 00913 error("Error: LCD Controller type does not support this Display type\n\r"); 00914 break; 00915 00916 } // switch type 00917 00918 // Init special features 00919 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instruction Set = 1 00920 00921 // _writeCommand(0x04); // DISP CONF SET (Instr. Set 1) 0000, 0, 1, P=0, Q=0 (IC at Bottom) 00922 // _writeCommand(0x05); // Display Conf Set 0000, 0, 1, P=0, Q=1 00923 // _writeCommand(0x06); // Display Conf Set 0000, 0, 1, P=1, Q=0 00924 _writeCommand(0x07); // Display Conf Set 0000, 0, 1, P=1, Q=1 (IC at Top) 00925 00926 _writeCommand(0x10); // TEMP CTRL SET (Instr. Set 1) 0001, 0, 0, TC1=0, TC2=0 00927 // _writeCommand(0x42); // HV GEN (Instr. Set 1) 0100, 0, 0, S1=1, S2=0 (2x multiplier) 00928 _writeCommand(0x40 | (LCD_PCF2_S12 & 0x03)); // HV GEN (Instr. Set 1) 0100, 0, 0, S1=1, S2=0 (2x multiplier) 00929 00930 _contrast = LCD_PCF2_CONTRAST; 00931 _writeCommand(0x80 | 0x00 | (_contrast & 0x3F)); // VLCD_set (Instr. Set 1) V=0, VA=contrast 00932 _writeCommand(0x80 | 0x40 | (_contrast & 0x3F)); // VLCD_set (Instr. Set 1) V=1, VB=contrast 00933 wait_ms(10); // Wait 10ms to ensure powered up 00934 00935 _writeCommand(0x02); // SCRN CONF (Instr. Set 1) L=0 00936 _writeCommand(0x08); // ICON CONF (Instr. Set 1) IM=0 (Char mode) IB=0 (no icon blink) DM=0 (no direct mode) 00937 00938 _writeCommand(0x20 | _function); // Select Instruction Set = 0 00939 00940 break; // case PCF2119_3V3 Controller 00941 00942 // case PCF2119_5V: 00943 // PCF2119 controller: No Voltage booster for VLCD. VDD=3V3. VA and VB control contrast. 00944 // Note1: See datasheet, the PCF2119 supports icons and provides separate constrast control for Icons and characters. 00945 // Note2: Vgen is switched off when the contrast voltage VA or VB is set to 0x00. 00946 //@TODO 00947 00948 case WS0010: 00949 // WS0010 OLED controller: Initialise DC/DC Voltage converter for LEDs 00950 // Note1: Identical to RS0010 00951 // Note2: supports 1 or 2 lines (and 16x100 graphics) 00952 // supports 4 fonts (English/Japanese (default), Western European-I, English/Russian, Western European-II) 00953 // Cursor/Disp shift set 0001 SC RL 0 0 00954 // 00955 // Mode and Power set 0001 GC PWR 1 1 00956 // GC = 0 (Graph Mode=1, Char Mode=0) 00957 // PWR = 1 (DC/DC On/Off) 00958 00959 //@Todo: This may be needed to enable a warm reboot 00960 //_writeCommand(0x13); // Char mode, DC/DC off 00961 //wait_ms(10); // Wait 10ms to ensure powered down 00962 _writeCommand(0x17); // Char mode, DC/DC on 00963 wait_ms(10); // Wait 10ms to ensure powered up 00964 00965 // Initialise Display configuration 00966 switch (_type) { 00967 case LCD8x1: //8x1 is a regular 1 line display 00968 case LCD8x2B: //8x2B is a special case of 16x1 00969 // case LCD12x1: 00970 case LCD16x1: 00971 case LCD24x1: 00972 _writeCommand(0x20); // Function set 001 DL N F FT1 FT0 00973 // DL=0 (4 bits bus) 00974 // N=0 (1 line) 00975 // F=0 (5x7 dots font) 00976 // FT=00 (00 = Engl/Jap, 01 = WestEur1, 10 = Engl/Russian, 11 = WestEur2 00977 break; 00978 00979 case LCD12x3D: // Special mode for KS0078 and PCF21XX 00980 case LCD12x3D1: // Special mode for PCF21XX 00981 case LCD12x4D: // Special mode for PCF21XX: 00982 case LCD16x3G: // Special mode for ST7036 00983 case LCD24x4D: // Special mode for KS0078 00984 error("Error: LCD Controller type does not support this Display type\n\r"); 00985 break; 00986 00987 default: 00988 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4) 00989 _writeCommand(0x28); // Function set 001 DL N F FT1 FT0 00990 // DL=0 (4 bits bus) 00991 // N=1 (2 lines) 00992 // F=0 (5x7 dots font) 00993 // FT=00 (00 = Engl/Jap, 01 = WestEur1, 10 = Engl/Russian, 11 = WestEur2 00994 00995 break; 00996 } // switch type 00997 00998 break; // case WS0010 Controller 00999 01000 01001 case US2066_3V3: 01002 // US2066/SSD1311 OLED controller, Initialise for VDD=3V3 01003 // Note: supports 1,2, 3 or 4 lines 01004 // case USS2066_5V: 01005 // US2066 controller, VDD=5V 01006 01007 // Initialise Display configuration 01008 switch (_type) { 01009 case LCD8x1: //8x1 is a regular 1 line display 01010 case LCD8x2B: //8x2D is a special case of 16x1 01011 // case LCD12x1: 01012 case LCD16x1: 01013 // case LCD20x1: 01014 _function = 0x00; // Set function 0 0 1 X N DH RE(0) IS 01015 // Saved to allow switch between Instruction sets at later time 01016 // DL=X bit is ignored for US2066. Uses hardwired pins instead 01017 // N=0 1 Line / 3 Line 01018 // DH=0 Double Height disable 01019 // IS=0 01020 01021 _function_1 = 0x02; // Set function, 0 0 1 X N BE RE(1) REV 01022 // Saved to allow switch between Instruction sets at later time 01023 // DL=X bit is ignored for US2066. Uses hardwired pins instead 01024 // N=0 1 Line / 3 Line 01025 // BE=0 Blink Enable off, special feature of SSD1803, US2066 01026 // REV=0 Reverse off, special feature of SSD1803, US2066 01027 01028 _lines = 0x00; // Ext function set 0 0 0 0 1 FW BW NW 01029 // NW=0 1-Line LCD (N=0) 01030 break; 01031 01032 case LCD16x1C: 01033 case LCD8x2: 01034 case LCD16x2: 01035 case LCD20x2: 01036 _function = 0x08; // Set function 0 0 1 X N DH RE(0) IS 01037 // Saved to allow switch between Instruction sets at later time 01038 // DL=X bit is ignored for US2066. Uses hardwired pins instead 01039 // N=1 2 line / 4 Line 01040 // DH=0 Double Height disable 01041 // IS=0 01042 01043 _function_1 = 0x0A; // Set function, 0 0 1 X N BE RE(1) REV 01044 // Saved to allow switch between Instruction sets at later time 01045 // DL=X bit is ignored for US2066. Uses hardwired pins instead 01046 // N=1 2 line / 4 Line 01047 // BE=0 Blink Enable off, special feature of SSD1803, US2066 01048 // REV=0 Reverse off, special feature of SSD1803, US2066 01049 01050 _lines = 0x00; // Ext function set 0 0 0 0 1 FW BW NW 01051 // NW=0 2-Line LCD (N=1) 01052 break; 01053 01054 case LCD12x3D: // Special mode for KS0078 and PCF21XX 01055 // case LCD12x3D1: // Special mode for KS0078 and PCF21XX 01056 case LCD16x3D: // Special mode for KS0078, SSD1803 and US2066 01057 // case LCD16x3D1: // Special mode for SSD1803, US2066 01058 // case LCD20x3D: // Special mode for SSD1803, US2066 01059 _function = 0x00; // Set function 0 0 1 X N DH RE(0) IS 01060 // Saved to allow switch between Instruction sets at later time 01061 // DL=X bit is ignored for US2066. Uses hardwired pins instead 01062 // N=0 1 Line / 3 Line 01063 // DH=0 Double Height disable 01064 // IS=0 01065 01066 _function_1 = 0x02; // Set function, 0 0 1 X N BE RE(1) REV 01067 // Saved to allow switch between Instruction sets at later time 01068 // DL=X bit is ignored for US2066. Uses hardwired pins instead 01069 // N=0 1 Line / 3 Line 01070 // BE=0 Blink Enable off, special feature of SSD1803, US2066 01071 // REV=0 Reverse off, special feature of SSD1803, US2066 01072 01073 _lines = 0x00; // Ext function set 0 0 0 0 1 FW BW NW 01074 // NW=1 3-Line LCD (N=0) 01075 break; 01076 01077 case LCD20x4D: // Special mode for SSD1803, US2066 01078 _function = 0x08; // Set function 0 0 1 X N DH RE(0) IS 01079 // Saved to allow switch between Instruction sets at later time 01080 // DL=X bit is ignored for US2066. Uses hardwired pins instead 01081 // N=1 2 line / 4 Line 01082 // DH=0 Double Height disable 01083 // IS=0 01084 01085 _function_1 = 0x0A; // Set function, 0 0 1 DL N BE RE(1) REV 01086 // Saved to allow switch between Instruction sets at later time 01087 // DL=0 bit is ignored for US2066. Uses hardwired pins instead 01088 // N=1 2 line / 4 Line 01089 // BE=0 Blink Enable off, special feature of SSD1803, US2066 01090 // REV=0 Reverse off, special feature of SSD1803, US2066 01091 01092 _lines = 0x01; // Ext function set 0 0 0 0 1 FW BW NW 01093 // NW=1 4-Line LCD (N=1) 01094 break; 01095 01096 // case LCD24x1: 01097 // case LCD16x3G: // Special mode for ST7036 01098 // case LCD24x4D: // Special mode for KS0078 01099 default: 01100 error("Error: LCD Controller type does not support this Display type\n\r"); 01101 break; 01102 01103 } // switch type 01104 01105 _writeCommand(0x00); // NOP, make sure to sync SPI 01106 01107 // init special features 01108 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV 01109 // Select Extended Instruction Set 01110 01111 _writeCommand(0x71); // Function Select A: 0 1 1 1 0 0 0 1 (Ext Instr Set) 01112 _writeData(0x00); // Disable Internal VDD 01113 01114 _writeCommand(0x79); // Function Select OLED: 0 1 1 1 1 0 0 1 (Ext Instr Set) 01115 01116 _writeCommand(0xD5); // Display Clock Divide Ratio: 1 1 0 1 0 1 0 1 (Ext Instr Set, OLED Instr Set) 01117 _writeCommand(0x70); // Display Clock Divide Ratio value: 0 1 1 1 0 0 0 0 (Ext Instr Set, OLED Instr Set) 01118 01119 _writeCommand(0x78); // Function Disable OLED: 0 1 1 1 1 0 0 0 (Ext Instr Set) 01120 01121 // _writeCommand(0x06); // Set ext entry mode, 0 0 0 0 0 1 BDC=1 COM1-32, BDS=0 SEG100-1 "Bottom View" (Ext Instr Set) 01122 _writeCommand(0x05); // Set ext entry mode, 0 0 0 0 0 1 BDC=0 COM32-1, BDS=1 SEG1-100 "Top View" (Ext Instr Set) 01123 01124 _writeCommand(0x08 | _lines); // Set ext function 0 0 0 0 1 FW BW NW 1,2,3 or 4 lines (Ext Instr Set) 01125 01126 // _writeCommand(0x1C); // Double Height, 0 0 0 1 UD2=1, UD1=1, X, DH'=0 (Ext Instr Set) 01127 // // Default 01128 01129 _writeCommand(0x72); // Function Select B: 0 1 1 1 0 0 1 0 (Ext Instr Set) 01130 _writeData(0x01); // Select ROM A (CGRAM 8, CGROM 248) 01131 01132 _writeCommand(0x79); // Function Select OLED: 0 1 1 1 1 0 0 1 (Ext Instr Set) 01133 01134 _writeCommand(0xDA); // Set Segm Pins Config: 1 1 0 1 1 0 1 0 (Ext Instr Set, OLED) 01135 _writeCommand(0x10); // Set Segm Pins Config value: Altern Odd/Even, Disable Remap (Ext Instr Set, OLED) 01136 01137 _writeCommand(0xDC); // Function Select C: 1 1 0 1 1 1 0 0 (Ext Instr Set, OLED) 01138 // _writeCommand(0x00); // Set internal VSL, GPIO pin HiZ (always read low) 01139 _writeCommand(0x80); // Set external VSL, GPIO pin HiZ (always read low) 01140 01141 _contrast = LCD_US20_CONTRAST; 01142 _writeCommand(0x81); // Set Contrast Control: 1 0 0 0 0 0 0 1 (Ext Instr Set, OLED) 01143 _writeCommand((_contrast << 2) | 0x03); // Set Contrast Value: 8 bits, use 6 bits for compatibility 01144 01145 _writeCommand(0xD9); // Set Phase Length: 1 1 0 1 1 0 0 1 (Ext Instr Set, OLED) 01146 _writeCommand(0xF1); // Set Phase Length Value: 01147 01148 _writeCommand(0xDB); // Set VCOMH Deselect Lvl: 1 1 0 1 1 0 1 1 (Ext Instr Set, OLED) 01149 _writeCommand(0x30); // Set VCOMH Deselect Value: 0.83 x VCC 01150 01151 wait_ms(10); // Wait 10ms to ensure powered up 01152 01153 //Test Fade/Blinking. Hard Blink on/off, No fade in/out ?? 01154 // _writeCommand(0x23); // Set (Ext Instr Set, OLED) 01155 // _writeCommand(0x3F); // Set interval 128 frames 01156 //End Test Blinking 01157 01158 _writeCommand(0x78); // Function Disable OLED: 0 1 1 1 1 0 0 0 (Ext Instr Set) 01159 01160 _writeCommand(0x20 | _function | 0x01); // Set function, 0 0 1 X N DH RE(0) IS=1 Select Instruction Set 1 01161 // Select Std Instr set, Select IS=1 01162 01163 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV 01164 // Select Ext Instr Set, IS=1 01165 _writeCommand(0x10); // Shift/Scroll enable, 0 0 0 1 DS4/HS4 DS3/HS3 DS2/HS2 DS1/HS1 (Ext Instr Set, IS=1) 01166 01167 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0 01168 // Select Std Instr set, Select IS=0 01169 break; // case US2066/SSD1311 Controller 01170 01171 //not yet tested on hardware 01172 case PT6314 : 01173 // Initialise Display configuration 01174 switch (_type) { 01175 case LCD8x1: //8x1 is a regular 1 line display 01176 case LCD8x2B: //8x2B is a special case of 16x1 01177 // case LCD12x1: 01178 case LCD16x1: 01179 case LCD20x1: 01180 case LCD24x1: 01181 _function = 0x00; // Function set 001 DL N X BR1 BR0 01182 // DL=0 (4 bits bus) 01183 // Note: 4 bit mode is ignored for native SPI and I2C devices 01184 // N=0 (1 line) 01185 // X 01186 // BR1=0 (2 significant bits for brightness 01187 // BR0=0 01188 // 0x0 = 100% 01189 // 0x1 = 75% 01190 // 0x2 = 50% 01191 // 0x3 = 25% 01192 01193 break; 01194 01195 // All other valid LCD types are initialised as 2 Line displays 01196 case LCD8x2: 01197 case LCD16x2: 01198 case LCD20x2: 01199 case LCD24x2: 01200 _function = 0x08; // Function set 001 DL N X BR1 BR2 01201 // DL=0 (4 bits bus) 01202 // Note: 4 bit mode is ignored for native SPI and I2C devices 01203 // N=1 (2 lines) 01204 // X 01205 // BR1=0 (2 significant bits for brightness 01206 // BR0=0 01207 break; 01208 01209 default: 01210 error("Error: LCD Controller type does not support this Display type\n\r"); 01211 break; 01212 } // switch type 01213 01214 _contrast = LCD_PT63_CONTRAST; 01215 _writeCommand(0x20 | _function | ((~_contrast) >> 4)); // Invert and shift to use 2 MSBs 01216 break; // case PT6314 Controller (VFD) 01217 01218 01219 case HD66712: 01220 // Initialise Display configuration 01221 switch (_type) { 01222 case LCD8x1: //8x1 is a regular 1 line display 01223 case LCD12x1: 01224 case LCD16x1: 01225 case LCD20x1: 01226 case LCD24x1: 01227 // case LCD32x1: // EXT pin is High, extension driver needed 01228 _function = 0x02; // Function set 001 DL N RE(0) - - (Std Regs) 01229 // DL=0 (4 bits bus) 01230 // N=0 (1-line mode, N=1 2-line mode) 01231 // RE=0 (Dis. Extended Regs, special mode for HD66712) 01232 // 01233 01234 _function_1 = 0x04; // Function set 001 DL N RE(1) BE LP (Ext Regs) 01235 // DL=0 (4 bits bus) 01236 // N=0 (1-line mode, N=1 2-line mode) 01237 // RE=1 (Ena Extended Regs; special mode for HD66712) 01238 // BE=0 (Blink Enable, CG/SEG RAM; special mode for HD66712) 01239 // LP=0 (LP=1 Low power mode, LP=0 Normal; special mode for HD66712) 01240 01241 _function_x = 0x00; // Ext Function set 0000 1 FW BW NW (Ext Regs) 01242 // NW=0 (1,2 line), NW=1 (4 Line, special mode for HD66712) 01243 break; 01244 01245 // case LCD12x3D: // Special mode for KS0073, KS0078, PCF21XX and HD66712 01246 // case LCD12x3D1: // Special mode for KS0073, KS0078, PCF21XX and HD66712 01247 case LCD12x4D: // Special mode for KS0073, KS0078, PCF21XX and HD66712 01248 // case LCD16x3D: // Special mode for KS0073, KS0078 and HD66712 01249 // case LCD16x4D: // Special mode for KS0073, KS0078 and HD66712 01250 case LCD20x4D: // Special mode for KS0073, KS0078 and HD66712 01251 _function = 0x02; // Function set 001 DL N RE(0) - - (Std Regs) 01252 // DL=0 (4 bits bus) 01253 // N=0 (1-line mode, N=1 2-line mode) 01254 // RE=0 (Dis. Extended Regs, special mode for HD66712) 01255 // 01256 01257 _function_1 = 0x04; // Function set 001 DL N RE(1) BE LP (Ext Regs) 01258 // DL=0 (4 bits bus) 01259 // N=0 (1-line mode, N=1 2-line mode) 01260 // RE=1 (Ena Extended Regs; special mode for HD66712) 01261 // BE=0 (Blink Enable, CG/SEG RAM; special mode for HD66712) 01262 // LP=0 (LP=1 Low power mode, LP=0 Normal; special mode for HD66712) 01263 01264 _function_x = 0x01; // Ext Function set 0000 1 FW BW NW (Ext Regs) 01265 // NW=0 (1,2 line), NW=1 (4 Line, special mode for HD66712) 01266 break; 01267 01268 case LCD16x3G: // Special mode for ST7036 01269 // case LCD24x3D: // Special mode for KS0078 01270 // case LCD24x3D1: // Special mode for KS0078 01271 case LCD24x4D: // Special mode for KS0078 01272 error("Error: LCD Controller type does not support this Display type\n\r"); 01273 break; 01274 01275 default: 01276 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4) 01277 _function = 0x0A; // Function set 001 DL N RE(0) - - (Std Regs) 01278 // DL=0 (4 bits bus) 01279 // N=1 (2-line mode), N=0 (1-line mode) 01280 // RE=0 (Dis. Extended Regs, special mode for HD66712) 01281 01282 _function_1 = 0x0C; // Function set 001 DL N RE(1) BE LP (Ext Regs) 01283 // DL=0 (4 bits bus) 01284 // N=1 (2 line mode), N=0 (1-line mode) 01285 // RE=1 (Ena Extended Regs, special mode for HD66712) 01286 // BE=0 (Blink Enable, CG/SEG RAM, special mode for HD66712) 01287 // LP=0 (LP=1 Low power mode, LP=0 Normal) 01288 01289 _function_x = 0x00; // Ext Function set 0000 1 FW BW NW (Ext Regs) 01290 // NW=0 (1,2 line), NW=1 (4 Line, special mode for HD66712) 01291 break; 01292 } // switch type 01293 01294 // init special features 01295 _writeCommand(0x20 | _function_1);// Function set 001 DL N RE(1) BE LP (Ext Regs) 01296 // DL=0 (4 bits bus), DL=1 (8 bits mode) 01297 // N=0 (1 line mode), N=1 (2 line mode) 01298 // RE=1 (Ena Extended Regs, special mode for HD66712) 01299 // BE=0 (Blink Enable/Disable, CG/SEG RAM, special mode for HD66712) 01300 // LP=0 (LP=1 Low power mode, LP=0 Normal) 01301 01302 _writeCommand(0x08 | _function_x); // Ext Function set 0000 1 FW BW NW (Ext Regs) 01303 // FW=0 (5-dot font, special mode for HD66712) 01304 // BW=0 (Cur BW invert disable, special mode for HD66712) 01305 // NW=0 (1,2 Line), NW=1 (4 line, special mode for HD66712) 01306 01307 _writeCommand(0x10); // Scroll/Shift set 0001 HS4 HS3 HS2 HS1 (Ext Regs) 01308 // Dotscroll/Display shift enable (Special mode for HD66712) 01309 01310 _writeCommand(0x80); // Scroll Quantity set 1 0 HDS5 HDS4 HDS3 HDS2 HDS1 HDS0 (Ext Regs) 01311 // Scroll quantity (Special mode for HD66712) 01312 01313 _writeCommand(0x20 | _function); // Function set 001 DL N RE(0) DH REV (Std Regs) 01314 // DL=0 (4 bits bus), DL=1 (8 bits mode) 01315 // N=0 (1 line mode), N=1 (2 line mode) 01316 // RE=0 (Dis. Extended Regs, special mode for HD66712) 01317 // DH=1 (Disp shift enable/disable, special mode for HD66712) 01318 // REV=0 (Reverse/Normal, special mode for HD66712) 01319 break; // case HD66712 Controller 01320 01321 01322 case ST7066_ACM: // ST7066 4/8 bit, I2C on ACM1602 using a PIC 01323 default: 01324 // Devices fully compatible to HD44780 that do not use any DC/DC Voltage converters but external VLCD, no icons etc 01325 01326 // Initialise Display configuration 01327 switch (_type) { 01328 case LCD8x1: //8x1 is a regular 1 line display 01329 case LCD8x2B: //8x2B is a special case of 16x1 01330 // case LCD12x1: 01331 case LCD16x1: 01332 // case LCD20x1: 01333 case LCD24x1: 01334 // case LCD40x1: 01335 _function = 0x00; // Function set 001 DL N F - - 01336 // DL=0 (4 bits bus) 01337 // N=0 (1 line) 01338 // F=0 (5x7 dots font) 01339 break; 01340 01341 case LCD12x3D: // Special mode for KS0078 and PCF21XX 01342 case LCD12x3D1: // Special mode for KS0078 and PCF21XX 01343 case LCD12x4D: // Special mode for KS0078 and PCF21XX: 01344 case LCD16x3D: // Special mode for KS0078 01345 // case LCD16x3D1: // Special mode for KS0078 01346 // case LCD24x3D: // Special mode for KS0078 01347 // case LCD24x3D1: // Special mode for KS0078 01348 case LCD24x4D: // Special mode for KS0078 01349 error("Error: LCD Controller type does not support this Display type\n\r"); 01350 break; 01351 01352 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4) 01353 default: 01354 _function = 0x08; // Function set 001 DL N F - - 01355 // DL=0 (4 bits bus) 01356 // Note: 4 bit mode is ignored for native SPI and I2C devices 01357 // N=1 (2 lines) 01358 // F=0 (5x7 dots font, only option for 2 line display) 01359 // - (Don't care) 01360 break; 01361 } // switch type 01362 01363 _writeCommand(0x20 | _function); 01364 break; // case default Controller 01365 01366 } // switch Controller specific initialisations 01367 01368 // Controller general initialisations 01369 // _writeCommand(0x01); // Clear Display and set cursor to 0 01370 // wait_ms(10); // The CLS command takes 1.64 ms. 01371 // // Since we are not using the Busy flag, Lets be safe and take 10 ms 01372 01373 _writeCommand(0x02); // Cursor Home, DDRAM Address to Origin 01374 wait_ms(10); // The Return Home command takes 1.64 ms. 01375 // Since we are not using the Busy flag, Lets be safe and take 10 ms 01376 01377 _writeCommand(0x06); // Entry Mode 0000 0 1 I/D S 01378 // Cursor Direction and Display Shift 01379 // I/D=1 (Cur incr) 01380 // S=0 (No display shift) 01381 01382 _writeCommand(0x14); // Cursor or Display shift 0001 S/C R/L x x 01383 // S/C=0 Cursor moves 01384 // R/L=1 Right 01385 // 01386 01387 // _writeCommand(0x0C); // Display Ctrl 0000 1 D C B 01388 // // Display On, Cursor Off, Blink Off 01389 01390 // setCursor(CurOff_BlkOff); 01391 setCursor(CurOn_BlkOff); 01392 setMode(DispOn); 01393 } 01394 01395 01396 /** Clear the screen, Cursor home. 01397 * Note: The whole display is initialised to charcode 0x20, which may not be a 'space' on some controllers with a 01398 * different fontset such as the PCF2116C or PCF2119R. In this case you should fill the display with 'spaces'. 01399 */ 01400 void TextLCD_Base::cls() { 01401 01402 // Select and configure second LCD controller when needed 01403 if(_type==LCD40x4) { 01404 _ctrl_idx=_LCDCtrl_1; // Select 2nd controller 01405 01406 // Second LCD controller Cursor always Off 01407 _setCursorAndDisplayMode(_currentMode, CurOff_BlkOff); 01408 01409 // Second LCD controller Clearscreen 01410 _writeCommand(0x01); // cls, and set cursor to 0 01411 wait_ms(20); // The CLS command takes 1.64 ms. 01412 // Since we are not using the Busy flag, Lets be safe and take 10 ms 01413 01414 _ctrl_idx=_LCDCtrl_0; // Select primary controller 01415 } 01416 01417 // Primary LCD controller Clearscreen 01418 _writeCommand(0x01); // cls, and set cursor to 0 01419 wait_ms(20); // The CLS command takes 1.64 ms. 01420 // Since we are not using the Busy flag, Lets be safe and take 10 ms 01421 01422 // Restore cursormode on primary LCD controller when needed 01423 if(_type==LCD40x4) { 01424 _setCursorAndDisplayMode(_currentMode,_currentCursor); 01425 } 01426 01427 setAddress(0, 0); // Reset Cursor location 01428 // Note: This is needed because some displays (eg PCF21XX) don't use line 0 in the '3 Line' mode. 01429 } 01430 01431 /** Locate cursor to a screen column and row 01432 * 01433 * @param column The horizontal position from the left, indexed from 0 01434 * @param row The vertical position from the top, indexed from 0 01435 */ 01436 void TextLCD_Base::locate(int column, int row) { 01437 01438 // setAddress() does all the heavy lifting: 01439 // check column and row sanity, 01440 // switch controllers for LCD40x4 if needed 01441 // switch cursor for LCD40x4 if needed 01442 // set the new memory address to show cursor at correct location 01443 setAddress(column, row); 01444 } 01445 01446 01447 /** Write a single character (Stream implementation) 01448 */ 01449 int TextLCD_Base::_putc(int value) { 01450 int addr; 01451 01452 if (value == '\n') { 01453 //No character to write 01454 01455 //Update Cursor 01456 _column = 0; 01457 _row++; 01458 if (_row >= rows()) { 01459 _row = 0; 01460 } 01461 } 01462 else { 01463 //Character to write 01464 #if (LCD_DEF_FONT == 1) 01465 _writeData(value); 01466 #else 01467 _writeData(ASCII_2_LCD(value)); 01468 #endif 01469 //Update Cursor 01470 _column++; 01471 if (_column >= columns()) { 01472 _column = 0; 01473 _row++; 01474 if (_row >= rows()) { 01475 _row = 0; 01476 } 01477 } 01478 } //else 01479 01480 //Set next memoryaddress, make sure cursor blinks at next location 01481 addr = getAddress(_column, _row); 01482 _writeCommand(0x80 | addr); 01483 01484 return value; 01485 } 01486 01487 01488 // get a single character (Stream implementation) 01489 int TextLCD_Base::_getc() { 01490 return -1; 01491 } 01492 01493 /** Convert ASCII character code to the LCD fonttable code 01494 * 01495 * @param c The character to write to the display 01496 * @return The character code for the specific fonttable of the controller 01497 */ 01498 int TextLCD_Base::ASCII_2_LCD (int c) { 01499 01500 //LCD_C_FT0 is default for HD44780 and compatible series 01501 if (_font == LCD_C_FT0) return c; 01502 01503 //LCD_C_FT1 for PCF21XXC series 01504 //LCD_C_FT2 for PCF21XXR series 01505 //Used code from Suga koubou library for PCF2119K and PCF2119R 01506 if (((c >= ' ') && (c <= '?')) || ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'))) { 01507 c |= 0x80; 01508 } else if (c >= 0xF0 && c <= 0xFF) { 01509 c &= 0x0f; 01510 } 01511 return c; 01512 01513 //LCD_C_FT2 ... 01514 //@TODO add more, eg cyrillic 01515 //@TODO add method to switch between fonts for controllers that support this 01516 } 01517 01518 01519 #if(LCD_PRINTF != 1) 01520 /** Write a character to the LCD 01521 * 01522 * @param c The character to write to the display 01523 */ 01524 int TextLCD_Base::putc(int c){ 01525 return _putc(c); 01526 } 01527 01528 01529 /** Write a raw string to the LCD 01530 * 01531 * @param string text, may be followed by variables to emulate formatting the string. 01532 * However, printf formatting is NOT supported and variables will be ignored! 01533 */ 01534 int TextLCD_Base::printf(const char* text, ...) { 01535 01536 while (*text !=0) { 01537 _putc(*text); 01538 text++; 01539 } 01540 return 0; 01541 } 01542 #endif 01543 01544 01545 // Write a nibble using the 4-bit interface 01546 void TextLCD_Base::_writeNibble(int value) { 01547 01548 // Enable is Low 01549 this->_setEnable(true); 01550 this->_setData(value); // Low nibble of value on D4..D7 01551 wait_us(1); // Data setup time 01552 this->_setEnable(false); 01553 wait_us(1); // Datahold time 01554 // Enable is Low 01555 } 01556 01557 // Write a byte using the 4-bit interface 01558 void TextLCD_Base::_writeByte(int value) { 01559 01560 // Enable is Low 01561 this->_setEnable(true); 01562 this->_setData(value >> 4); // High nibble 01563 wait_us(1); // Data setup time 01564 this->_setEnable(false); 01565 wait_us(1); // Data hold time 01566 01567 this->_setEnable(true); 01568 this->_setData(value); // Low nibble 01569 wait_us(1); // Data setup time 01570 this->_setEnable(false); 01571 wait_us(1); // Datahold time 01572 01573 // Enable is Low 01574 } 01575 01576 // Write a command byte to the LCD controller 01577 void TextLCD_Base::_writeCommand(int command) { 01578 01579 this->_setRS(false); 01580 wait_us(1); // Data setup time for RS 01581 01582 this->_writeByte(command); 01583 wait_us(40); // most instructions take 40us 01584 } 01585 01586 // Write a data byte to the LCD controller 01587 void TextLCD_Base::_writeData(int data) { 01588 01589 this->_setRS(true); 01590 wait_us(1); // Data setup time for RS 01591 01592 this->_writeByte(data); 01593 wait_us(40); // data writes take 40us 01594 } 01595 01596 01597 // This replaces the original _address() method. 01598 // It is confusing since it returns the memoryaddress or-ed with the set memorycommand 0x80. 01599 // Left it in here for compatibility with older code. New applications should use getAddress() instead. 01600 int TextLCD_Base::_address(int column, int row) { 01601 return 0x80 | getAddress(column, row); 01602 } 01603 01604 01605 // This is new method to return the memory address based on row, column and displaytype. 01606 // 01607 /** Return the memoryaddress of screen column and row location 01608 * 01609 * @param column The horizontal position from the left, indexed from 0 01610 * @param row The vertical position from the top, indexed from 0 01611 * @return The memoryaddress of screen column and row location 01612 * 01613 */ 01614 int TextLCD_Base::getAddress(int column, int row) { 01615 01616 switch (_addr_mode) { 01617 01618 case LCD_T_A: 01619 //Default addressing mode for 1, 2 and 4 rows (except 40x4) 01620 //The two available rows are split and stacked on top of eachother. Addressing for 3rd and 4th line continues where lines 1 and 2 were split. 01621 //Displays top rows when less than four are used. 01622 switch (row) { 01623 case 0: 01624 return 0x00 + column; 01625 case 1: 01626 return 0x40 + column; 01627 case 2: 01628 return 0x00 + _nr_cols + column; 01629 case 3: 01630 return 0x40 + _nr_cols + column; 01631 // Should never get here. 01632 // default: 01633 // return 0x00; 01634 } 01635 01636 case LCD_T_B: 01637 // LCD8x2B is a special layout of LCD16x1 01638 if (row==0) 01639 return 0x00 + column; 01640 else 01641 // return _nr_cols + column; 01642 return 0x08 + column; 01643 01644 case LCD_T_C: 01645 // LCD16x1C is a special layout of LCD8x2 01646 // LCD32x1C is a special layout of LCD16x2 01647 // LCD40x1C is a special layout of LCD20x2 01648 #if(0) 01649 if (column < 8) 01650 return 0x00 + column; 01651 else 01652 return 0x40 + (column - 8); 01653 #else 01654 if (column < (_nr_cols >> 1)) 01655 return 0x00 + column; 01656 else 01657 return 0x40 + (column - (_nr_cols >> 1)); 01658 #endif 01659 01660 // Not sure about this one, seems wrong. 01661 // Left in for compatibility with original library 01662 // case LCD16x2B: 01663 // return 0x00 + (row * 40) + column; 01664 01665 case LCD_T_D: 01666 //Alternate addressing mode for 3 and 4 row displays (except 40x4). Used by PCF21XX, KS0073, KS0078, SSD1803 01667 //The 4 available rows start at a hardcoded address. 01668 //Displays top rows when less than four are used. 01669 switch (row) { 01670 case 0: 01671 return 0x00 + column; 01672 case 1: 01673 return 0x20 + column; 01674 case 2: 01675 return 0x40 + column; 01676 case 3: 01677 return 0x60 + column; 01678 // Should never get here. 01679 // default: 01680 // return 0x00; 01681 } 01682 01683 case LCD_T_D1: 01684 //Alternate addressing mode for 3 row displays. Used by PCF21XX, KS0073, KS0078, SSD1803 01685 //The 4 available rows start at a hardcoded address. 01686 //Skips top row of 4 row display and starts display at row 1 01687 switch (row) { 01688 case 0: 01689 return 0x20 + column; 01690 case 1: 01691 return 0x40 + column; 01692 case 2: 01693 return 0x60 + column; 01694 // Should never get here. 01695 // default: 01696 // return 0x00; 01697 } 01698 01699 case LCD_T_E: 01700 // LCD40x4 is a special case since it has 2 controllers. 01701 // Each controller is configured as 40x2 (Type A) 01702 if (row<2) { 01703 // Test to see if we need to switch between controllers 01704 if (_ctrl_idx != _LCDCtrl_0) { 01705 01706 // Second LCD controller Cursor Off 01707 _setCursorAndDisplayMode(_currentMode, CurOff_BlkOff); 01708 01709 // Select primary controller 01710 _ctrl_idx = _LCDCtrl_0; 01711 01712 // Restore cursormode on primary LCD controller 01713 _setCursorAndDisplayMode(_currentMode, _currentCursor); 01714 } 01715 01716 return 0x00 + (row * 0x40) + column; 01717 } 01718 else { 01719 01720 // Test to see if we need to switch between controllers 01721 if (_ctrl_idx != _LCDCtrl_1) { 01722 // Primary LCD controller Cursor Off 01723 _setCursorAndDisplayMode(_currentMode, CurOff_BlkOff); 01724 01725 // Select secondary controller 01726 _ctrl_idx = _LCDCtrl_1; 01727 01728 // Restore cursormode on secondary LCD controller 01729 _setCursorAndDisplayMode(_currentMode, _currentCursor); 01730 } 01731 01732 return 0x00 + ((row-2) * 0x40) + column; 01733 } 01734 01735 case LCD_T_F: 01736 //Alternate addressing mode for 3 row displays. 01737 //The first half of 3rd row continues from 1st row, the second half continues from 2nd row. 01738 switch (row) { 01739 case 0: 01740 return 0x00 + column; 01741 case 1: 01742 return 0x40 + column; 01743 case 2: 01744 if (column < (_nr_cols >> 1)) // check first or second half of line 01745 return (0x00 + _nr_cols + column); 01746 else 01747 return (0x40 + _nr_cols + (column - (_nr_cols >> 1))); 01748 // Should never get here. 01749 // default: 01750 // return 0x00; 01751 } 01752 01753 case LCD_T_G: 01754 //Alternate addressing mode for 3 row displays. Used by ST7036 01755 switch (row) { 01756 case 0: 01757 return 0x00 + column; 01758 case 1: 01759 return 0x10 + column; 01760 case 2: 01761 return 0x20 + column; 01762 // Should never get here. 01763 // default: 01764 // return 0x00; 01765 } 01766 01767 // Should never get here. 01768 default: 01769 return 0x00; 01770 01771 } // switch _addr_mode 01772 } 01773 01774 01775 /** Set the memoryaddress of screen column and row location 01776 * 01777 * @param column The horizontal position from the left, indexed from 0 01778 * @param row The vertical position from the top, indexed from 0 01779 */ 01780 void TextLCD_Base::setAddress(int column, int row) { 01781 01782 // Sanity Check column 01783 if (column < 0) { 01784 _column = 0; 01785 } 01786 else if (column >= _nr_cols) { 01787 _column = _nr_cols - 1; 01788 } else _column = column; 01789 01790 // Sanity Check row 01791 if (row < 0) { 01792 _row = 0; 01793 } 01794 else if (row >= _nr_rows) { 01795 _row = _nr_rows - 1; 01796 } else _row = row; 01797 01798 01799 // Compute the memory address 01800 // For LCD40x4: switch controllers if needed 01801 // switch cursor if needed 01802 int addr = getAddress(_column, _row); 01803 01804 _writeCommand(0x80 | addr); 01805 } 01806 01807 01808 /** Return the number of columns 01809 * 01810 * @return The number of columns 01811 * 01812 * Note: some configurations are commented out because they have not yet been tested due to lack of hardware 01813 */ 01814 int TextLCD_Base::columns() { 01815 01816 // Columns encoded in b7..b0 01817 //return (_type & 0xFF); 01818 return _nr_cols; 01819 } 01820 01821 /** Return the number of rows 01822 * 01823 * @return The number of rows 01824 * 01825 * Note: some configurations are commented out because they have not yet been tested due to lack of hardware 01826 */ 01827 int TextLCD_Base::rows() { 01828 01829 // Rows encoded in b15..b8 01830 //return ((_type >> 8) & 0xFF); 01831 return _nr_rows; 01832 } 01833 01834 /** Set the Cursormode 01835 * 01836 * @param cursorMode The Cursor mode (CurOff_BlkOff, CurOn_BlkOff, CurOff_BlkOn, CurOn_BlkOn) 01837 */ 01838 void TextLCD_Base::setCursor(LCDCursor cursorMode) { 01839 01840 // Save new cursor mode, needed when 2 controllers are in use or when display is switched off/on 01841 _currentCursor = cursorMode; 01842 01843 // Configure only current LCD controller 01844 _setCursorAndDisplayMode(_currentMode, _currentCursor); 01845 } 01846 01847 /** Set the Displaymode 01848 * 01849 * @param displayMode The Display mode (DispOff, DispOn) 01850 */ 01851 void TextLCD_Base::setMode(LCDMode displayMode) { 01852 01853 // Save new displayMode, needed when 2 controllers are in use or when cursor is changed 01854 _currentMode = displayMode; 01855 01856 // Select and configure second LCD controller when needed 01857 if(_type==LCD40x4) { 01858 if (_ctrl_idx==_LCDCtrl_0) { 01859 // Configure primary LCD controller 01860 _setCursorAndDisplayMode(_currentMode, _currentCursor); 01861 01862 // Select 2nd controller 01863 _ctrl_idx=_LCDCtrl_1; 01864 01865 // Configure secondary LCD controller 01866 _setCursorAndDisplayMode(_currentMode, CurOff_BlkOff); 01867 01868 // Restore current controller 01869 _ctrl_idx=_LCDCtrl_0; 01870 } 01871 else { 01872 // Select primary controller 01873 _ctrl_idx=_LCDCtrl_0; 01874 01875 // Configure primary LCD controller 01876 _setCursorAndDisplayMode(_currentMode, CurOff_BlkOff); 01877 01878 // Restore current controller 01879 _ctrl_idx=_LCDCtrl_1; 01880 01881 // Configure secondary LCD controller 01882 _setCursorAndDisplayMode(_currentMode, _currentCursor); 01883 } 01884 } 01885 else { 01886 // Configure primary LCD controller 01887 _setCursorAndDisplayMode(_currentMode, _currentCursor); 01888 } 01889 } 01890 01891 /** Low level method to restore the cursortype and display mode for current controller 01892 */ 01893 void TextLCD_Base::_setCursorAndDisplayMode(LCDMode displayMode, LCDCursor cursorType) { 01894 01895 // Configure current LCD controller 01896 switch (_ctrl) { 01897 case ST7070: 01898 //ST7070 does not support Cursorblink. The P bit selects the font instead ! 01899 _writeCommand(0x08 | displayMode | (cursorType & 0x02)); 01900 break; 01901 default: 01902 _writeCommand(0x08 | displayMode | cursorType); 01903 break; 01904 } //switch 01905 } 01906 01907 /** Set the Backlight mode 01908 * 01909 * @param backlightMode The Backlight mode (LightOff, LightOn) 01910 */ 01911 void TextLCD_Base::setBacklight(LCDBacklight backlightMode) { 01912 01913 #if (BACKLIGHT_INV==0) 01914 // Positive Backlight control pin logic 01915 if (backlightMode == LightOn) { 01916 this->_setBL(true); 01917 } 01918 else { 01919 this->_setBL(false); 01920 } 01921 #else 01922 // Inverted Backlight control pin logic 01923 if (backlightMode == LightOn) { 01924 this->_setBL(false); 01925 } 01926 else { 01927 this->_setBL(true); 01928 } 01929 #endif 01930 } 01931 01932 /** Set User Defined Characters 01933 * 01934 * @param unsigned char c The Index of the UDC (0..7) for HD44780 or clones and (0..15) for some more advanced controllers 01935 * @param char *udc_data The bitpatterns for the UDC (8 bytes of 5 significant bits for bitpattern and 3 bits for blinkmode (advanced types)) 01936 */ 01937 void TextLCD_Base::setUDC(unsigned char c, char *udc_data) { 01938 01939 // Select and configure second LCD controller when needed 01940 if(_type==LCD40x4) { 01941 _LCDCtrl_Idx current_ctrl_idx = _ctrl_idx; // Temp save current controller 01942 01943 // Select primary controller 01944 _ctrl_idx=_LCDCtrl_0; 01945 01946 // Configure primary LCD controller 01947 _setUDC(c, udc_data); 01948 01949 // Select 2nd controller 01950 _ctrl_idx=_LCDCtrl_1; 01951 01952 // Configure secondary LCD controller 01953 _setUDC(c, udc_data); 01954 01955 // Restore current controller 01956 _ctrl_idx=current_ctrl_idx; 01957 } 01958 else { 01959 // Configure primary LCD controller 01960 _setUDC(c, udc_data); 01961 } 01962 } 01963 01964 /** Low level method to store user defined characters for current controller 01965 * 01966 * @param unsigned char c The Index of the UDC (0..7) for HD44780 clones and (0..15) for some more advanced controllers 01967 * @param char *udc_data The bitpatterns for the UDC (8 bytes of 5 significant bits for bitpattern and 3 bits for blinkmode (advanced types)) 01968 */ 01969 void TextLCD_Base::_setUDC(unsigned char c, char *udc_data) { 01970 01971 switch (_ctrl) { 01972 case PCF2103_3V3 : // Some UDCs may be used for Icons 01973 case PCF2113_3V3 : // Some UDCs may be used for Icons 01974 case PCF2116_3V3 : 01975 case PCF2116_5V : 01976 case PCF2119_3V3 : // Some UDCs may be used for Icons 01977 case PCF2119R_3V3: // Some UDCs may be used for Icons 01978 c = c & 0x0F; // mask down to valid range 01979 break; 01980 01981 default: 01982 c = c & 0x07; // mask down to valid range 01983 break; 01984 } //switch _ctrl 01985 01986 // Select DD RAM for current LCD controller 01987 // This is needed to correctly set Bit 6 of the addresspointer for controllers that support 16 UDCs 01988 _writeCommand(0x80 | ((c << 3) & 0x40)) ; 01989 01990 // Select CG RAM for current LCD controller 01991 _writeCommand(0x40 | ((c << 3) & 0x3F)); //Set CG-RAM address, (note that Bit 6 is retained and can not be set by this command !) 01992 //8 sequential locations needed per UDC 01993 // Store UDC pattern 01994 for (int i=0; i<8; i++) { 01995 _writeData(*udc_data++); 01996 } 01997 01998 //Select DD RAM again for current LCD controller and restore the addresspointer 01999 int addr = getAddress(_column, _row); 02000 _writeCommand(0x80 | addr); 02001 } 02002 02003 #if(LCD_BLINK == 1) 02004 /** Set UDC Blink and Icon blink 02005 * setUDCBlink method is supported by some compatible devices (eg SSD1803) 02006 * 02007 * @param blinkMode The Blink mode (BlinkOff, BlinkOn) 02008 */ 02009 void TextLCD_Base::setUDCBlink(LCDBlink blinkMode){ 02010 // Blinking UDCs (and icons) are enabled when a specific controlbit (BE) is set. 02011 // The blinking pixels in the UDC and icons can be controlled by setting additional bits in the UDC or icon bitpattern. 02012 // UDCs are defined by an 8 byte bitpattern. The P0..P4 form the character pattern. 02013 // P7 P6 P5 P4 P3 P2 P1 P0 02014 // 0 B1 B0 x 0 1 1 1 0 02015 // 1 B1 B0 x 1 0 0 0 1 02016 // ............. 02017 // 7 B1 B0 x 1 0 0 0 1 02018 // 02019 // Bit 6 and Bit 7 in the pattern will control the blinking mode when Blink is enabled through BE. 02020 // B1 B0 Mode 02021 // 0 0 No Blinking in this row of the UDC 02022 // 0 1 Enabled pixels in P4 will blink 02023 // 1 x Enabled pixels in P0..P4 will blink 02024 // 02025 // Note: the PCF2103 and PCF2113 use UDCs to set Icons 02026 // 3 x 8 rows x 5 bits = 120 bits Icons for Normal pattern (UDC 0..2) and 02027 // 3 x 8 rows x 5 bits = 120 bits Icons for Blink pattern (UDC 4..6) 02028 // Note: the PCF2119 uses UDCs to set Icons 02029 // 4 x 8 rows x 5 bits = 160 bits Icons for Normal pattern (UDC 0..3) and 02030 // 4 x 8 rows x 5 bits = 160 bits Icons for Blink pattern (UDC 4..7) 02031 switch (blinkMode) { 02032 case BlinkOn: 02033 // Controllers that support UDC/Icon Blink 02034 switch (_ctrl) { 02035 case KS0073 : 02036 case KS0078 : 02037 case HD66712 : 02038 _function_1 |= 0x02; // Enable UDC/Icon Blink 02039 _writeCommand(0x20 | _function_1); // Function set 0 0 1 DL N RE(1) BE 0/LP (Ext Regs) 02040 02041 _writeCommand(0x20 | _function); // Function set 0 0 1 DL N RE(0) DH REV (Std Regs) 02042 break; // case KS0073, KS0078, HD66712 Controller 02043 02044 case US2066_3V3 : 02045 case SSD1803_3V3 : 02046 _function_1 |= 0x04; // Enable UDC/Icon Blink 02047 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 DL N BE RE(1) REV 02048 // Select Ext Instr Set 02049 02050 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0 02051 // Select Std Instr set, Select IS=0 02052 break; // case SSD1803, US2066 02053 02054 case PCF2103_3V3 : 02055 case PCF2113_3V3 : 02056 case PCF2119_3V3 : 02057 case PCF2119R_3V3 : 02058 // Enable Icon Blink 02059 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1 02060 _writeCommand(0x08 | 0x02); // ICON Conf 0000 1, IM=0 (Char mode), IB=1 (Icon blink), 0 (Instr. Set 1) 02061 _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0 02062 02063 break; 02064 02065 default: 02066 //Unsupported feature for other controllers 02067 break; 02068 } //switch _ctrl 02069 02070 break; // BlinkOn 02071 02072 case BlinkOff: 02073 // Controllers that support UDC Blink 02074 switch (_ctrl) { 02075 case KS0073 : 02076 case KS0078 : 02077 case HD66712: 02078 _function_1 &= ~0x02; // Disable UDC/Icon Blink 02079 _writeCommand(0x20 | _function_1); // Function set 0 0 1 DL N RE(1) BE 0/LP (Ext Regs) 02080 02081 _writeCommand(0x20 | _function); // Function set 0 0 1 DL N RE(0) DH REV (Std Regs) 02082 break; // case KS0073, KS0078, HD66712 Controller 02083 02084 case US2066_3V3 : 02085 case SSD1803_3V3 : 02086 _function_1 &= ~0x04; // Disable UDC/Icon Blink 02087 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 DL N BE RE(1) REV 02088 // Select Ext Instr Set 02089 02090 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0 02091 // Select Std Instr set, Select IS=0 02092 break; // case SSD1803, US2066 02093 02094 case PCF2103_3V3 : 02095 case PCF2113_3V3 : 02096 case PCF2119_3V3 : 02097 case PCF2119R_3V3 : 02098 // Disable Icon Blink 02099 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1 02100 _writeCommand(0x08); // ICON Conf 0000 1, IM=0 (Char mode), IB=1 (Icon blink), 0 (Instr. Set 1) 02101 _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0 02102 02103 break; 02104 02105 default: 02106 //Unsupported feature for other controllers 02107 break; 02108 } //switch _ctrl 02109 02110 break; //BlinkOff 02111 02112 default: 02113 break; 02114 } // blinkMode 02115 02116 } // setUDCBlink() 02117 #endif 02118 02119 /** Set Contrast 02120 * setContrast method is supported by some compatible devices (eg ST7032i) that have onboard LCD voltage generation 02121 * Initial code for ST70XX imported from fork by JH1PJL 02122 * 02123 * @param unsigned char c contrast data (6 significant bits, valid range 0..63, Value 0 will disable the Vgen) 02124 * @return none 02125 */ 02126 //@TODO Add support for 40x4 dual controller 02127 void TextLCD_Base::setContrast(unsigned char c) { 02128 02129 // Function set mode stored during Init. Make sure we dont accidentally switch between 1-line and 2-line mode! 02130 // Icon/Booster mode stored during Init. Make sure we dont accidentally change this! 02131 02132 _contrast = c & 0x3F; // Sanity check 02133 02134 switch (_ctrl) { 02135 case PCF2113_3V3 : 02136 case PCF2119_3V3 : 02137 case PCF2119R_3V3 : 02138 if (_contrast < 5) _contrast = 0; // See datasheet. Sanity check for PCF2113/PCF2119 02139 if (_contrast > 55) _contrast = 55; 02140 02141 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instruction Set = 1 02142 _writeCommand(0x80 | 0x00 | (_contrast & 0x3F)); // VLCD_set (Instr. Set 1) V=0, VA=contrast 02143 _writeCommand(0x80 | 0x40 | (_contrast & 0x3F)); // VLCD_set (Instr. Set 1) V=1, VB=contrast 02144 _writeCommand(0x20 | _function); // Select Instruction Set = 0 02145 break; 02146 02147 case ST7032_3V3 : 02148 case ST7032_5V : 02149 case ST7036_3V3 : 02150 // case ST7036_5V : 02151 case SSD1803_3V3 : 02152 _writeCommand(0x20 | _function | 0x01); // Select Instruction Set = 1 02153 _writeCommand(0x70 | (_contrast & 0x0F)); // Contrast Low bits 02154 _writeCommand(0x50 | _icon_power | ((_contrast >> 4) & 0x03)); // Contrast High bits 02155 _writeCommand(0x20 | _function); // Select Instruction Set = 0 02156 break; 02157 02158 case US2066_3V3 : 02159 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 DL N BE RE(1) REV 02160 // Select Extended Instruction Set 02161 02162 _writeCommand(0x79); // Function Select OLED: 0 1 1 1 1 0 0 1 (Ext Instr Set) 02163 02164 _writeCommand(0x81); // Set Contrast Control: 1 0 0 0 0 0 0 1 (Ext Instr Set, OLED) 02165 _writeCommand((_contrast << 2) | 0x03); // Set Contrast Value: 8 bits. Use 6 bits for compatibility 02166 02167 _writeCommand(0x78); // Function Disable OLED: 0 1 1 1 1 0 0 0 (Ext Instr Set) 02168 02169 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0 02170 // Select Std Instr set, Select IS=0 02171 break; 02172 02173 //not yet tested on hardware 02174 case PT6314 : 02175 // Only 2 significant bits 02176 // 0x00 = 100% 02177 // 0x01 = 75% 02178 // 0x02 = 50% 02179 // 0x03 = 25% 02180 _writeCommand(0x20 | _function | ((~_contrast) >> 4)); // Invert and shift to use 2 MSBs 02181 break; 02182 02183 default: 02184 //Unsupported feature for other controllers 02185 break; 02186 } // end switch 02187 } // end setContrast() 02188 02189 #if(LCD_POWER == 1) 02190 /** Set Power 02191 * setPower method is supported by some compatible devices (eg SSD1803) that have power down modes 02192 * 02193 * @param bool powerOn Power on/off 02194 * @return none 02195 */ 02196 //@TODO Add support for 40x4 dual controller 02197 void TextLCD_Base::setPower(bool powerOn) { 02198 02199 if (powerOn) { 02200 // Switch on 02201 setMode(DispOn); 02202 02203 // Controllers that supports specific Power Down mode 02204 switch (_ctrl) { 02205 02206 // case PCF2113_3V3 : 02207 // case PCF2119_3V3 : 02208 // case PCF2119R_3V3 : 02209 // case ST7032_3V3 : 02210 //@todo 02211 // enable Booster Bon 02212 02213 case WS0010: 02214 _writeCommand(0x17); // Char mode, DC/DC on 02215 wait_ms(10); // Wait 10ms to ensure powered up 02216 break; 02217 02218 case KS0073: 02219 case KS0078: 02220 case SSD1803_3V3 : 02221 // case SSD1803_5V : 02222 _writeCommand(0x20 | _function_1); // Select Ext Instr Set 02223 _writeCommand(0x02); // Power On 02224 _writeCommand(0x20 | _function); // Select Std Instr Set 02225 break; 02226 02227 default: 02228 //Unsupported feature for other controllers 02229 break; 02230 } // end switch 02231 } 02232 else { 02233 // Switch off 02234 setMode(DispOff); 02235 02236 // Controllers that support specific Power Down mode 02237 switch (_ctrl) { 02238 02239 // case PCF2113_3V3 : 02240 // case PCF2119_3V3 : 02241 // case PCF2119R_3V3 : 02242 // case ST7032_3V3 : 02243 //@todo 02244 // disable Booster Bon 02245 02246 case WS0010: 02247 _writeCommand(0x13); // Char mode, DC/DC off 02248 break; 02249 02250 case KS0073: 02251 case KS0078: 02252 case SSD1803_3V3 : 02253 // case SSD1803_5V : 02254 _writeCommand(0x20 | _function_1); // Select Ext Instr Set 02255 _writeCommand(0x03); // Power Down 02256 _writeCommand(0x20 | _function); // Select Std Instr Set 02257 break; 02258 02259 default: 02260 //Unsupported feature for other controllers 02261 break; 02262 } // end switch 02263 } 02264 } // end setPower() 02265 #endif 02266 02267 #if(LCD_ORIENT == 1) 02268 /** Set Orient 02269 * setOrient method is supported by some compatible devices (eg SSD1803, US2066) that have top/bottom view modes 02270 * 02271 * @param LCDOrient orient Orientation 02272 * @return none 02273 */ 02274 void TextLCD_Base::setOrient(LCDOrient orient){ 02275 02276 switch (orient) { 02277 02278 case Top: 02279 switch (_ctrl) { 02280 case PCF2103_3V3: 02281 case PCF2116_3V3: 02282 case PCF2116_5V: 02283 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1 02284 _writeCommand(0x05); // Display Conf Set 0000 0, 1, P=0, Q=1 (Instr. Set 1) 02285 _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0 02286 break; 02287 02288 case PCF2119_3V3: 02289 case PCF2119R_3V3: 02290 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1 02291 _writeCommand(0x07); // Display Conf Set 0000 0, 1, P=1, Q=1 (Instr. Set 1) 02292 _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0 02293 break; 02294 02295 case SSD1803_3V3 : 02296 // case SSD1803_5V : 02297 case US2066_3V3 : 02298 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV 02299 // Select Extended Instruction Set 02300 // _writeCommand(0x06); // Set ext entry mode, 0 0 0 0 0 1 BDC=1 COM1-32, BDS=0 SEG100-1 "Bottom View" (Ext Instr Set) 02301 _writeCommand(0x05); // Set ext entry mode, 0 0 0 0 0 1 BDC=0 COM32-1, BDS=1 SEG1-100 "Top View" (Ext Instr Set) 02302 02303 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0 02304 // Select Std Instr set, Select IS=0 02305 break; 02306 02307 case ST7070: 02308 _writeCommand(0x20 | _function | 0x04); // Set function, 0 0 1 DL, N, EXT=1, x, x (Select Instr Set = 1) 02309 02310 _writeCommand(0x40 | 0x00); // COM/SEG directions 0 1 0 0 C1, C2, S1, S2 (Instr Set 1) 02311 // C1=1: Com1-8 -> Com8-1; C2=1: Com9-16 -> Com16-9 02312 // S1=1: Seg1-40 -> Seg40-1; S2=1: Seg41-80 -> Seg80-41 02313 wait_ms(5); // Wait to ensure completion or ST7070 fails to set Top/Bottom after reset.. 02314 02315 _writeCommand(0x20 | _function); // Set function, EXT=0 (Select Instr Set = 0) 02316 02317 break; // case ST7070 Controller 02318 02319 default: 02320 //Unsupported feature for other controllers 02321 break; 02322 02323 } // end switch _ctrl 02324 break; // end Top 02325 02326 case Bottom: 02327 switch (_ctrl) { 02328 case PCF2103_3V3: 02329 case PCF2116_3V3: 02330 case PCF2116_5V: 02331 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1 02332 _writeCommand(0x06); // Display Conf Set 0000 0, 1, P=1, Q=0 (Instr. Set 1) 02333 _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0 02334 break; 02335 02336 case PCF2119_3V3: 02337 case PCF2119R_3V3 : 02338 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1 02339 _writeCommand(0x04); // Display Conf Set 0000 0, 1, P=0, Q=0 (Instr. Set 1) 02340 _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0 02341 break; 02342 02343 case SSD1803_3V3 : 02344 // case SSD1803_5V : 02345 case US2066_3V3 : 02346 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV 02347 // Select Extended Instruction Set 02348 _writeCommand(0x06); // Set ext entry mode, 0 0 0 0 0 1 BDC=1 COM1-32, BDS=0 SEG100-1 "Bottom View" (Ext Instr Set) 02349 // _writeCommand(0x05); // Set ext entry mode, 0 0 0 0 0 1 BDC=0 COM32-1, BDS=1 SEG1-100 "Top View" (Ext Instr Set) 02350 02351 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0 02352 // Select Std Instr set, Select IS=0 02353 break; 02354 02355 case ST7070: 02356 //Note: this does not result in correct top/bottom view. 02357 //The left and right half of each row are reversed and the addressing of both rows is also incorrect: 02358 //Top/bottomline when orientation is flipped: 02359 // 0x48...0x4F 0x40...0x47 02360 // 0x08...0x0F 0x00...0x07 02361 _writeCommand(0x20 | _function | 0x04); // Set function, 0 0 1 DL N EXT=1 x x (Select Instr Set = 1) 02362 02363 _writeCommand(0x40 | 0x0F); // COM/SEG directions 0 1 0 0 C1, C2, S1, S2 (Instr Set 1) 02364 // C1=1: Com1-8 -> Com8-1; C2=1: Com9-16 -> Com16-9 02365 // S1=1: Seg1-40 -> Seg40-1; S2=1: Seg41-80 -> Seg80-41 02366 wait_ms(5); // Wait to ensure completion or ST7070 fails to set Top/Bottom after reset.. 02367 02368 _writeCommand(0x20 | _function); // Set function, EXT=0 (Select Instr Set = 0) 02369 02370 break; // case ST7070 Controller 02371 02372 default: 02373 //Unsupported feature for other controllers 02374 break; 02375 02376 } // end switch _ctrl 02377 02378 break; // end Bottom 02379 } // end switch orient 02380 } // end setOrient() 02381 #endif 02382 02383 #if(LCD_BIGFONT == 1) 02384 /** Set Big Font 02385 * setBigFont method is supported by some compatible devices (eg SSD1803, US2066) 02386 * 02387 * @param lines The selected Big Font lines (None, TopLine, CenterLine, BottomLine, TopBottomLine) 02388 * Double height characters can be shown on lines 1+2, 2+3, 3+4 or 1+2 and 3+4 02389 * Valid double height lines depend on the LCDs number of rows. 02390 */ 02391 void TextLCD_Base::setBigFont(LCDBigFont lines) { 02392 02393 switch (lines) { 02394 case None: 02395 switch (_ctrl) { 02396 case SSD1803_3V3 : 02397 case US2066_3V3 : 02398 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV 02399 // Select Extended Instruction Set 02400 _writeCommand(0x1C); // Double Height, 0 0 0 1 UD2=1, UD1=1, X, DH'=0 (Ext Instr Set) 02401 // Default 02402 _function = _function & ~0x04; // Set function, 0 0 1 DL N DH=0 RE(0) IS=0 Select Instruction Set 0 02403 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0 02404 // Select Std Instr set, Select IS=0 02405 break; // end US2066 02406 02407 default: 02408 break; // end default 02409 } // end switch _ctrl 02410 break; // end None 02411 02412 case TopLine: 02413 if (_nr_rows < 2) return; //Sanity check 02414 02415 switch (_ctrl) { 02416 case SSD1803_3V3 : 02417 case US2066_3V3 : 02418 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV 02419 // Select Extended Instruction Set 02420 _writeCommand(0x1C); // Double Height, 0 0 0 1 UD2=1, UD1=1, X, DH'=0 (Ext Instr Set) 02421 // Default 02422 _function = _function | 0x04; // Set function, 0 0 1 DL N DH=1 RE(0) IS=0 Select Instruction Set 0 02423 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0 02424 // Select Std Instr set, Select IS=0 02425 break; // end US2066, SSD1803 02426 02427 default: 02428 break; // end default 02429 } // end switch _ctrl 02430 break; // end TopLine 02431 02432 case CenterLine: 02433 if (_nr_rows != 4) return; //Sanity check 02434 02435 switch (_ctrl) { 02436 case SSD1803_3V3 : 02437 case US2066_3V3 : 02438 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV 02439 // Select Extended Instruction Set 02440 _writeCommand(0x14); // Double Height, 0 0 0 1 UD2=0, UD1=1, X, DH'=0 (Ext Instr Set) 02441 // Default 02442 _function = _function | 0x04; // Set function, 0 0 1 DL N DH=1 RE(0) IS=0 Select Instruction Set 0 02443 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0 02444 // Select Std Instr set, Select IS=0 02445 break; // end US2066, SSD1803 02446 02447 default: 02448 break; // end default 02449 } // end switch _ctrl 02450 break; // end CenterLine 02451 02452 case BottomLine: 02453 if (_nr_rows < 3) return; //Sanity check 02454 02455 switch (_ctrl) { 02456 case SSD1803_3V3 : 02457 case US2066_3V3 : 02458 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV 02459 // Select Extended Instruction Set 02460 if (_nr_rows == 3) { 02461 _writeCommand(0x14); // Double Height, 0 0 0 1 UD2=0, UD1=1, X, DH'=0 (Ext Instr Set) 02462 } 02463 else { 02464 _writeCommand(0x10); // Double Height, 0 0 0 1 UD2=0, UD1=0, X, DH'=0 (Ext Instr Set) 02465 } 02466 _function = _function | 0x04; // Set function, 0 0 1 DL N DH=1 RE(0) IS=0 Select Instruction Set 0 02467 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0 02468 // Select Std Instr set, Select IS=0 02469 break; // end US2066, SSD1803 02470 02471 default: 02472 break; // end default 02473 } // end switch _ctrl 02474 break; // end BottomLine 02475 02476 case TopBottomLine: 02477 if (_nr_rows != 4) return; //Sanity check 02478 02479 switch (_ctrl) { 02480 case SSD1803_3V3 : 02481 case US2066_3V3 : 02482 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV 02483 // Select Extended Instruction Set 02484 _writeCommand(0x18); // Double Height, 0 0 0 1 UD2=1, UD1=0, X, DH'=0 (Ext Instr Set) 02485 // Default 02486 _function = _function | 0x04; // Set function, 0 0 1 DL N DH=1 RE(0) IS=0 Select Instruction Set 0 02487 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0 02488 // Select Std Instr set, Select IS=0 02489 break; // end US2066, SSD1803 02490 02491 default: 02492 break; // end default 02493 } // end switch _ctrl 02494 break; // end TopBottomLine 02495 02496 } // end switch lines 02497 02498 } // end setBigFont() 02499 #endif 02500 02501 #if(LCD_ICON==1) 02502 /** Set Icons 02503 * 02504 * @param unsigned char idx The Index of the icon pattern (0..15) for KS0073 and similar controllers 02505 * and Index (0..31) for PCF2103 and similar controllers 02506 * @param unsigned char data The bitpattern for the icons (6 lsb for KS0073 bitpattern (5 lsb for KS0078) and 2 msb for blinkmode) 02507 * The bitpattern for the PCF2103 icons is 5 lsb (UDC 0..2) and 5 lsb for blinkmode (UDC 4..6) 02508 */ 02509 void TextLCD_Base::setIcon(unsigned char idx, unsigned char data) { 02510 // Blinking icons are enabled when a specific controlbit (BE) is set. 02511 // The blinking pixels in the icons can be controlled by setting additional bits in the icon bitpattern. 02512 // Icons are defined by a byte bitpattern. The P0..P5 form the Icon pattern for KS0073, and P0..P4 for KS0078 02513 // P7 P6 P5 P4 P3 P2 P1 P0 02514 // 0 B1 B0 0 0 1 1 1 0 02515 // 1 B1 B0 1 1 0 0 0 1 02516 // ............. 02517 // 15 B1 B0 1 1 0 0 0 1 02518 // 02519 // Bit 6 and Bit 7 in the pattern will control the blinking mode when Blink is enabled through BE. 02520 // B1 B0 Mode 02521 // 0 0 No Blinking for this icon row 02522 // 0 1 Enabled pixels in P5 will blink 02523 // 1 x Enabled pixels in P0..P5 will blink 02524 // 02525 // Note: the PCF2103 and PCF2113 use UDCs to set Icons 02526 // 3 x 8 rows x 5 bits = 120 bits Icons for Normal pattern (UDC 0..2) and 02527 // 3 x 8 rows x 5 bits = 120 bits Icons for Blink pattern (UDC 4..6) 02528 // Note: the PCF2119 uses UDCs to set Icons 02529 // 4 x 8 rows x 5 bits = 160 bits Icons for Normal pattern (UDC 0..3) and 02530 // 4 x 8 rows x 5 bits = 160 bits Icons for Blink pattern (UDC 4..7) 02531 02532 switch (_ctrl) { 02533 case KS0073: 02534 case KS0078: 02535 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 DL N RE(1) BE LP 02536 // Select Extended Instruction Set 02537 _writeCommand(0x40 | (idx & 0x0F)); // Set Icon Address, mask Address to valid range (Ext Instr Set) 02538 02539 _writeData(data); // Set Icon pattern (Ext Instr Set) 02540 02541 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N RE(0) DH REV Select Instruction Set 0 02542 // Select Std Instr set, Select IS=0 02543 break; // end KS0073, KS0078 02544 02545 case ST7032_3V3: 02546 case ST7032_5V: 02547 _writeCommand(0x20 | _function | 0x01); // Set function, 0 0 1 DL N F 0 IS=1 Select Instr Set = 1 02548 _writeCommand(0x40 | (idx & 0x0F)); // Set Icon Address, mask Address to valid range (Instr Set 1) 02549 02550 _writeData(data & 0x1F); // Set Icon pattern, no blink support (Instr Set 1) 02551 02552 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N RE(0) DH REV Select Instruction Set 0 02553 // Select Std Instr set, Select IS=0 02554 break; // end ST7032 02555 02556 case ST7036_3V3: 02557 case ST7036_5V: 02558 _writeCommand(0x20 | _function | 0x01); // Set function, 0 0 1 DL N DH IS2,IS1 = 01 (Select Instr Set = 1) 02559 _writeCommand(0x40 | (idx & 0x0F)); // Set Icon Address, mask Address to valid range (Instr Set 1) 02560 02561 _writeData(data & 0x1F); // Set Icon pattern, no blink support (Instr Set 1) 02562 02563 _writeCommand(0x20 | _function); // Set function, IS2,IS1 = 00 (Select Instr Set = 0) 02564 // Select Std Instr set, Select IS=0 02565 break; // end ST7036 02566 02567 case SSD1803_3V3: 02568 // case SSD1803_5V: 02569 _writeCommand(0x20 | _function | 0x01); // Set function, 0 0 1 DL N DH RE(0) IS 02570 // Select Instruction Set 1 02571 _writeCommand(0x40 | (idx & 0x0F)); // Set Icon Address, mask Address to valid range (Instr Set = 1) 02572 _writeData(data); // Set Icon pattern (Instr Set = 1) 02573 02574 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS 02575 // Select IS=0 02576 break; // end SSD1803 02577 02578 case PCF2103_3V3: 02579 case PCF2113_3V3: 02580 case PCF2119_3V3: 02581 case PCF2119R_3V3: 02582 // Store UDC/Icon pattern for PCF2103 and PCF2113: 02583 // 3 x 8 rows x 5 bits = 120 bits for Normal pattern (UDC 0..2) and 02584 // 3 x 8 rows x 5 bits = 120 bits for Blink pattern (UDC 4..6) 02585 // Store UDC/Icon pattern for PCF2119: 02586 // 4 x 8 rows x 5 bits = 160 bits for Normal pattern (UDC 0..3) and 02587 // 4 x 8 rows x 5 bits = 160 bits for Blink pattern (UDC 4..7) 02588 _writeCommand(0x40 | (idx & 0x3F)); //Set CG-RAM address, 8 sequential locations needed per UDC 02589 _writeData(data); // Set Icon pattern (Instr Set = 1) 02590 break; // case PCF2103_3V3 Controller 02591 02592 default: 02593 break; // end default 02594 } // end switch _ctrl 02595 02596 //Select DD RAM again for current LCD controller and restore the addresspointer 02597 int addr = getAddress(_column, _row); 02598 _writeCommand(0x80 | addr); 02599 02600 } // end setIcon() 02601 02602 /** Clear Icons 02603 * 02604 * @param none 02605 * @return none 02606 */ 02607 //@TODO Add support for 40x4 dual controller 02608 void TextLCD_Base::clrIcon() { 02609 // Icons are defined by a byte bitpattern. The P0..P5 form the Icon pattern for KS0073, and P0..P4 for KS0078 02610 // P7 P6 P5 P4 P3 P2 P1 P0 02611 // 0 B1 B0 0 0 0 0 0 0 02612 // 1 B1 B0 0 0 0 0 0 0 02613 // ............. 02614 // 15 B1 B0 0 0 0 0 0 0 02615 // 02616 // Bit 6 and Bit 7 in the pattern will control the blinking mode when Blink is enabled through BE. 02617 // B1 B0 Mode 02618 // 0 0 No Blinking for this icon row 02619 // 0 1 Enabled pixels in P5 will blink 02620 // 1 x Enabled pixels in P0..P5 will blink 02621 // 02622 // Note: the PCF2103 and PCF2113 use UDCs to set Icons 02623 // 3 x 8 rows x 5 bits = 120 bits Icons for Normal pattern (UDC 0..2) and 02624 // 3 x 8 rows x 5 bits = 120 bits Icons for Blink pattern (UDC 4..6) 02625 // Note: the PCF2119 uses UDCs to set Icons 02626 // 4 x 8 rows x 5 bits = 160 bits Icons for Normal pattern (UDC 0..3) and 02627 // 4 x 8 rows x 5 bits = 160 bits Icons for Blink pattern (UDC 4..7) 02628 int idx; 02629 02630 switch (_ctrl) { 02631 case KS0073: 02632 case KS0078: 02633 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 DL N RE(1) BE LP 02634 // Select Extended Instruction Set 02635 for (idx=0; idx<16; idx++) { 02636 _writeCommand(0x40 | idx); // Set Icon Address, mask Address to valid range (Ext Instr Set) 02637 _writeData(0x00); // Clear Icon pattern (Ext Instr Set) 02638 } 02639 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N RE(0) DH REV Select Std Instruction Set 02640 // Select Std Instr set 02641 break; // end KS0073, KS0078 02642 02643 case ST7032_3V3: 02644 case ST7032_5V: 02645 _writeCommand(0x20 | _function | 0x01); // Set function, 0 0 1 DL N F 0 IS=1 Select Instr Set = 1 02646 02647 for (idx=0; idx<16; idx++) { 02648 _writeCommand(0x40 | idx); // Set Icon Address, mask Address to valid range (Instr Set 1) 02649 _writeData(0x00); // Clear Icon pattern (Instr Set 1) 02650 } 02651 02652 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N RE(0) DH REV Select Instruction Set 0 02653 // Select Std Instr set, Select IS=0 02654 break; // end ST7032 02655 02656 case ST7036_3V3: 02657 case ST7036_5V: 02658 _writeCommand(0x20 | _function | 0x01); // Set function, 0 0 1 DL N DH IS2,IS1 = 01 (Select Instr Set = 1) 02659 02660 for (idx=0; idx<16; idx++) { 02661 _writeCommand(0x40 | idx); // Set Icon Address, mask Address to valid range (Instr Set 1) 02662 _writeData(0x00); // Clear Icon pattern (Instr Set 1) 02663 } 02664 02665 _writeCommand(0x20 | _function); // Set function, IS2,IS1 = 00 (Select Instr Set = 0) 02666 // Select Std Instr set, Select IS=0 02667 break; // end ST7036 02668 02669 case SSD1803_3V3: 02670 // case SSD1803_5V: 02671 _writeCommand(0x20 | _function | 0x01); // Set function, 0 0 1 DL N DH RE(0) IS 02672 // Select Instruction Set 1 02673 for (idx=0; idx<16; idx++) { 02674 _writeCommand(0x40 | idx); // Set Icon Address, mask Address to valid range (Ext Instr Set) 02675 _writeData(0x00); // Clear Icon pattern (Ext Instr Set) 02676 } 02677 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS 02678 // Select IS=0 02679 break; // end SSD1803 02680 02681 case PCF2103_3V3: 02682 case PCF2113_3V3: 02683 // PCF2103 and PCF2113 use part of the UDC RAM to control Icons 02684 // Select CG RAM 02685 02686 _writeCommand(0x40 | (0 * 8)); //Set CG-RAM address, 8 sequential locations needed per UDC 02687 // Store UDC/Icon pattern: 02688 // 3 x 8 rows x 5 bits = 120 bits for Normal pattern (UDC 0..2) and 02689 for (int i=0; i<(3 * 8); i++) { 02690 // _writeData(0x1F); // All On 02691 _writeData(0x00); // All Off 02692 } 02693 02694 _writeCommand(0x40 | (4 * 8)); //Set CG-RAM address, 8 sequential locations needed per UDC 02695 // 3 x 8 rows x 5 bits = 120 bits for Blink pattern (UDC 4..6) 02696 for (int i=0; i<(3 * 8); i++) { 02697 // _writeData(0x1F); // All On 02698 _writeData(0x00); // All Off 02699 } 02700 break; // case PCF2103_3V3 Controller 02701 02702 case PCF2119_3V3: 02703 case PCF2119R_3V3: 02704 // PCF2119 uses part of the UDC RAM to control Icons 02705 // Select CG RAM 02706 02707 _writeCommand(0x40 | (0 * 8)); //Set CG-RAM address, 8 sequential locations needed per UDC 02708 // Store UDC/Icon pattern: 02709 // 4 x 8 rows x 5 bits = 160 bits for Normal pattern (UDC 0..3) and 02710 for (int i=0; i<(4 * 8); i++) { 02711 // _writeData(0x1F); // All On 02712 _writeData(0x00); // All Off 02713 } 02714 02715 _writeCommand(0x40 | (4 * 8)); //Set CG-RAM address, 8 sequential locations needed per UDC 02716 // 4 x 8 rows x 5 bits = 160 bits for Blink pattern (UDC 4..7) 02717 for (int i=0; i<(4 * 8); i++) { 02718 // _writeData(0x1F); // All On 02719 _writeData(0x00); // All Off 02720 } 02721 break; // case PCF2119_3V3 Controller 02722 02723 default: 02724 break; // end default 02725 } // end switch _ctrl 02726 02727 //Select DD RAM again for current LCD controller and restore the addresspointer 02728 int addr = getAddress(_column, _row); 02729 _writeCommand(0x80 | addr); 02730 } //end clrIcon() 02731 #endif 02732 02733 #if(LCD_INVERT == 1) 02734 /** Set Invert 02735 * setInvert method is supported by some compatible devices (eg KS0073) to swap between black and white 02736 * 02737 * @param bool invertOn Invert on/off 02738 * @return none 02739 */ 02740 //@TODO Add support for 40x4 dual controller 02741 void TextLCD_Base::setInvert(bool invertOn) { 02742 02743 if (invertOn) { 02744 // Controllers that support Invert 02745 switch (_ctrl) { 02746 case KS0073: 02747 case KS0078: 02748 _function = _function | 0x01; // Enable Invert 02749 _writeCommand(0x20 | _function); // Activate Invert (Std Instr Set) 02750 break; 02751 case SSD1803_3V3 : 02752 // case SSD1803_5V : 02753 case US2066_3V3: 02754 // case USS2066_5V: 02755 _function_1 = _function_1 | 0x01; // Enable Invert 02756 // Set function, 0 0 1 DL N BE RE(1) REV (SSD1803) 02757 // Set function, 0 0 1 X N BE RE(1) REV (US2066) 02758 _writeCommand(0x20 | _function_1); // Activate Invert (Ext Instr Set) 02759 _writeCommand(0x20 | _function); // Return to Std Instr Set 02760 break; 02761 default: 02762 //Unsupported feature for other controllers 02763 break; 02764 } // end switch 02765 } 02766 else { 02767 // Controllers that support Invert 02768 switch (_ctrl) { 02769 case KS0073: 02770 case KS0078: 02771 _function = _function & ~0x01; // Disable Invert 02772 _writeCommand(0x20 | _function); // Disable Invert (Std Instr Set) 02773 break; 02774 case SSD1803_3V3 : 02775 // case SSD1803_5V : 02776 case US2066_3V3: 02777 // case USS2066_5V: 02778 _function_1 = _function_1 & ~0x01; // Disable Invert 02779 // Set function, 0 0 1 DL N BE RE(1) REV (SSD1803) 02780 // Set function, 0 0 1 X N BE RE(1) REV (US2066) 02781 _writeCommand(0x20 | _function_1); // Activate Invert (Ext Instr Set) 02782 _writeCommand(0x20 | _function); // Return to Std Instr Set 02783 break; 02784 02785 default: 02786 //Unsupported feature for other controllers 02787 break; 02788 } // end switch 02789 } 02790 } // end setInvert() 02791 #endif 02792 02793 //--------- End TextLCD_Base ----------- 02794 02795 02796 //--------- Start TextLCD Bus ----------- 02797 02798 /* Create a TextLCD interface for using regular mbed pins 02799 * 02800 * @param rs Instruction/data control line 02801 * @param e Enable line (clock) 02802 * @param d4-d7 Data lines for using as a 4-bit interface 02803 * @param type Sets the panel size/addressing mode (default = LCD16x2) 02804 * @param bl Backlight control line (optional, default = NC) 02805 * @param e2 Enable2 line (clock for second controller, LCD40x4 only) 02806 * @param ctrl LCD controller (default = HD44780) 02807 */ 02808 TextLCD::TextLCD(PinName rs, PinName e, 02809 PinName d4, PinName d5, PinName d6, PinName d7, 02810 LCDType type, PinName bl, PinName e2, LCDCtrl ctrl) : 02811 TextLCD_Base(type, ctrl), 02812 _rs(rs), _e(e), _d(d4, d5, d6, d7) { 02813 02814 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access. 02815 if (bl != NC) { 02816 _bl = new DigitalOut(bl); //Construct new pin 02817 _bl->write(0); //Deactivate 02818 } 02819 else { 02820 // No Hardware Backlight pin 02821 _bl = NULL; //Construct dummy pin 02822 } 02823 02824 // The hardware Enable2 pin is only needed for LCD40x4. Test and make sure whether it exists or not to prevent illegal access. 02825 if (e2 != NC) { 02826 _e2 = new DigitalOut(e2); //Construct new pin 02827 _e2->write(0); //Deactivate 02828 } 02829 else { 02830 // No Hardware Enable pin 02831 _e2 = NULL; //Construct dummy pin 02832 } 02833 02834 _init(_LCD_DL_4); // Set Datalength to 4 bit for mbed bus interfaces 02835 } 02836 02837 /** Destruct a TextLCD interface for using regular mbed pins 02838 * 02839 * @param none 02840 * @return none 02841 */ 02842 TextLCD::~TextLCD() { 02843 if (_bl != NULL) {delete _bl;} // BL pin 02844 if (_e2 != NULL) {delete _e2;} // E2 pin 02845 } 02846 02847 /** Set E pin (or E2 pin) 02848 * Used for mbed pins, I2C bus expander or SPI shiftregister 02849 * Default PinName value for E2 is NC, must be used as pointer to avoid issues with mbed lib and DigitalOut pins 02850 * @param value true or false 02851 * @return none 02852 */ 02853 void TextLCD::_setEnable(bool value) { 02854 02855 if(_ctrl_idx==_LCDCtrl_0) { 02856 if (value) { 02857 _e = 1; // Set E bit 02858 } 02859 else { 02860 _e = 0; // Reset E bit 02861 } 02862 } 02863 else { 02864 if (value) { 02865 if (_e2 != NULL) {_e2->write(1);} //Set E2 bit 02866 } 02867 else { 02868 if (_e2 != NULL) {_e2->write(0);} //Reset E2 bit 02869 } 02870 } 02871 } 02872 02873 // Set RS pin 02874 // Used for mbed pins, I2C bus expander or SPI shiftregister 02875 void TextLCD::_setRS(bool value) { 02876 02877 if (value) { 02878 _rs = 1; // Set RS bit 02879 } 02880 else { 02881 _rs = 0; // Reset RS bit 02882 } 02883 } 02884 02885 /** Set BL pin 02886 * Used for mbed pins, I2C bus expander or SPI shiftregister 02887 * Default PinName value is NC, must be used as pointer to avoid issues with mbed lib and DigitalOut pins 02888 * @param value true or false 02889 * @return none 02890 */ 02891 void TextLCD::_setBL(bool value) { 02892 02893 if (value) { 02894 if (_bl != NULL) {_bl->write(1);} //Set BL bit 02895 } 02896 else { 02897 if (_bl != NULL) {_bl->write(0);} //Reset BL bit 02898 } 02899 } 02900 02901 // Place the 4bit data on the databus 02902 // Used for mbed pins, I2C bus expander or SPI shifregister 02903 void TextLCD::_setData(int value) { 02904 _d = value & 0x0F; // Write Databits 02905 } 02906 02907 //----------- End TextLCD --------------- 02908 02909 02910 //--------- Start TextLCD_I2C ----------- 02911 #if(LCD_I2C == 1) /* I2C Expander PCF8574/MCP23008 */ 02912 /** Create a TextLCD interface using an I2C PC8574 (or PCF8574A) or MCP23008 portexpander 02913 * 02914 * @param i2c I2C Bus 02915 * @param deviceAddress I2C slave address (PCF8574, PCF8574A or MCP23008, default = 0x40) 02916 * @param type Sets the panel size/addressing mode (default = LCD16x2) 02917 * @param ctrl LCD controller (default = HD44780) 02918 */ 02919 TextLCD_I2C::TextLCD_I2C(I2C *i2c, char deviceAddress, LCDType type, LCDCtrl ctrl) : 02920 TextLCD_Base(type, ctrl), 02921 _i2c(i2c){ 02922 02923 _slaveAddress = deviceAddress & 0xFE; 02924 02925 // Setup the I2C bus 02926 // The max bitrate for PCF8574 is 100kbit, the max bitrate for MCP23008 is 400kbit, 02927 _i2c->frequency(100000); 02928 02929 #if (MCP23008==1) 02930 // MCP23008 portexpander Init 02931 _writeRegister(IODIR, 0x00); // All pins are outputs 02932 _writeRegister(IPOL, 0x00); // No reverse polarity on inputs 02933 _writeRegister(GPINTEN, 0x00); // No interrupt on change of input pins 02934 _writeRegister(DEFVAL, 0x00); // Default value to compare against for interrupts 02935 _writeRegister(INTCON, 0x00); // No interrupt on changes, compare against previous pin value 02936 _writeRegister(IOCON, 0x20); // b1=0 - Interrupt polarity active low 02937 // b2=0 - Interrupt pin active driver output 02938 // b4=0 - Slew rate enable on SDA 02939 // b5=0 - Auto-increment on registeraddress 02940 // b5=1 - No auto-increment on registeraddress => needed for performance improved I2C expander mode 02941 _writeRegister(GPPU, 0x00); // No Pullup 02942 // INTF // Interrupt flags read (Read-Only) 02943 // INTCAP // Captured inputpins at time of interrupt (Read-Only) 02944 // _writeRegister(GPIO, 0x00); // Output/Input pins 02945 // _writeRegister(OLAT, 0x00); // Output Latch 02946 02947 // Init the portexpander bus 02948 _lcd_bus = LCD_BUS_I2C_DEF; 02949 02950 // write the new data to the portexpander 02951 _writeRegister(GPIO, _lcd_bus); 02952 #else 02953 // PCF8574 of PCF8574A portexpander 02954 02955 // Init the portexpander bus 02956 _lcd_bus = LCD_BUS_I2C_DEF; 02957 02958 // write the new data to the portexpander 02959 _i2c->write(_slaveAddress, &_lcd_bus, 1); 02960 #endif 02961 02962 _init(_LCD_DL_4); // Set Datalength to 4 bit for all serial expander interfaces 02963 } 02964 02965 // Set E bit (or E2 bit) in the databus shadowvalue 02966 // Used for mbed I2C bus expander 02967 void TextLCD_I2C::_setEnableBit(bool value) { 02968 02969 if(_ctrl_idx==_LCDCtrl_0) { 02970 if (value) { 02971 _lcd_bus |= LCD_BUS_I2C_E; // Set E bit 02972 } 02973 else { 02974 _lcd_bus &= ~LCD_BUS_I2C_E; // Reset E bit 02975 } 02976 } 02977 else { 02978 if (value) { 02979 _lcd_bus |= LCD_BUS_I2C_E2; // Set E2 bit 02980 } 02981 else { 02982 _lcd_bus &= ~LCD_BUS_I2C_E2; // Reset E2bit 02983 } 02984 } 02985 } 02986 02987 // Set E pin (or E2 pin) 02988 // Used for mbed pins, I2C bus expander or SPI shiftregister 02989 void TextLCD_I2C::_setEnable(bool value) { 02990 02991 // Place the E or E2 bit data on the databus shadowvalue 02992 _setEnableBit(value); 02993 02994 #if (MCP23008==1) 02995 // MCP23008 portexpander 02996 02997 // write the new data to the portexpander 02998 _writeRegister(GPIO, _lcd_bus); 02999 #else 03000 // PCF8574 of PCF8574A portexpander 03001 03002 // write the new data to the I2C portexpander 03003 _i2c->write(_slaveAddress, &_lcd_bus, 1); 03004 #endif 03005 } 03006 03007 03008 // Set RS pin 03009 // Used for mbed pins, I2C bus expander or SPI shiftregister 03010 void TextLCD_I2C::_setRS(bool value) { 03011 03012 if (value) { 03013 _lcd_bus |= LCD_BUS_I2C_RS; // Set RS bit 03014 } 03015 else { 03016 _lcd_bus &= ~LCD_BUS_I2C_RS; // Reset RS bit 03017 } 03018 03019 #if (MCP23008==1) 03020 // MCP23008 portexpander 03021 03022 // write the new data to the portexpander 03023 _writeRegister(GPIO, _lcd_bus); 03024 #else 03025 // PCF8574 of PCF8574A portexpander 03026 03027 // write the new data to the I2C portexpander 03028 _i2c->write(_slaveAddress, &_lcd_bus, 1); 03029 #endif 03030 } 03031 03032 // Set BL pin 03033 // Used for mbed pins, I2C bus expander or SPI shiftregister 03034 void TextLCD_I2C::_setBL(bool value) { 03035 03036 if (value) { 03037 _lcd_bus |= LCD_BUS_I2C_BL; // Set BL bit 03038 } 03039 else { 03040 _lcd_bus &= ~LCD_BUS_I2C_BL; // Reset BL bit 03041 } 03042 03043 #if (MCP23008==1) 03044 // MCP23008 portexpander 03045 03046 // write the new data to the portexpander 03047 _writeRegister(GPIO, _lcd_bus); 03048 #else 03049 // PCF8574 of PCF8574A portexpander 03050 03051 // write the new data to the I2C portexpander 03052 _i2c->write(_slaveAddress, &_lcd_bus, 1); 03053 #endif 03054 } 03055 03056 #if(0) 03057 // New optimized v018 03058 // Test faster _writeByte 0.11s vs 0.27s for a 20x4 fillscreen (PCF8574), same as v018 03059 // Place the 4bit data in the databus shadowvalue 03060 // Used for mbed I2C bus expander 03061 const char _LCD_DATA_BITS[16] = { 03062 0x00, 03063 ( LCD_BUS_I2C_D4), 03064 ( LCD_BUS_I2C_D5 ), 03065 ( LCD_BUS_I2C_D5 | LCD_BUS_I2C_D4), 03066 ( LCD_BUS_I2C_D6 ), 03067 ( LCD_BUS_I2C_D6 | LCD_BUS_I2C_D4), 03068 ( LCD_BUS_I2C_D6 | LCD_BUS_I2C_D5 ), 03069 ( LCD_BUS_I2C_D6 | LCD_BUS_I2C_D5 | LCD_BUS_I2C_D4), 03070 (LCD_BUS_I2C_D7 ), 03071 (LCD_BUS_I2C_D7 | LCD_BUS_I2C_D4), 03072 (LCD_BUS_I2C_D7 | LCD_BUS_I2C_D5 ), 03073 (LCD_BUS_I2C_D7 | LCD_BUS_I2C_D5 | LCD_BUS_I2C_D4), 03074 (LCD_BUS_I2C_D7 | LCD_BUS_I2C_D6 ), 03075 (LCD_BUS_I2C_D7 | LCD_BUS_I2C_D6 | LCD_BUS_I2C_D4), 03076 (LCD_BUS_I2C_D7 | LCD_BUS_I2C_D6 | LCD_BUS_I2C_D5 ), 03077 (LCD_BUS_I2C_D7 | LCD_BUS_I2C_D6 | LCD_BUS_I2C_D5 | LCD_BUS_I2C_D4) 03078 }; 03079 void TextLCD_I2C::_setDataBits(int value) { 03080 03081 //Clear all databits 03082 _lcd_bus &= ~LCD_BUS_I2C_MSK; 03083 03084 // Set bit by bit to support any mapping of expander portpins to LCD pins 03085 _lcd_bus |= _LCD_DATA_BITS[value & 0x0F]; 03086 } 03087 #endif 03088 03089 #if(0) 03090 //orig v017 03091 // Test faster _writeByte 0.11s vs 0.27s for a 20x4 fillscreen (PCF8574) 03092 // Place the 4bit data in the databus shadowvalue 03093 // Used for mbed I2C bus expander 03094 void TextLCD_I2C::_setDataBits(int value) { 03095 03096 // Set bit by bit to support any mapping of expander portpins to LCD pins 03097 if (value & 0x01){ 03098 _lcd_bus |= LCD_BUS_I2C_D4; // Set Databit 03099 } 03100 else { 03101 _lcd_bus &= ~LCD_BUS_I2C_D4; // Reset Databit 03102 } 03103 03104 if (value & 0x02){ 03105 _lcd_bus |= LCD_BUS_I2C_D5; // Set Databit 03106 } 03107 else { 03108 _lcd_bus &= ~LCD_BUS_I2C_D5; // Reset Databit 03109 } 03110 03111 if (value & 0x04) { 03112 _lcd_bus |= LCD_BUS_I2C_D6; // Set Databit 03113 } 03114 else { 03115 _lcd_bus &= ~LCD_BUS_I2C_D6; // Reset Databit 03116 } 03117 03118 if (value & 0x08) { 03119 _lcd_bus |= LCD_BUS_I2C_D7; // Set Databit 03120 } 03121 else { 03122 _lcd_bus &= ~LCD_BUS_I2C_D7; // Reset Databit 03123 } 03124 } 03125 #endif 03126 03127 #if(1) 03128 //orig v017, with optimised codesize 03129 // Test faster _writeByte 0.11s vs 0.27s for a 20x4 fillscreen (PCF8574) 03130 // Place the 4bit data in the databus shadowvalue 03131 // Used for mbed I2C bus expander 03132 void TextLCD_I2C::_setDataBits(int value) { 03133 03134 //Clear all databits 03135 _lcd_bus &= ~LCD_BUS_I2C_MSK; 03136 03137 // Set bit by bit to support any mapping of expander portpins to LCD pins 03138 if (value & 0x01){ 03139 _lcd_bus |= LCD_BUS_I2C_D4; // Set Databit 03140 } 03141 03142 if (value & 0x02){ 03143 _lcd_bus |= LCD_BUS_I2C_D5; // Set Databit 03144 } 03145 03146 if (value & 0x04) { 03147 _lcd_bus |= LCD_BUS_I2C_D6; // Set Databit 03148 } 03149 03150 if (value & 0x08) { 03151 _lcd_bus |= LCD_BUS_I2C_D7; // Set Databit 03152 } 03153 } 03154 #endif 03155 03156 // Place the 4bit data on the databus 03157 // Used for mbed pins, I2C bus expander or SPI shifregister 03158 void TextLCD_I2C::_setData(int value) { 03159 03160 // Place the 4bit data on the databus shadowvalue 03161 _setDataBits(value); 03162 03163 // Place the 4bit data on the databus 03164 #if (MCP23008==1) 03165 // MCP23008 portexpander 03166 03167 // write the new data to the portexpander 03168 _writeRegister(GPIO, _lcd_bus); 03169 #else 03170 // PCF8574 of PCF8574A portexpander 03171 03172 // write the new data to the I2C portexpander 03173 _i2c->write(_slaveAddress, &_lcd_bus, 1); 03174 #endif 03175 } 03176 03177 // Write data to MCP23008 I2C portexpander 03178 // Used for mbed I2C bus expander 03179 void TextLCD_I2C::_writeRegister (int reg, int value) { 03180 char data[] = {reg, value}; 03181 03182 _i2c->write(_slaveAddress, data, 2); 03183 } 03184 03185 //New optimized 03186 //Test faster _writeByte 0.11s vs 0.27s for a 20x4 fillscreen (PCF8574) 03187 //Test faster _writeByte 0.14s vs 0.34s for a 20x4 fillscreen (MCP23008) 03188 03189 // Write a byte using I2C 03190 void TextLCD_I2C::_writeByte(int value) { 03191 char data[6]; 03192 03193 #if (MCP23008==1) 03194 // MCP23008 portexpander 03195 03196 data[0] = GPIO; // set registeraddres 03197 // Note: auto-increment is disabled so all data will go to GPIO register 03198 03199 _setEnableBit(true); // set E 03200 _setDataBits(value >> 4); // set data high 03201 data[1] = _lcd_bus; 03202 03203 _setEnableBit(false); // clear E 03204 data[2] = _lcd_bus; 03205 03206 _setEnableBit(true); // set E 03207 _setDataBits(value); // set data low 03208 data[3] = _lcd_bus; 03209 03210 _setEnableBit(false); // clear E 03211 data[4] = _lcd_bus; 03212 03213 // write the packed data to the I2C portexpander 03214 _i2c->write(_slaveAddress, data, 5); 03215 #else 03216 // PCF8574 of PCF8574A portexpander 03217 03218 _setEnableBit(true); // set E 03219 _setDataBits(value >> 4); // set data high 03220 data[0] = _lcd_bus; 03221 03222 _setEnableBit(false); // clear E 03223 data[1] = _lcd_bus; 03224 03225 _setEnableBit(true); // set E 03226 _setDataBits(value); // set data low 03227 data[2] = _lcd_bus; 03228 03229 _setEnableBit(false); // clear E 03230 data[3] = _lcd_bus; 03231 03232 // write the packed data to the I2C portexpander 03233 _i2c->write(_slaveAddress, data, 4); 03234 #endif 03235 } 03236 03237 #endif /* I2C Expander PCF8574/MCP23008 */ 03238 //---------- End TextLCD_I2C ------------ 03239 03240 03241 //--------- Start TextLCD_SPI ----------- 03242 #if(LCD_SPI == 1) /* SPI Expander SN74595 */ 03243 03244 /** Create a TextLCD interface using an SPI 74595 portexpander 03245 * 03246 * @param spi SPI Bus 03247 * @param cs chip select pin (active low) 03248 * @param type Sets the panel size/addressing mode (default = LCD16x2) 03249 * @param ctrl LCD controller (default = HD44780) 03250 */ 03251 TextLCD_SPI::TextLCD_SPI(SPI *spi, PinName cs, LCDType type, LCDCtrl ctrl) : 03252 TextLCD_Base(type, ctrl), 03253 _spi(spi), 03254 _cs(cs) { 03255 // Init cs 03256 _cs = 1; 03257 03258 // Setup the spi for 8 bit data, low steady state clock, 03259 // rising edge capture, with a 500KHz or 1MHz clock rate 03260 _spi->format(8,0); 03261 _spi->frequency(500000); 03262 //_spi.frequency(1000000); 03263 03264 wait_ms(100); // Wait 100ms to ensure LCD powered up 03265 03266 // Init the portexpander bus 03267 _lcd_bus = LCD_BUS_SPI_DEF; 03268 03269 // write the new data to the portexpander 03270 _cs = 0; 03271 _spi->write(_lcd_bus); 03272 _cs = 1; 03273 03274 _init(_LCD_DL_4); // Set Datalength to 4 bit for all serial expander interfaces 03275 } 03276 03277 // Set E pin (or E2 pin) 03278 // Used for mbed pins, I2C bus expander or SPI shiftregister 03279 void TextLCD_SPI::_setEnable(bool value) { 03280 03281 if(_ctrl_idx==_LCDCtrl_0) { 03282 if (value) { 03283 _lcd_bus |= LCD_BUS_SPI_E; // Set E bit 03284 } 03285 else { 03286 _lcd_bus &= ~LCD_BUS_SPI_E; // Reset E bit 03287 } 03288 } 03289 else { 03290 if (value) { 03291 _lcd_bus |= LCD_BUS_SPI_E2; // Set E2 bit 03292 } 03293 else { 03294 _lcd_bus &= ~LCD_BUS_SPI_E2; // Reset E2 bit 03295 } 03296 } 03297 03298 // write the new data to the SPI portexpander 03299 _cs = 0; 03300 _spi->write(_lcd_bus); 03301 _cs = 1; 03302 } 03303 03304 // Set RS pin 03305 // Used for mbed pins, I2C bus expander or SPI shiftregister and SPI_N 03306 void TextLCD_SPI::_setRS(bool value) { 03307 03308 if (value) { 03309 _lcd_bus |= LCD_BUS_SPI_RS; // Set RS bit 03310 } 03311 else { 03312 _lcd_bus &= ~LCD_BUS_SPI_RS; // Reset RS bit 03313 } 03314 03315 // write the new data to the SPI portexpander 03316 _cs = 0; 03317 _spi->write(_lcd_bus); 03318 _cs = 1; 03319 } 03320 03321 // Set BL pin 03322 // Used for mbed pins, I2C bus expander or SPI shiftregister 03323 void TextLCD_SPI::_setBL(bool value) { 03324 03325 if (value) { 03326 _lcd_bus |= LCD_BUS_SPI_BL; // Set BL bit 03327 } 03328 else { 03329 _lcd_bus &= ~LCD_BUS_SPI_BL; // Reset BL bit 03330 } 03331 03332 // write the new data to the SPI portexpander 03333 _cs = 0; 03334 _spi->write(_lcd_bus); 03335 _cs = 1; 03336 } 03337 03338 // Place the 4bit data on the databus 03339 // Used for mbed pins, I2C bus expander or SPI shiftregister 03340 void TextLCD_SPI::_setData(int value) { 03341 03342 // Set bit by bit to support any mapping of expander portpins to LCD pins 03343 if (value & 0x01) { 03344 _lcd_bus |= LCD_BUS_SPI_D4; // Set Databit 03345 } 03346 else { 03347 _lcd_bus &= ~LCD_BUS_SPI_D4; // Reset Databit 03348 } 03349 03350 if (value & 0x02) { 03351 _lcd_bus |= LCD_BUS_SPI_D5; // Set Databit 03352 } 03353 else { 03354 _lcd_bus &= ~LCD_BUS_SPI_D5; // Reset Databit 03355 } 03356 03357 if (value & 0x04) { 03358 _lcd_bus |= LCD_BUS_SPI_D6; // Set Databit 03359 } 03360 else { 03361 _lcd_bus &= ~LCD_BUS_SPI_D6; // Reset Databit 03362 } 03363 03364 if (value & 0x08) { 03365 _lcd_bus |= LCD_BUS_SPI_D7; // Set Databit 03366 } 03367 else { 03368 _lcd_bus &= ~LCD_BUS_SPI_D7; // Reset Databit 03369 } 03370 03371 // write the new data to the SPI portexpander 03372 _cs = 0; 03373 _spi->write(_lcd_bus); 03374 _cs = 1; 03375 } 03376 03377 #endif /* SPI Expander SN74595 */ 03378 //---------- End TextLCD_SPI ------------ 03379 03380 03381 //--------- Start TextLCD_I2C_N --------- 03382 #if(LCD_I2C_N == 1) /* Native I2C */ 03383 03384 /** Create a TextLCD interface using a controller with native I2C interface 03385 * 03386 * @param i2c I2C Bus 03387 * @param deviceAddress I2C slave address (default = 0x7C) 03388 * @param type Sets the panel size/addressing mode (default = LCD16x2) 03389 * @param bl Backlight control line (optional, default = NC) 03390 * @param ctrl LCD controller (default = ST7032_3V3) 03391 */ 03392 TextLCD_I2C_N::TextLCD_I2C_N(I2C *i2c, char deviceAddress, LCDType type, PinName bl, LCDCtrl ctrl) : 03393 TextLCD_Base(type, ctrl), 03394 03395 _i2c(i2c){ 03396 03397 _slaveAddress = deviceAddress & 0xFE; 03398 03399 // Setup the I2C bus 03400 // The max bitrate for ST7032i is 400kbit, lets stick to default here 03401 _i2c->frequency(100000); 03402 03403 03404 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access. 03405 if (bl != NC) { 03406 _bl = new DigitalOut(bl); //Construct new pin 03407 _bl->write(0); //Deactivate 03408 } 03409 else { 03410 // No Hardware Backlight pin 03411 _bl = NULL; //Construct dummy pin 03412 } 03413 03414 //Sanity check 03415 if (_ctrl & LCD_C_I2C) { 03416 _init(_LCD_DL_8); // Set Datalength to 8 bit for all native serial interfaces 03417 } 03418 else { 03419 error("Error: LCD Controller type does not support native I2C interface\n\r"); 03420 } 03421 } 03422 03423 TextLCD_I2C_N::~TextLCD_I2C_N() { 03424 if (_bl != NULL) {delete _bl;} // BL pin 03425 } 03426 03427 // Not used in this mode 03428 void TextLCD_I2C_N::_setEnable(bool value) { 03429 } 03430 03431 // Set RS pin 03432 // Used for mbed pins, I2C bus expander or SPI shiftregister and native I2C or SPI 03433 void TextLCD_I2C_N::_setRS(bool value) { 03434 // The controlbyte defines the meaning of the next byte. This next byte can either be data or command. 03435 // Start Slaveaddress+RW b7 b6 b5 b4 b3 b2 b1 b0 b7...........b0 Stop 03436 // Co RS RW 0 0 0 0 0 command or data 03437 // 03438 // C0=1 indicates that another controlbyte will follow after the next data or command byte 03439 // RS=1 means that next byte is data, RS=0 means that next byte is command 03440 // RW=0 means write to controller. RW=1 means that controller will be read from after the next command. 03441 // Many native I2C controllers dont support this option and it is not used by this lib. 03442 // 03443 03444 if (value) { 03445 _controlbyte = 0x40; // Next byte is data, No more control bytes will follow 03446 } 03447 else { 03448 _controlbyte = 0x00; // Next byte is command, No more control bytes will follow 03449 } 03450 } 03451 03452 // Set BL pin 03453 void TextLCD_I2C_N::_setBL(bool value) { 03454 if (_bl) { 03455 _bl->write(value); 03456 } 03457 } 03458 03459 // Not used in this mode 03460 void TextLCD_I2C_N::_setData(int value) { 03461 } 03462 03463 // Write a byte using I2C 03464 void TextLCD_I2C_N::_writeByte(int value) { 03465 // The controlbyte defines the meaning of the next byte. This next byte can either be data or command. 03466 // Start Slaveaddress+RW b7 b6 b5 b4 b3 b2 b1 b0 b7...........b0 Stop 03467 // Co RS RW 0 0 0 0 0 command or data 03468 // 03469 // C0=1 indicates that another controlbyte will follow after the next data or command byte 03470 // RS=1 means that next byte is data, RS=0 means that next byte is command 03471 // RW=0 means write to controller. RW=1 means that controller will be read from after the next command. 03472 // Many native I2C controllers dont support this option and it is not used by this lib. 03473 // 03474 char data[] = {_controlbyte, value}; 03475 03476 #if(LCD_I2C_ACK==1) 03477 //Controllers that support ACK 03478 _i2c->write(_slaveAddress, data, 2); 03479 #else 03480 //Controllers that dont support ACK 03481 //Note: This may be issue with some mbed platforms that dont fully/correctly support I2C byte operations. 03482 _i2c->start(); 03483 _i2c->write(_slaveAddress); 03484 _i2c->write(data[0]); 03485 _i2c->write(data[1]); 03486 _i2c->stop(); 03487 #endif 03488 } 03489 #endif /* Native I2C */ 03490 //-------- End TextLCD_I2C_N ------------ 03491 03492 03493 //--------- Start TextLCD_SPI_N --------- 03494 #if(LCD_SPI_N == 1) /* Native SPI bus */ 03495 /** Create a TextLCD interface using a controller with a native SPI4 interface 03496 * 03497 * @param spi SPI Bus 03498 * @param cs chip select pin (active low) 03499 * @param rs Instruction/data control line 03500 * @param type Sets the panel size/addressing mode (default = LCD16x2) 03501 * @param bl Backlight control line (optional, default = NC) 03502 * @param ctrl LCD controller (default = ST7032_3V3) 03503 */ 03504 TextLCD_SPI_N::TextLCD_SPI_N(SPI *spi, PinName cs, PinName rs, LCDType type, PinName bl, LCDCtrl ctrl) : 03505 TextLCD_Base(type, ctrl), 03506 _spi(spi), 03507 _cs(cs), 03508 _rs(rs) { 03509 03510 // Init CS 03511 _cs = 1; 03512 03513 // Setup the spi for 8 bit data, high steady state clock, 03514 // rising edge capture, with a 500KHz or 1MHz clock rate 03515 // _spi->format(8,3); 03516 // _spi->frequency(500000); 03517 // _spi->frequency(1000000); 03518 03519 // Setup the spi for 8 bit data, low steady state clock, 03520 // rising edge capture, with a 500KHz or 1MHz clock rate 03521 _spi->format(8,0); 03522 // _spi->frequency(500000); 03523 _spi->frequency(1000000); 03524 03525 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access. 03526 if (bl != NC) { 03527 _bl = new DigitalOut(bl); //Construct new pin 03528 _bl->write(0); //Deactivate 03529 } 03530 else { 03531 // No Hardware Backlight pin 03532 _bl = NULL; //Construct dummy pin 03533 } 03534 03535 //Sanity check 03536 if (_ctrl & LCD_C_SPI4) { 03537 _init(_LCD_DL_8); // Set Datalength to 8 bit for all native serial interfaces 03538 // ST7070 must set datalength to 8 bits! 03539 } 03540 else { 03541 error("Error: LCD Controller type does not support native SPI4 interface\n\r"); 03542 } 03543 } 03544 03545 TextLCD_SPI_N::~TextLCD_SPI_N() { 03546 if (_bl != NULL) {delete _bl;} // BL pin 03547 } 03548 03549 // Not used in this mode 03550 void TextLCD_SPI_N::_setEnable(bool value) { 03551 } 03552 03553 // Set RS pin 03554 // Used for mbed pins, I2C bus expander or SPI shiftregister, SPI_N 03555 void TextLCD_SPI_N::_setRS(bool value) { 03556 _rs = value; 03557 } 03558 03559 // Set BL pin 03560 void TextLCD_SPI_N::_setBL(bool value) { 03561 if (_bl) { 03562 _bl->write(value); 03563 } 03564 } 03565 03566 // Not used in this mode 03567 void TextLCD_SPI_N::_setData(int value) { 03568 } 03569 03570 // Write a byte using SPI 03571 void TextLCD_SPI_N::_writeByte(int value) { 03572 _cs = 0; 03573 wait_us(1); 03574 _spi->write(value); 03575 wait_us(1); 03576 _cs = 1; 03577 } 03578 #endif /* Native SPI bus */ 03579 //-------- End TextLCD_SPI_N ------------ 03580 03581 03582 //-------- Start TextLCD_SPI_N_3_8 -------- 03583 #if(LCD_SPI_N_3_8 == 1) /* Native SPI bus */ 03584 03585 /** Create a TextLCD interface using a controller with a native SPI3 8 bits interface 03586 * This mode is supported by ST7070. Note that implementation in TexTLCD is not very efficient due to 03587 * structure of the TextLCD library: each databyte is written separately and requires a separate 'count command' set to 1 byte. 03588 * 03589 * @param spi SPI Bus 03590 * @param cs chip select pin (active low) 03591 * @param type Sets the panel size/addressing mode (default = LCD16x2) 03592 * @param bl Backlight control line (optional, default = NC) 03593 * @param ctrl LCD controller (default = ST7070) 03594 */ 03595 TextLCD_SPI_N_3_8::TextLCD_SPI_N_3_8(SPI *spi, PinName cs, LCDType type, PinName bl, LCDCtrl ctrl) : 03596 TextLCD_Base(type, ctrl), 03597 _spi(spi), 03598 _cs(cs) { 03599 03600 // Init CS 03601 _cs = 1; 03602 03603 // Setup the spi for 8 bit data, high steady state clock, 03604 // rising edge capture, with a 500KHz or 1MHz clock rate 03605 // _spi->format(8,3); 03606 // _spi->frequency(500000); 03607 // _spi->frequency(1000000); 03608 03609 // Setup the spi for 8 bit data, low steady state clock, 03610 // rising edge capture, with a 500KHz or 1MHz clock rate 03611 _spi->format(8,0); 03612 // _spi->frequency(500000); 03613 _spi->frequency(1000000); 03614 03615 03616 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access. 03617 if (bl != NC) { 03618 _bl = new DigitalOut(bl); //Construct new pin 03619 _bl->write(0); //Deactivate 03620 } 03621 else { 03622 // No Hardware Backlight pin 03623 _bl = NULL; //Construct dummy pin 03624 } 03625 03626 //Sanity check 03627 if (_ctrl & LCD_C_SPI3_8) { 03628 _init(_LCD_DL_8); // Set Datalength to 8 bit for all native serial interfaces 03629 } 03630 else { 03631 error("Error: LCD Controller type does not support native SPI3 8 bits interface\n\r"); 03632 } 03633 } 03634 03635 TextLCD_SPI_N_3_8::~TextLCD_SPI_N_3_8() { 03636 if (_bl != NULL) {delete _bl;} // BL pin 03637 } 03638 03639 // Not used in this mode 03640 void TextLCD_SPI_N_3_8::_setEnable(bool value) { 03641 } 03642 03643 // Used for mbed pins, I2C bus expander or SPI shiftregister, SPI_N 03644 // RS=1 means that next byte is data, RS=0 means that next byte is command 03645 void TextLCD_SPI_N_3_8::_setRS(bool value) { 03646 03647 if (value) { 03648 _controlbyte = 0x01; // Next byte is data, No more control bytes will follow 03649 } 03650 else { 03651 _controlbyte = 0x00; // Next byte is command, No more control bytes will follow 03652 } 03653 } 03654 03655 // Set BL pin 03656 void TextLCD_SPI_N_3_8::_setBL(bool value) { 03657 if (_bl) { 03658 _bl->write(value); 03659 } 03660 } 03661 03662 // Not used in this mode 03663 void TextLCD_SPI_N_3_8::_setData(int value) { 03664 } 03665 03666 // Write a byte using SPI3 8 bits mode (ST7070) 03667 void TextLCD_SPI_N_3_8::_writeByte(int value) { 03668 03669 if (_controlbyte == 0x00) { // Byte is command 03670 _cs = 0; 03671 wait_us(1); 03672 _spi->write(value); 03673 wait_us(1); 03674 _cs = 1; 03675 } 03676 else { // Byte is data 03677 // Select Extended Instr Set 03678 _cs = 0; 03679 wait_us(1); 03680 _spi->write(0x20 | _function | 0x04); // Set function, 0 0 1 DL N EXT=1 x x (Select Instr Set = 1)); 03681 wait_us(1); 03682 _cs = 1; 03683 03684 wait_us(40); // Wait until command has finished... 03685 03686 // Set Count to 1 databyte 03687 _cs = 0; 03688 wait_us(1); 03689 _spi->write(0x80); // Set display data length, 1 L6 L5 L4 L3 L2 L1 L0 (Instr Set = 1) 03690 wait_us(1); 03691 _cs = 1; 03692 03693 wait_us(40); 03694 03695 // Write 1 databyte 03696 _cs = 0; 03697 wait_us(1); 03698 _spi->write(value); // Write data (Instr Set = 1) 03699 wait_us(1); 03700 _cs = 1; 03701 03702 wait_us(40); 03703 03704 // Select Standard Instr Set 03705 _cs = 0; 03706 wait_us(1); 03707 _spi->write(0x20 | _function); // Set function, 0 0 1 DL N EXT=0 x x (Select Instr Set = 0)); 03708 wait_us(1); 03709 _cs = 1; 03710 } 03711 } 03712 #endif /* Native SPI bus */ 03713 //------- End TextLCD_SPI_N_3_8 ----------- 03714 03715 03716 //-------- Start TextLCD_SPI_N_3_9 -------- 03717 #if(LCD_SPI_N_3_9 == 1) /* Native SPI bus */ 03718 //Code checked out on logic analyser. Not yet tested on hardware.. 03719 03720 /** Create a TextLCD interface using a controller with a native SPI3 9 bits interface 03721 * 03722 * @param spi SPI Bus 03723 * @param cs chip select pin (active low) 03724 * @param type Sets the panel size/addressing mode (default = LCD16x2) 03725 * @param bl Backlight control line (optional, default = NC) 03726 * @param ctrl LCD controller (default = AIP31068) 03727 */ 03728 TextLCD_SPI_N_3_9::TextLCD_SPI_N_3_9(SPI *spi, PinName cs, LCDType type, PinName bl, LCDCtrl ctrl) : 03729 TextLCD_Base(type, ctrl), 03730 _spi(spi), 03731 _cs(cs) { 03732 03733 // Init CS 03734 _cs = 1; 03735 03736 // Setup the spi for 9 bit data, high steady state clock, 03737 // rising edge capture, with a 500KHz or 1MHz clock rate 03738 _spi->format(9,3); 03739 _spi->frequency(1000000); 03740 03741 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access. 03742 if (bl != NC) { 03743 _bl = new DigitalOut(bl); //Construct new pin 03744 _bl->write(0); //Deactivate 03745 } 03746 else { 03747 // No Hardware Backlight pin 03748 _bl = NULL; //Construct dummy pin 03749 } 03750 03751 //Sanity check 03752 if (_ctrl & LCD_C_SPI3_9) { 03753 _init(_LCD_DL_8); // Set Datalength to 8 bit for all native serial interfaces 03754 } 03755 else { 03756 error("Error: LCD Controller type does not support native SPI3 9 bits interface\n\r"); 03757 } 03758 } 03759 03760 TextLCD_SPI_N_3_9::~TextLCD_SPI_N_3_9() { 03761 if (_bl != NULL) {delete _bl;} // BL pin 03762 } 03763 03764 // Not used in this mode 03765 void TextLCD_SPI_N_3_9::_setEnable(bool value) { 03766 } 03767 03768 // Set RS pin 03769 // Used for mbed pins, I2C bus expander or SPI shiftregister 03770 void TextLCD_SPI_N_3_9::_setRS(bool value) { 03771 // The controlbits define the meaning of the next byte. This next byte can either be data or command. 03772 // b8 b7...........b0 03773 // RS command or data 03774 // 03775 // RS=1 means that next byte is data, RS=0 means that next byte is command 03776 // 03777 03778 if (value) { 03779 _controlbyte = 0x01; // Next byte is data 03780 } 03781 else { 03782 _controlbyte = 0x00; // Next byte is command 03783 } 03784 } 03785 03786 // Set BL pin 03787 void TextLCD_SPI_N_3_9::_setBL(bool value) { 03788 if (_bl) { 03789 _bl->write(value); 03790 } 03791 } 03792 03793 // Not used in this mode 03794 void TextLCD_SPI_N_3_9::_setData(int value) { 03795 } 03796 03797 // Write a byte using SPI3 9 bits mode 03798 void TextLCD_SPI_N_3_9::_writeByte(int value) { 03799 _cs = 0; 03800 wait_us(1); 03801 _spi->write( (_controlbyte << 8) | (value & 0xFF)); 03802 wait_us(1); 03803 _cs = 1; 03804 } 03805 #endif /* Native SPI bus */ 03806 //------- End TextLCD_SPI_N_3_9 ----------- 03807 03808 03809 //------- Start TextLCD_SPI_N_3_10 -------- 03810 #if(LCD_SPI_N_3_10 == 1) /* Native SPI bus */ 03811 03812 /** Create a TextLCD interface using a controller with a native SPI3 10 bits interface 03813 * 03814 * @param spi SPI Bus 03815 * @param cs chip select pin (active low) 03816 * @param type Sets the panel size/addressing mode (default = LCD16x2) 03817 * @param bl Backlight control line (optional, default = NC) 03818 * @param ctrl LCD controller (default = AIP31068) 03819 */ 03820 TextLCD_SPI_N_3_10::TextLCD_SPI_N_3_10(SPI *spi, PinName cs, LCDType type, PinName bl, LCDCtrl ctrl) : 03821 TextLCD_Base(type, ctrl), 03822 _spi(spi), 03823 _cs(cs) { 03824 03825 // Init CS 03826 _cs = 1; 03827 03828 // Setup the spi for 10 bit data, low steady state clock, 03829 // rising edge capture, with a 500KHz or 1MHz clock rate 03830 _spi->format(10,0); 03831 _spi->frequency(1000000); 03832 03833 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access. 03834 if (bl != NC) { 03835 _bl = new DigitalOut(bl); //Construct new pin 03836 _bl->write(0); //Deactivate 03837 } 03838 else { 03839 // No Hardware Backlight pin 03840 _bl = NULL; //Construct dummy pin 03841 } 03842 03843 //Sanity check 03844 if (_ctrl & LCD_C_SPI3_10) { 03845 _init(_LCD_DL_8); // Set Datalength to 8 bit for all native serial interfaces 03846 } 03847 else { 03848 error("Error: LCD Controller type does not support native SPI3 10 bits interface\n\r"); 03849 } 03850 } 03851 03852 TextLCD_SPI_N_3_10::~TextLCD_SPI_N_3_10() { 03853 if (_bl != NULL) {delete _bl;} // BL pin 03854 } 03855 03856 // Not used in this mode 03857 void TextLCD_SPI_N_3_10::_setEnable(bool value) { 03858 } 03859 03860 // Set RS pin 03861 // Used for mbed pins, I2C bus expander or SPI shiftregister 03862 void TextLCD_SPI_N_3_10::_setRS(bool value) { 03863 // The controlbits define the meaning of the next byte. This next byte can either be data or command. 03864 // b9 b8 b7...........b0 03865 // RS RW command or data 03866 // 03867 // RS=1 means that next byte is data, RS=0 means that next byte is command 03868 // RW=0 means that next byte is writen, RW=1 means that next byte is read (not used in this lib) 03869 // 03870 03871 if (value) { 03872 _controlbyte = 0x02; // Next byte is data 03873 } 03874 else { 03875 _controlbyte = 0x00; // Next byte is command 03876 } 03877 } 03878 03879 // Set BL pin 03880 void TextLCD_SPI_N_3_10::_setBL(bool value) { 03881 if (_bl) { 03882 _bl->write(value); 03883 } 03884 } 03885 03886 // Not used in this mode 03887 void TextLCD_SPI_N_3_10::_setData(int value) { 03888 } 03889 03890 // Write a byte using SPI3 10 bits mode 03891 void TextLCD_SPI_N_3_10::_writeByte(int value) { 03892 _cs = 0; 03893 wait_us(1); 03894 _spi->write( (_controlbyte << 8) | (value & 0xFF)); 03895 wait_us(1); 03896 _cs = 1; 03897 } 03898 #endif /* Native SPI bus */ 03899 //------- End TextLCD_SPI_N_3_10 ---------- 03900 03901 03902 //------- Start TextLCD_SPI_N_3_16 -------- 03903 #if(LCD_SPI_N_3_16 == 1) /* Native SPI bus */ 03904 03905 /** Create a TextLCD interface using a controller with a native SPI3 16 bits interface 03906 * 03907 * @param spi SPI Bus 03908 * @param cs chip select pin (active low) 03909 * @param type Sets the panel size/addressing mode (default = LCD16x2) 03910 * @param bl Backlight control line (optional, default = NC) 03911 * @param ctrl LCD controller (default = PT6314) 03912 */ 03913 TextLCD_SPI_N_3_16::TextLCD_SPI_N_3_16(SPI *spi, PinName cs, LCDType type, PinName bl, LCDCtrl ctrl) : 03914 TextLCD_Base(type, ctrl), 03915 _spi(spi), 03916 _cs(cs) { 03917 03918 // Init CS 03919 _cs = 1; 03920 03921 // Setup the spi for 8 bit data, low steady state clock, 03922 // rising edge capture, with a 500KHz or 1MHz clock rate 03923 _spi->format(8,0); 03924 _spi->frequency(1000000); 03925 03926 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access. 03927 if (bl != NC) { 03928 _bl = new DigitalOut(bl); //Construct new pin 03929 _bl->write(0); //Deactivate 03930 } 03931 else { 03932 // No Hardware Backlight pin 03933 _bl = NULL; //Construct dummy pin 03934 } 03935 03936 //Sanity check 03937 if (_ctrl & LCD_C_SPI3_16) { 03938 _init(_LCD_DL_8); // Set Datalength to 8 bit for all native serial interfaces 03939 } 03940 else { 03941 error("Error: LCD Controller type does not support native SPI3 16 bits interface\n\r"); 03942 } 03943 } 03944 03945 TextLCD_SPI_N_3_16::~TextLCD_SPI_N_3_16() { 03946 if (_bl != NULL) {delete _bl;} // BL pin 03947 } 03948 03949 // Not used in this mode 03950 void TextLCD_SPI_N_3_16::_setEnable(bool value) { 03951 } 03952 03953 // Set RS pin 03954 // Used for mbed pins, I2C bus expander or SPI shiftregister 03955 void TextLCD_SPI_N_3_16::_setRS(bool value) { 03956 // The 16bit mode is split in 2 bytes. The first byte is for synchronisation and controlbits. The controlbits define the meaning of the next byte. 03957 // The 8 actual bits represent either a data or a command byte. 03958 // b15 b14 b13 b12 b11 b10 b9 b8 - b7 b6 b5 b4 b3 b2 b1 b0 03959 // 1 1 1 1 1 RW RS 0 d7 d6 d5 d4 d3 d2 d1 d0 03960 // 03961 // RS=1 means that next byte is data, RS=0 means that next byte is command 03962 // RW=0 means that next byte is writen, RW=1 means that next byte is read (not used in this lib) 03963 // 03964 03965 if (value) { 03966 _controlbyte = 0xFA; // Next byte is data 03967 } 03968 else { 03969 _controlbyte = 0xF8; // Next byte is command 03970 } 03971 } 03972 03973 // Set BL pin 03974 void TextLCD_SPI_N_3_16::_setBL(bool value) { 03975 if (_bl) { 03976 _bl->write(value); 03977 } 03978 } 03979 03980 // Not used in this mode 03981 void TextLCD_SPI_N_3_16::_setData(int value) { 03982 } 03983 03984 // Write a byte using SPI3 16 bits mode 03985 void TextLCD_SPI_N_3_16::_writeByte(int value) { 03986 _cs = 0; 03987 wait_us(1); 03988 03989 _spi->write(_controlbyte); 03990 03991 _spi->write(value); 03992 03993 wait_us(1); 03994 _cs = 1; 03995 } 03996 #endif /* Native SPI bus */ 03997 //------- End TextLCD_SPI_N_3_16 ---------- 03998 03999 04000 //------- Start TextLCD_SPI_N_3_24 -------- 04001 #if(LCD_SPI_N_3_24 == 1) /* Native SPI bus */ 04002 04003 /** Create a TextLCD interface using a controller with a native SPI3 24 bits interface 04004 * 04005 * @param spi SPI Bus 04006 * @param cs chip select pin (active low) 04007 * @param type Sets the panel size/addressing mode (default = LCD16x2) 04008 * @param bl Backlight control line (optional, default = NC) 04009 * @param ctrl LCD controller (default = SSD1803) 04010 */ 04011 TextLCD_SPI_N_3_24::TextLCD_SPI_N_3_24(SPI *spi, PinName cs, LCDType type, PinName bl, LCDCtrl ctrl) : 04012 TextLCD_Base(type, ctrl), 04013 _spi(spi), 04014 _cs(cs) { 04015 04016 // Init CS 04017 _cs = 1; 04018 04019 // Setup the spi for 8 bit data, high steady state clock, 04020 // rising edge capture, with a 500KHz or 1MHz clock rate 04021 _spi->format(8,3); 04022 _spi->frequency(1000000); 04023 04024 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access. 04025 if (bl != NC) { 04026 _bl = new DigitalOut(bl); //Construct new pin 04027 _bl->write(0); //Deactivate 04028 } 04029 else { 04030 // No Hardware Backlight pin 04031 _bl = NULL; //Construct dummy pin 04032 } 04033 04034 //Sanity check 04035 if (_ctrl & LCD_C_SPI3_24) { 04036 _init(_LCD_DL_8); // Set Datalength to 8 bit for all native serial interfaces 04037 } 04038 else { 04039 error("Error: LCD Controller type does not support native SPI3 24 bits interface\n\r"); 04040 } 04041 } 04042 04043 TextLCD_SPI_N_3_24::~TextLCD_SPI_N_3_24() { 04044 if (_bl != NULL) {delete _bl;} // BL pin 04045 } 04046 04047 // Not used in this mode 04048 void TextLCD_SPI_N_3_24::_setEnable(bool value) { 04049 } 04050 04051 // Set RS pin 04052 // Used for mbed pins, I2C bus expander or SPI shiftregister 04053 void TextLCD_SPI_N_3_24::_setRS(bool value) { 04054 // The 24bit mode is split in 3 bytes. The first byte is for synchronisation and controlbits. The controlbits define the meaning of the next two bytes. 04055 // Each byte encodes 4 actual bits. The 8 actual bits represent either a data or a command byte. 04056 // b23 b22 b21 b20 b19 b18 b17 b16 - b15 b14 b13 b12 b11 b10 b9 b8 - b7 b6 b5 b4 b3 b2 b1 b0 04057 // 1 1 1 1 1 RW RS 0 d0 d1 d2 d3 0 0 0 0 d4 d5 d6 d7 0 0 0 0 04058 // 04059 // RS=1 means that next byte is data, RS=0 means that next byte is command 04060 // RW=0 means that next byte is writen, RW=1 means that next byte is read (not used in this lib) 04061 // 04062 // Note: SPI3_24 expects LSB first. This is inconsistent with regular SPI convention (and hardware) that sends MSB first. 04063 04064 if (value) { 04065 _controlbyte = 0xFA; // Next byte is data 04066 } 04067 else { 04068 _controlbyte = 0xF8; // Next byte is command 04069 } 04070 } 04071 04072 // Set BL pin 04073 void TextLCD_SPI_N_3_24::_setBL(bool value) { 04074 if (_bl) { 04075 _bl->write(value); 04076 } 04077 } 04078 04079 // Not used in this mode 04080 void TextLCD_SPI_N_3_24::_setData(int value) { 04081 } 04082 04083 //Mapping table to flip the bits around cause SPI3_24 expects LSB first. 04084 const uint8_t map3_24[16] = {0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0}; 04085 04086 // Write a byte using SPI3 24 bits mode 04087 void TextLCD_SPI_N_3_24::_writeByte(int value) { 04088 _cs = 0; 04089 wait_us(1); 04090 _spi->write(_controlbyte); 04091 04092 //Map and send the LSB nibble 04093 _spi->write( map3_24[value & 0x0F]); 04094 04095 //Map and send the MSB nibble 04096 _spi->write( map3_24[(value >> 4) & 0x0F]); 04097 04098 wait_us(1); 04099 _cs = 1; 04100 } 04101 #endif /* Native SPI bus */ 04102 //------- End TextLCD_SPI_N_3_24 ----------
Generated on Thu Jul 14 2022 00:05:47 by
