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