Updated for more display types. Fixed memoryaddress confusion in address() method. Added new getAddress() method. Added support for UDCs, Backlight control and other features such as control through I2C and SPI port expanders and controllers with native I2C and SPI interfaces. Refactored to fix issue with pins that are default declared as NC.

Dependents:   GPSDevice TestTextLCD SD to Flash Data Transfer DrumMachine ... more

Fork of TextLCD by Simon Ford

Example

Hello World! for the TextLCD

#include "mbed.h"
#include "TextLCD.h"
 
// Host PC Communication channels
Serial pc(USBTX, USBRX); // tx, rx
 
// I2C Communication
I2C i2c_lcd(p28,p27); // SDA, SCL
 
// SPI Communication
SPI spi_lcd(p5, NC, p7); // MOSI, MISO, SCLK

//TextLCD lcd(p15, p16, p17, p18, p19, p20);                // RS, E, D4-D7, LCDType=LCD16x2, BL=NC, E2=NC, LCDTCtrl=HD44780
//TextLCD_SPI lcd(&spi_lcd, p8, TextLCD::LCD40x4);   // SPI bus, 74595 expander, CS pin, LCD Type  
TextLCD_I2C lcd(&i2c_lcd, 0x42, TextLCD::LCD20x4);  // I2C bus, PCF8574 Slaveaddress, LCD Type
//TextLCD_I2C lcd(&i2c_lcd, 0x42, TextLCD::LCD16x2, TextLCD::WS0010); // I2C bus, PCF8574 Slaveaddress, LCD Type, Device Type
//TextLCD_SPI_N lcd(&spi_lcd, p8, p9);               // SPI bus, CS pin, RS pin, LCDType=LCD16x2, BL=NC, LCDTCtrl=ST7032_3V3   
//TextLCD_I2C_N lcd(&i2c_lcd, ST7032_SA, TextLCD::LCD16x2, NC, TextLCD::ST7032_3V3); // I2C bus, Slaveaddress, LCD Type, BL=NC, LCDTCtrl=ST7032_3V3  

int main() {
    pc.printf("LCD Test. Columns=%d, Rows=%d\n\r", lcd.columns(), lcd.rows());
    
    for (int row=0; row<lcd.rows(); row++) {
      int col=0;
      
      pc.printf("MemAddr(Col=%d, Row=%d)=0x%02X\n\r", col, row, lcd.getAddress(col, row));      
//      lcd.putc('-');
      lcd.putc('0' + row);      
      
      for (col=1; col<lcd.columns()-1; col++) {    
        lcd.putc('*');
      }
 
      pc.printf("MemAddr(Col=%d, Row=%d)=0x%02X\n\r", col, row, lcd.getAddress(col, row));      
      lcd.putc('+');
        
    }    
    
// Show cursor as blinking character
    lcd.setCursor(TextLCD::CurOff_BlkOn);
 
// Set and show user defined characters. A maximum of 8 UDCs are supported by the HD44780.
// They are defined by a 5x7 bitpattern. 
    lcd.setUDC(0, (char *) udc_0);  // Show |>
    lcd.putc(0);    
    lcd.setUDC(1, (char *) udc_1);  // Show <|
    lcd.putc(1);    

}

Handbook page

More info is here

Committer:
wim
Date:
Fri Oct 10 15:47:56 2014 +0000
Revision:
35:311be6444a39
Parent:
34:e5a0dcb43ecc
Child:
36:9f5f86dfd44a
Added AC780 support, added I2C expander module types, fixed setBacklight() for inverted logic I2C expander modules. Fixed bug in LCD_SPI_N define.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 1:ac48b187213c 1 /* mbed TextLCD Library, for a 4-bit LCD based on HD44780
simon 6:e4cb7ddee0d3 2 * Copyright (c) 2007-2010, sford, http://mbed.org
wim 14:0c32b66b14b8 3 * 2013, v01: WH, Added LCD types, fixed LCD address issues, added Cursor and UDCs
wim 14:0c32b66b14b8 4 * 2013, v02: WH, Added I2C and SPI bus interfaces
wim 15:b70ebfffb258 5 * 2013, v03: WH, Added support for LCD40x4 which uses 2 controllers
wim 18:bd65dc10f27f 6 * 2013, v04: WH, Added support for Display On/Off, improved 4bit bootprocess
wim 18:bd65dc10f27f 7 * 2013, v05: WH, Added support for 8x2B, added some UDCs
wim 19:c747b9e2e7b8 8 * 2013, v06: WH, Added support for devices that use internal DC/DC converters
wim 20:e0da005a777f 9 * 2013, v07: WH, Added support for backlight and include portdefinitions for LCD2004 Module from DFROBOT
wim 22:35742ec80c24 10 * 2014, v08: WH, Refactored in Base and Derived Classes to deal with mbed lib change regarding 'NC' defined pins
wim 25:6162b31128c9 11 * 2014, v09: WH/EO, Added Class for Native SPI controllers such as ST7032
wim 26:bd897a001012 12 * 2014, v10: WH, Added Class for Native I2C controllers such as ST7032i, Added support for MCP23008 I2C portexpander, Added support for Adafruit module
wim 30:033048611c01 13 * 2014, v11: WH, Added support for native I2C controllers such as PCF21XX, Improved the _initCtrl() method to deal with differences between all supported controllers
wim 32:59c4b8f648d4 14 * 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)
wim 34:e5a0dcb43ecc 15 * 2014, v13: WH, Added support for controllers US2066/SSD1311 (OLED), added setUDCBlink() method for supported devices (eg SSD1803), fixed issue in setPower()
wim 34:e5a0dcb43ecc 16 * 2014, v14: WH, Added support for PT6314 (VFD), added setOrient() method for supported devices (eg SSD1803, US2066), added Double Height lines for supported devices,
wim 34:e5a0dcb43ecc 17 * added 16 UDCs for supported devices (eg PCF2103), moved UDC defines to TextLCD_UDC file, added TextLCD_Config.h for feature and footprint settings.
wim 35:311be6444a39 18 * 2014, v15: WH, Added AC780 support, added I2C expander modules, fixed setBacklight() for inverted logic modules. Fixed bug in LCD_SPI_N define
simon 1:ac48b187213c 19 *
simon 1:ac48b187213c 20 * Permission is hereby granted, free of charge, to any person obtaining a copy
simon 1:ac48b187213c 21 * of this software and associated documentation files (the "Software"), to deal
simon 1:ac48b187213c 22 * in the Software without restriction, including without limitation the rights
simon 1:ac48b187213c 23 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
simon 1:ac48b187213c 24 * copies of the Software, and to permit persons to whom the Software is
simon 1:ac48b187213c 25 * furnished to do so, subject to the following conditions:
simon 1:ac48b187213c 26 *
simon 1:ac48b187213c 27 * The above copyright notice and this permission notice shall be included in
simon 1:ac48b187213c 28 * all copies or substantial portions of the Software.
simon 1:ac48b187213c 29 *
simon 1:ac48b187213c 30 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
simon 1:ac48b187213c 31 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
simon 1:ac48b187213c 32 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
simon 1:ac48b187213c 33 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
simon 1:ac48b187213c 34 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
simon 1:ac48b187213c 35 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
simon 1:ac48b187213c 36 * THE SOFTWARE.
simon 1:ac48b187213c 37 */
wim 34:e5a0dcb43ecc 38 #include "mbed.h"
simon 1:ac48b187213c 39 #include "TextLCD.h"
wim 34:e5a0dcb43ecc 40 #include "TextLCD_UDC.inc"
wim 34:e5a0dcb43ecc 41
wim 21:9eb628d9e164 42 /** Create a TextLCD_Base interface
wim 15:b70ebfffb258 43 *
wim 21:9eb628d9e164 44 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 21:9eb628d9e164 45 * @param ctrl LCD controller (default = HD44780)
wim 15:b70ebfffb258 46 */
wim 21:9eb628d9e164 47 TextLCD_Base::TextLCD_Base(LCDType type, LCDCtrl ctrl) : _type(type), _ctrl(ctrl) {
wim 30:033048611c01 48
wim 30:033048611c01 49 // Extract LCDType data
wim 30:033048611c01 50
wim 30:033048611c01 51 // Columns encoded in b7..b0
wim 30:033048611c01 52 _nr_cols = (_type & 0xFF);
wim 30:033048611c01 53
wim 30:033048611c01 54 // Rows encoded in b15..b8
wim 30:033048611c01 55 _nr_rows = ((_type >> 8) & 0xFF);
wim 30:033048611c01 56
wim 30:033048611c01 57 // Addressing mode encoded in b19..b16
wim 30:033048611c01 58 _addr_mode = _type & LCD_T_ADR_MSK;
wim 14:0c32b66b14b8 59 }
wim 14:0c32b66b14b8 60
wim 14:0c32b66b14b8 61
wim 21:9eb628d9e164 62 /** Init the LCD Controller(s)
wim 21:9eb628d9e164 63 * Clear display
wim 21:9eb628d9e164 64 */
wim 21:9eb628d9e164 65 void TextLCD_Base::_init() {
wim 15:b70ebfffb258 66
wim 15:b70ebfffb258 67 // Select and configure second LCD controller when needed
wim 15:b70ebfffb258 68 if(_type==LCD40x4) {
wim 30:033048611c01 69 _ctrl_idx=_LCDCtrl_1; // Select 2nd controller
wim 30:033048611c01 70 _initCtrl(); // Init 2nd controller
wim 15:b70ebfffb258 71 }
wim 15:b70ebfffb258 72
wim 15:b70ebfffb258 73 // Select and configure primary LCD controller
wim 27:22d5086f6ba6 74 _ctrl_idx=_LCDCtrl_0; // Select primary controller
wim 19:c747b9e2e7b8 75 _initCtrl(); // Init primary controller
wim 28:30fa94f7341c 76
wim 32:59c4b8f648d4 77 // Clear whole display and Reset Cursor location
wim 32:59c4b8f648d4 78 // Note: This will make sure that some 3-line displays that skip topline of a 4-line configuration
wim 32:59c4b8f648d4 79 // are cleared and init cursor correctly.
wim 32:59c4b8f648d4 80 cls();
wim 15:b70ebfffb258 81 }
wim 15:b70ebfffb258 82
wim 21:9eb628d9e164 83 /** Init the LCD controller
wim 21:9eb628d9e164 84 * 4-bit mode, number of lines, fonttype, no cursor etc
wim 30:033048611c01 85 *
wim 30:033048611c01 86 * Note: some configurations are commented out because they have not yet been tested due to lack of hardware
wim 21:9eb628d9e164 87 */
wim 21:9eb628d9e164 88 void TextLCD_Base::_initCtrl() {
wim 32:59c4b8f648d4 89 int _bias_lines=0; // Set Bias and lines (Instr Set 1), temporary variable.
wim 32:59c4b8f648d4 90 int _lines=0; // Set lines (Ext Instr Set), temporary variable.
wim 32:59c4b8f648d4 91
wim 26:bd897a001012 92 this->_setRS(false); // command mode
wim 13:24506ba22480 93
wim 26:bd897a001012 94 wait_ms(20); // Wait 20ms to ensure powered up
simon 1:ac48b187213c 95
wim 33:900a94bc7585 96 // The Controller could be in 8 bit mode (power-on reset) or in 4 bit mode (warm reboot) at this point.
wim 33:900a94bc7585 97 // Follow this procedure to make sure the Controller enters the correct state. The hardware interface
wim 33:900a94bc7585 98 // between the uP and the LCD can only write the 4 most significant bits (Most Significant Nibble, MSN).
wim 33:900a94bc7585 99 // In 4 bit mode the LCD expects the MSN first, followed by the LSN.
wim 33:900a94bc7585 100 //
wim 33:900a94bc7585 101 // Current state: 8 bit mode | 4 bit mode, MSN is next | 4 bit mode, LSN is next
wim 33:900a94bc7585 102 //-------------------------------------------------------------------------------------------------
wim 33:900a94bc7585 103 _writeNibble(0x3); // set 8 bit mode (MSN) and dummy LSN, | set 8 bit mode (MSN), | set dummy LSN,
wim 33:900a94bc7585 104 // remains in 8 bit mode | change to 8 bit mode | remains in 4 bit mode
wim 33:900a94bc7585 105 wait_ms(15); //
wim 33:900a94bc7585 106
wim 33:900a94bc7585 107 _writeNibble(0x3); // set 8 bit mode and dummy LSN, | set 8 bit mode and dummy LSN, | set 8bit mode (MSN),
wim 33:900a94bc7585 108 // remains in 8 bit mode | remains in 8 bit mode | remains in 4 bit mode
wim 33:900a94bc7585 109 wait_ms(15); //
wim 33:900a94bc7585 110
wim 33:900a94bc7585 111 _writeNibble(0x3); // set 8 bit mode and dummy LSN, | set 8 bit mode and dummy LSN, | set dummy LSN,
wim 33:900a94bc7585 112 // remains in 8 bit mode | remains in 8 bit mode | change to 8 bit mode
wim 33:900a94bc7585 113 wait_ms(15); //
wim 33:900a94bc7585 114
wim 33:900a94bc7585 115 // Controller is now in 8 bit mode
wim 33:900a94bc7585 116
wim 33:900a94bc7585 117 _writeNibble(0x2); // Change to 4-bit mode (MSN), the LSN is undefined dummy
wim 17:652ab113bc2e 118 wait_us(40); // most instructions take 40us
wim 18:bd65dc10f27f 119
wim 18:bd65dc10f27f 120 // Display is now in 4-bit mode
wim 33:900a94bc7585 121 // Note: 4/8 bit mode is ignored for most native SPI and I2C devices. They dont use the parallel bus.
wim 33:900a94bc7585 122 // However, _writeNibble() method is void anyway for native SPI and I2C devices.
wim 25:6162b31128c9 123
wim 29:a3663151aa65 124 // Device specific initialisations: DC/DC converter to generate VLCD or VLED, number of lines etc
wim 19:c747b9e2e7b8 125 switch (_ctrl) {
wim 32:59c4b8f648d4 126
wim 29:a3663151aa65 127 case KS0078:
wim 29:a3663151aa65 128 // Initialise Display configuration
wim 29:a3663151aa65 129 switch (_type) {
wim 29:a3663151aa65 130 case LCD8x1: //8x1 is a regular 1 line display
wim 29:a3663151aa65 131 case LCD8x2B: //8x2B is a special case of 16x1
wim 29:a3663151aa65 132 // case LCD12x1:
wim 29:a3663151aa65 133 case LCD16x1:
wim 30:033048611c01 134 // case LCD20x1:
wim 29:a3663151aa65 135 case LCD24x1:
wim 32:59c4b8f648d4 136 _function = 0x02; // Function set 001 DL N RE(0) DH REV (Std Regs)
wim 32:59c4b8f648d4 137 // DL=0 (4 bits bus)
wim 32:59c4b8f648d4 138 // N=0 (1 line mode), N=1 (2 line mode)
wim 32:59c4b8f648d4 139 // RE=0 (Dis. Extended Regs, special mode for KS0078)
wim 32:59c4b8f648d4 140 // DH=1 (Disp shift enable, special mode for KS0078)
wim 32:59c4b8f648d4 141 // REV=0 (Reverse normal, special mode for KS0078)
wim 32:59c4b8f648d4 142
wim 33:900a94bc7585 143 _function_1 = 0x04; // Function set 001 DL N RE(1) BE 0 (Ext Regs)
wim 32:59c4b8f648d4 144 // DL=0 (4 bits bus)
wim 32:59c4b8f648d4 145 // N=0 (1 line mode), N=1 (2 line mode)
wim 32:59c4b8f648d4 146 // RE=1 (Ena Extended Regs, special mode for KS0078)
wim 32:59c4b8f648d4 147 // BE=0 (Blink Enable, CG/SEG RAM, special mode for KS0078)
wim 32:59c4b8f648d4 148 // 0
wim 30:033048611c01 149
wim 32:59c4b8f648d4 150 _function_x = 0x00; // Ext Function set 0000 1 FW BW NW (Ext Regs)
wim 32:59c4b8f648d4 151 // NW=0 (1,2 line), NW=1 (4 Line, special mode for KS0078)
wim 29:a3663151aa65 152 break;
wim 29:a3663151aa65 153
wim 32:59c4b8f648d4 154 // case LCD12x3D: // Special mode for KS0078 and PCF21XX
wim 32:59c4b8f648d4 155 // case LCD12x3D1: // Special mode for KS0078 and PCF21XX
wim 32:59c4b8f648d4 156 // case LCD12x4D: // Special mode for KS0078 and PCF21XX
wim 32:59c4b8f648d4 157 // case LCD16x3D: // Special mode for KS0078
wim 32:59c4b8f648d4 158 // case LCD16x4D: // Special mode for KS0078
wim 30:033048611c01 159 // case LCD24x3D: // Special mode for KS0078
wim 30:033048611c01 160 // case LCD24x3D1: // Special mode for KS0078
wim 30:033048611c01 161 case LCD24x4D: // Special mode for KS0078
wim 32:59c4b8f648d4 162 _function = 0x02; // Function set 001 DL N RE(0) DH REV (Std Regs)
wim 32:59c4b8f648d4 163 // DL=0 (4 bits bus)
wim 32:59c4b8f648d4 164 // N=0 (dont care for 4 line mode)
wim 32:59c4b8f648d4 165 // RE=0 (Dis. Extended Regs, special mode for KS0078)
wim 32:59c4b8f648d4 166 // DH=1 (Disp shift enable, special mode for KS0078)
wim 32:59c4b8f648d4 167 // REV=0 (Reverse normal, special mode for KS0078)
wim 32:59c4b8f648d4 168
wim 33:900a94bc7585 169 _function_1 = 0x04; // Function set 001 DL N RE(1) BE 0 (Ext Regs)
wim 32:59c4b8f648d4 170 // DL=0 (4 bits bus)
wim 32:59c4b8f648d4 171 // N=0 (1 line mode), N=1 (2 line mode)
wim 32:59c4b8f648d4 172 // RE=1 (Ena Extended Regs, special mode for KS0078)
wim 32:59c4b8f648d4 173 // BE=0 (Blink Enable, CG/SEG RAM, special mode for KS0078)
wim 32:59c4b8f648d4 174 // 0
wim 29:a3663151aa65 175
wim 32:59c4b8f648d4 176 _function_x = 0x01; // Ext Function set 0000 1 FW BW NW (Ext Regs)
wim 32:59c4b8f648d4 177 // NW=0 (1,2 line), NW=1 (4 Line, special mode for KS0078)
wim 30:033048611c01 178 break;
wim 33:900a94bc7585 179
wim 33:900a94bc7585 180 case LCD16x3G: // Special mode for ST7036
wim 33:900a94bc7585 181 error("Error: LCD Controller type does not support this Display type\n\r");
wim 33:900a94bc7585 182 break;
wim 30:033048611c01 183
wim 29:a3663151aa65 184 default:
wim 30:033048611c01 185 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4)
wim 32:59c4b8f648d4 186 _function = 0x0A; // Function set 001 DL N RE(0) DH REV (Std Regs)
wim 32:59c4b8f648d4 187 // DL=0 (4 bits bus)
wim 32:59c4b8f648d4 188 // N=1 (1 line mode), N=1 (2 line mode)
wim 32:59c4b8f648d4 189 // RE=0 (Dis. Extended Regs, special mode for KS0078)
wim 32:59c4b8f648d4 190 // DH=1 (Disp shift enable, special mode for KS0078)
wim 32:59c4b8f648d4 191 // REV=0 (Reverse normal, special mode for KS0078)
wim 32:59c4b8f648d4 192
wim 33:900a94bc7585 193 _function_1 = 0x0C; // Function set 001 DL N RE(1) BE 0 (Ext Regs)
wim 32:59c4b8f648d4 194 // DL=0 (4 bits bus)
wim 32:59c4b8f648d4 195 // N=1 (1 line mode), N=1 (2 line mode)
wim 32:59c4b8f648d4 196 // RE=1 (Ena Extended Regs, special mode for KS0078)
wim 32:59c4b8f648d4 197 // BE=0 (Blink Enable, CG/SEG RAM, special mode for KS0078)
wim 32:59c4b8f648d4 198 // 0
wim 30:033048611c01 199
wim 32:59c4b8f648d4 200 _function_x = 0x00; // Ext Function set 0000 1 FW BW NW (Ext Regs)
wim 32:59c4b8f648d4 201 // NW=0 (1,2 line), NW=1 (4 Line, special mode for KS0078)
wim 29:a3663151aa65 202 break;
wim 29:a3663151aa65 203 } // switch type
wim 29:a3663151aa65 204
wim 32:59c4b8f648d4 205 // init special features
wim 32:59c4b8f648d4 206 _writeCommand(0x20 | _function_1);// Function set 001 DL N RE(1) BE 0 (Ext Regs)
wim 32:59c4b8f648d4 207 // DL=0 (4 bits bus), DL=1 (8 bits mode)
wim 32:59c4b8f648d4 208 // N=0 (1 line mode), N=1 (2 line mode)
wim 32:59c4b8f648d4 209 // RE=1 (Ena Extended Regs, special mode for KS0078)
wim 32:59c4b8f648d4 210 // BE=0 (Blink Enable/Disable, CG/SEG RAM, special mode for KS0078)
wim 32:59c4b8f648d4 211 // 0
wim 32:59c4b8f648d4 212
wim 32:59c4b8f648d4 213 _writeCommand(0x08 | _function_x); // Ext Function set 0000 1 FW BW NW (Ext Regs)
wim 32:59c4b8f648d4 214 // FW=0 (5-dot font, special mode for KS0078)
wim 32:59c4b8f648d4 215 // BW=0 (Cur BW invert disable, special mode for KS0078)
wim 32:59c4b8f648d4 216 // NW=0 (1,2 Line), NW=1 (4 line, special mode for KS0078)
wim 32:59c4b8f648d4 217
wim 32:59c4b8f648d4 218 _writeCommand(0x10); // Scroll/Shift set 0001 DS/HS4 DS/HS3 DS/HS2 DS/HS1 (Ext Regs)
wim 32:59c4b8f648d4 219 // Dotscroll/Display shift enable (Special mode for KS0078)
wim 32:59c4b8f648d4 220
wim 32:59c4b8f648d4 221 _writeCommand(0x80); // Scroll Quantity set 1 0 SQ5 SQ4 SQ3 SQ2 SQ1 SQ0 (Ext Regs)
wim 32:59c4b8f648d4 222 // Scroll quantity (Special mode for KS0078)
wim 32:59c4b8f648d4 223
wim 32:59c4b8f648d4 224 _writeCommand(0x20 | _function); // Function set 001 DL N RE(0) DH REV (Std Regs)
wim 32:59c4b8f648d4 225 // DL=0 (4 bits bus), DL=1 (8 bits mode)
wim 32:59c4b8f648d4 226 // N=0 (1 line mode), N=1 (2 line mode)
wim 32:59c4b8f648d4 227 // RE=0 (Dis. Extended Regs, special mode for KS0078)
wim 32:59c4b8f648d4 228 // DH=1 (Disp shift enable/disable, special mode for KS0078)
wim 32:59c4b8f648d4 229 // REV=0 (Reverse/Normal, special mode for KS0078)
wim 29:a3663151aa65 230 break; // case KS0078 Controller
wim 29:a3663151aa65 231
wim 26:bd897a001012 232 case ST7032_3V3:
wim 26:bd897a001012 233 // ST7032 controller: Initialise Voltage booster for VLCD. VDD=3V3
wim 26:bd897a001012 234 case ST7032_5V:
wim 32:59c4b8f648d4 235 // ST7032 controller: Disable Voltage booster for VLCD. VDD=5V
wim 29:a3663151aa65 236
wim 29:a3663151aa65 237 // Initialise Display configuration
wim 29:a3663151aa65 238 switch (_type) {
wim 29:a3663151aa65 239 case LCD8x1: //8x1 is a regular 1 line display
wim 29:a3663151aa65 240 case LCD8x2B: //8x2B is a special case of 16x1
wim 29:a3663151aa65 241 // case LCD12x1:
wim 29:a3663151aa65 242 case LCD16x1:
wim 30:033048611c01 243 // case LCD20x1:
wim 32:59c4b8f648d4 244 case LCD24x1:
wim 32:59c4b8f648d4 245 _function = 0x00; // FUNCTION SET 0 0 1 DL=0 (4 bit), N=0 (1-line display mode), F=0 (5*7dot), 0, IS
wim 32:59c4b8f648d4 246 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 247 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 248 break;
wim 28:30fa94f7341c 249
wim 32:59c4b8f648d4 250 case LCD12x3D: // Special mode for KS0078 and PCF21XX
wim 32:59c4b8f648d4 251 case LCD12x3D1: // Special mode for KS0078 and PCF21XX
wim 32:59c4b8f648d4 252 case LCD12x4D: // Special mode for KS0078 and PCF21XX
wim 33:900a94bc7585 253 case LCD16x3G: // Special mode for ST7036
wim 32:59c4b8f648d4 254 case LCD24x4D: // Special mode for KS0078
wim 32:59c4b8f648d4 255 error("Error: LCD Controller type does not support this Display type\n\r");
wim 30:033048611c01 256 break;
wim 29:a3663151aa65 257
wim 32:59c4b8f648d4 258 default:
wim 32:59c4b8f648d4 259 // All other LCD types are initialised as 2 Line displays
wim 32:59c4b8f648d4 260 _function = 0x08; // FUNCTION SET 0 0 1 DL=0 (4 bit), N=1 (2-line display mode), F=0 (5*7dot), 0, IS
wim 32:59c4b8f648d4 261 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 262 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 263 break;
wim 32:59c4b8f648d4 264 } // switch type
wim 32:59c4b8f648d4 265
wim 32:59c4b8f648d4 266 // init special features
wim 33:900a94bc7585 267 _writeCommand(0x20 | _function | 0x01); // Set function, 0 0 1 DL N F 0 IS=1 Select Instr Set = 1
wim 33:900a94bc7585 268
wim 33:900a94bc7585 269 _writeCommand(0x1C); // Internal OSC frequency adjustment Framefreq=183HZ, Bias will be 1/4 (Instr Set=1)
wim 32:59c4b8f648d4 270
wim 32:59c4b8f648d4 271 _contrast = LCD_ST7032_CONTRAST;
wim 32:59c4b8f648d4 272 _writeCommand(0x70 | (_contrast & 0x0F)); // Set Contrast Low bits, 0 1 1 1 C3 C2 C1 C0 (IS=1)
wim 32:59c4b8f648d4 273
wim 32:59c4b8f648d4 274
wim 32:59c4b8f648d4 275 if (_ctrl == ST7032_3V3) {
wim 32:59c4b8f648d4 276 _icon_power = 0x04; // Icon display off, Booster circuit is turned on (IS=1)
wim 32:59c4b8f648d4 277 // Saved to allow contrast change at later time
wim 32:59c4b8f648d4 278 }
wim 32:59c4b8f648d4 279 else {
wim 32:59c4b8f648d4 280 _icon_power = 0x00; // Icon display off, Booster circuit is turned off (IS=1)
wim 32:59c4b8f648d4 281 // Saved to allow contrast change at later time
wim 32:59c4b8f648d4 282 }
wim 32:59c4b8f648d4 283 _writeCommand(0x50 | _icon_power | ((_contrast >> 4) & 0x03)); // Set Icon, Booster and Contrast High bits, 0 1 0 1 Ion Bon C5 C4 (IS=1)
wim 32:59c4b8f648d4 284 wait_ms(10); // Wait 10ms to ensure powered up
wim 32:59c4b8f648d4 285
wim 32:59c4b8f648d4 286 _writeCommand(0x68 | (LCD_ST7032_RAB & 0x07)); // Voltage follower, 0 1 1 0 FOn=1, Ampl ratio Rab2=1, Rab1=0, Rab0=0 (IS=1)
wim 32:59c4b8f648d4 287 wait_ms(10); // Wait 10ms to ensure powered up
wim 32:59c4b8f648d4 288
wim 32:59c4b8f648d4 289 _writeCommand(0x20 | _function); // Select Instruction Set = 0
wim 32:59c4b8f648d4 290
wim 32:59c4b8f648d4 291 break; // case ST7032_3V3 Controller
wim 32:59c4b8f648d4 292 // case ST7032_5V Controller
wim 32:59c4b8f648d4 293
wim 32:59c4b8f648d4 294 case ST7036_3V3:
wim 32:59c4b8f648d4 295 // ST7036 controller: Initialise Voltage booster for VLCD. VDD=3V3
wim 32:59c4b8f648d4 296 // Note: supports 1,2 (LCD_T_A) or 3 lines (LCD_T_G)
wim 32:59c4b8f648d4 297 case ST7036_5V:
wim 32:59c4b8f648d4 298 // ST7036 controller: Disable Voltage booster for VLCD. VDD=5V
wim 32:59c4b8f648d4 299 // Note: supports 1,2 (LCD_T_A) or 3 lines (LCD_T_G)
wim 32:59c4b8f648d4 300
wim 32:59c4b8f648d4 301 // Initialise Display configuration
wim 32:59c4b8f648d4 302 switch (_type) {
wim 32:59c4b8f648d4 303 case LCD8x1: //8x1 is a regular 1 line display
wim 32:59c4b8f648d4 304 case LCD8x2B: //8x2D is a special case of 16x1
wim 32:59c4b8f648d4 305 // case LCD12x1:
wim 32:59c4b8f648d4 306 case LCD16x1:
wim 32:59c4b8f648d4 307 case LCD24x1:
wim 32:59c4b8f648d4 308 _function = 0x00; // Set function, 0 0 1 DL=0 (4-bit Databus), N=0 (1 Line), DH=0 (5x7font), IS2, IS1 (Select Instruction Set)
wim 32:59c4b8f648d4 309 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 310 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 311
wim 32:59c4b8f648d4 312 _bias_lines = 0x04; // Bias: 1/5, 1 or 2-Lines LCD
wim 32:59c4b8f648d4 313 break;
wim 32:59c4b8f648d4 314
wim 32:59c4b8f648d4 315 // case LCD12x3G: // Special mode for ST7036
wim 32:59c4b8f648d4 316 case LCD16x3G: // Special mode for ST7036
wim 32:59c4b8f648d4 317 _function = 0x08; // Set function, 0 0 1 DL=0 (4-bit Databus), N=1 (2 Line), DH=0 (5x7font), IS2,IS1 (Select Instruction Set)
wim 32:59c4b8f648d4 318 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 319 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 320
wim 32:59c4b8f648d4 321 _bias_lines = 0x05; // Bias: 1/5, 3-Lines LCD
wim 32:59c4b8f648d4 322 break;
wim 32:59c4b8f648d4 323
wim 32:59c4b8f648d4 324 // case LCD12x3D1: // Special mode for KS0078 and PCF21XX
wim 32:59c4b8f648d4 325 // case LCD16x3D1: // Special mode for SSD1803
wim 30:033048611c01 326 case LCD12x4D: // Special mode for PCF2116
wim 30:033048611c01 327 case LCD24x4D: // Special mode for KS0078
wim 30:033048611c01 328 error("Error: LCD Controller type does not support this Display type\n\r");
wim 29:a3663151aa65 329 break;
wim 28:30fa94f7341c 330
wim 29:a3663151aa65 331 default:
wim 32:59c4b8f648d4 332 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4)
wim 32:59c4b8f648d4 333 _function = 0x08; // Set function, 0 0 1 DL=0 (4-bit Databus), N=1 (2 Line), DH=0 (5x7font), IS2,IS1 (Select Instruction Set)
wim 32:59c4b8f648d4 334 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 335 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 336
wim 32:59c4b8f648d4 337 _bias_lines = 0x04; // Bias: 1/5, 1 or 2-Lines LCD
wim 32:59c4b8f648d4 338 break;
wim 32:59c4b8f648d4 339 } // switch type
wim 32:59c4b8f648d4 340
wim 29:a3663151aa65 341
wim 32:59c4b8f648d4 342 // init special features
wim 33:900a94bc7585 343 _writeCommand(0x20 | _function | 0x01); // Set function, IS2,IS1 = 01 (Select Instr Set = 1)
wim 32:59c4b8f648d4 344 _writeCommand(0x10 | _bias_lines); // Set Bias and 1,2 or 3 lines (Instr Set 1)
wim 29:a3663151aa65 345
wim 32:59c4b8f648d4 346 _contrast = LCD_ST7036_CONTRAST;
wim 32:59c4b8f648d4 347 _writeCommand(0x70 | (_contrast & 0x0F)); // Set Contrast, 0 1 1 1 C3 C2 C1 C0 (Instr Set 1)
wim 32:59c4b8f648d4 348
wim 32:59c4b8f648d4 349 if (_ctrl == ST7036_3V3) {
wim 32:59c4b8f648d4 350 _icon_power = 0x04; // Set Icon, Booster, Contrast High bits, 0 1 0 1 Ion=0 Bon=1 C5 C4 (Instr Set 1)
wim 32:59c4b8f648d4 351 // Saved to allow contrast change at later time
wim 32:59c4b8f648d4 352 }
wim 32:59c4b8f648d4 353 else {
wim 32:59c4b8f648d4 354 _icon_power = 0x00; // Set Icon, Booster, Contrast High bits, 0 1 0 1 Ion=0 Bon=0 C5 C4 (Instr Set 1)
wim 32:59c4b8f648d4 355 }
wim 29:a3663151aa65 356
wim 32:59c4b8f648d4 357 _writeCommand(0x50 | _icon_power | ((_contrast >> 4) & 0x03)); // Set Contrast C5, C4 (Instr Set 1)
wim 32:59c4b8f648d4 358 wait_ms(10); // Wait 10ms to ensure powered up
wim 32:59c4b8f648d4 359
wim 32:59c4b8f648d4 360 _writeCommand(0x68 | (LCD_ST7036_RAB & 0x07)); // Voltagefollower On = 1, Ampl ratio Rab2, Rab1, Rab0 = 1 0 1 (Instr Set 1)
wim 32:59c4b8f648d4 361 wait_ms(10); // Wait 10ms to ensure powered up
wim 28:30fa94f7341c 362
wim 32:59c4b8f648d4 363 _writeCommand(0x20 | _function); // Set function, IS2,IS1 = 00 (Select Instruction Set = 0)
wim 32:59c4b8f648d4 364
wim 32:59c4b8f648d4 365 break; // case ST7036_3V3 Controller
wim 32:59c4b8f648d4 366 // case ST7036_5V Controller
wim 32:59c4b8f648d4 367
wim 32:59c4b8f648d4 368 case SSD1803_3V3:
wim 32:59c4b8f648d4 369 // SSD1803 controller: Initialise Voltage booster for VLCD. VDD=3V3
wim 32:59c4b8f648d4 370 // Note: supports 1,2, 3 or 4 lines
wim 32:59c4b8f648d4 371 // case SSD1803_5V:
wim 32:59c4b8f648d4 372 // SSD1803 controller: No Voltage booster for VLCD. VDD=5V
wim 32:59c4b8f648d4 373
wim 29:a3663151aa65 374 // Initialise Display configuration
wim 29:a3663151aa65 375 switch (_type) {
wim 29:a3663151aa65 376 case LCD8x1: //8x1 is a regular 1 line display
wim 30:033048611c01 377 case LCD8x2B: //8x2D is a special case of 16x1
wim 29:a3663151aa65 378 // case LCD12x1:
wim 29:a3663151aa65 379 case LCD16x1:
wim 29:a3663151aa65 380 case LCD24x1:
wim 32:59c4b8f648d4 381 _function = 0x00; // Set function 0 0 1 DL N DH RE(0) IS
wim 32:59c4b8f648d4 382 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 383 // DL=0 4-bit Databus,
wim 32:59c4b8f648d4 384 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 385 // N=0 1 Line / 3 Line
wim 32:59c4b8f648d4 386 // DH=0 Double Height disable
wim 32:59c4b8f648d4 387 // IS=0
wim 32:59c4b8f648d4 388
wim 33:900a94bc7585 389 _function_1 = 0x02; // Set function, 0 0 1 DL N BE RE(1) REV
wim 32:59c4b8f648d4 390 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 391 // DL=0 4-bit Databus,
wim 32:59c4b8f648d4 392 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 393 // N=0 1 Line / 3 Line
wim 32:59c4b8f648d4 394 // BE=0 Blink Enable off, special feature of SSD1803
wim 32:59c4b8f648d4 395 // REV=0 Reverse off, special feature of SSD1803
wim 32:59c4b8f648d4 396
wim 32:59c4b8f648d4 397 _lines = 0x00; // Ext function set 0 0 0 0 1 FW BW NW
wim 32:59c4b8f648d4 398 // NW=0 1-Line LCD (N=0)
wim 29:a3663151aa65 399 break;
wim 32:59c4b8f648d4 400
wim 33:900a94bc7585 401 case LCD12x3D: // Special mode for KS0078 and PCF21XX
wim 32:59c4b8f648d4 402 // case LCD12x3D1: // Special mode for KS0078 and PCF21XX
wim 33:900a94bc7585 403 case LCD16x3D: // Special mode for KS0078
wim 32:59c4b8f648d4 404 // case LCD16x3D1: // Special mode for SSD1803
wim 32:59c4b8f648d4 405 // case LCD20x3D: // Special mode for SSD1803
wim 32:59c4b8f648d4 406 _function = 0x00; // Set function 0 0 1 DL N DH RE(0) IS
wim 32:59c4b8f648d4 407 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 408 // DL=0 4-bit Databus,
wim 32:59c4b8f648d4 409 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 410 // N=0 1 Line / 3 Line
wim 32:59c4b8f648d4 411 // DH=0 Double Height disable
wim 32:59c4b8f648d4 412 // IS=0
wim 32:59c4b8f648d4 413
wim 33:900a94bc7585 414 _function_1 = 0x02; // Set function, 0 0 1 DL N BE RE(1) REV
wim 32:59c4b8f648d4 415 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 416 // DL=0 4-bit Databus,
wim 32:59c4b8f648d4 417 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 418 // N=0 1 Line / 3 Line
wim 32:59c4b8f648d4 419 // BE=0 Blink Enable off, special feature of SSD1803
wim 32:59c4b8f648d4 420 // REV=0 Reverse off, special feature of SSD1803
wim 32:59c4b8f648d4 421
wim 32:59c4b8f648d4 422 _lines = 0x00; // Ext function set 0 0 0 0 1 FW BW NW
wim 32:59c4b8f648d4 423 // NW=1 3-Line LCD (N=0)
wim 29:a3663151aa65 424 break;
wim 30:033048611c01 425
wim 32:59c4b8f648d4 426 case LCD20x4D: // Special mode for SSD1803
wim 32:59c4b8f648d4 427 _function = 0x08; // Set function 0 0 1 DL N DH RE(0) IS
wim 32:59c4b8f648d4 428 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 429 // DL=0 4-bit Databus,
wim 32:59c4b8f648d4 430 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 431 // N=1 4 Line
wim 32:59c4b8f648d4 432 // DH=0 Double Height disable
wim 32:59c4b8f648d4 433 // IS=0
wim 32:59c4b8f648d4 434
wim 33:900a94bc7585 435 _function_1 = 0x0A; // Set function, 0 0 1 DL N BE RE(1) REV
wim 32:59c4b8f648d4 436 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 437 // DL=0 4-bit Databus,
wim 32:59c4b8f648d4 438 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 439 // N=1 4 Line
wim 32:59c4b8f648d4 440 // BE=0 Blink Enable off, special feature of SSD1803
wim 32:59c4b8f648d4 441 // REV=0 Reverse off, special feature of SSD1803
wim 32:59c4b8f648d4 442
wim 32:59c4b8f648d4 443 _lines = 0x01; // Ext function set 0 0 0 0 1 FW BW NW
wim 32:59c4b8f648d4 444 // NW=1 4-Line LCD (N=1)
wim 32:59c4b8f648d4 445 break;
wim 32:59c4b8f648d4 446
wim 33:900a94bc7585 447 case LCD16x3G: // Special mode for ST7036
wim 32:59c4b8f648d4 448 case LCD24x4D: // Special mode for KS0078
wim 30:033048611c01 449 error("Error: LCD Controller type does not support this Display type\n\r");
wim 30:033048611c01 450 break;
wim 30:033048611c01 451
wim 29:a3663151aa65 452 default:
wim 30:033048611c01 453 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4)
wim 32:59c4b8f648d4 454 _function = 0x08; // Set function 0 0 1 DL N DH RE(0) IS
wim 32:59c4b8f648d4 455 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 456 // DL=0 4-bit Databus,
wim 32:59c4b8f648d4 457 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 458 // N=1 2 line / 4 Line
wim 32:59c4b8f648d4 459 // DH=0 Double Height disable
wim 32:59c4b8f648d4 460 // IS=0
wim 29:a3663151aa65 461
wim 33:900a94bc7585 462 _function_1 = 0x0A; // Set function, 0 0 1 DL N BE RE(1) REV
wim 32:59c4b8f648d4 463 // Saved to allow switch between Instruction sets at later time
wim 32:59c4b8f648d4 464 // DL=0 4-bit Databus,
wim 32:59c4b8f648d4 465 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 32:59c4b8f648d4 466 // N=1 2 line / 4 Line
wim 32:59c4b8f648d4 467 // BE=0 Blink Enable off, special feature of SSD1803
wim 32:59c4b8f648d4 468 // REV=0 Reverse off, special feature of SSD1803
wim 32:59c4b8f648d4 469
wim 32:59c4b8f648d4 470 _lines = 0x00; // Ext function set 0 0 0 0 1 FW BW NW
wim 32:59c4b8f648d4 471 // NW=0 2-Line LCD (N=1)
wim 32:59c4b8f648d4 472 break;
wim 32:59c4b8f648d4 473 } // switch type
wim 32:59c4b8f648d4 474
wim 32:59c4b8f648d4 475
wim 32:59c4b8f648d4 476 // init special features
wim 33:900a94bc7585 477 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 DL N BE RE(1) REV
wim 32:59c4b8f648d4 478 // Select Extended Instruction Set
wim 33:900a94bc7585 479
wim 33:900a94bc7585 480 _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)
wim 33:900a94bc7585 481 // _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)
wim 33:900a94bc7585 482 wait_ms(5); // Wait to ensure completion or SSD1803 fails to set Top/Bottom after reset..
wim 33:900a94bc7585 483
wim 33:900a94bc7585 484 _writeCommand(0x08 | _lines); // Set ext function 0 0 0 0 1 FW BW NW 1,2,3 or 4 lines (Ext Instr Set)
wim 32:59c4b8f648d4 485
wim 32:59c4b8f648d4 486 _writeCommand(0x10); // Double Height and Bias, 0 0 0 1 UD2=0, UD1=0, BS1=0 Bias 1/5, DH=0 (Ext Instr Set)
wim 32:59c4b8f648d4 487
wim 32:59c4b8f648d4 488 // _writeCommand(0x76); // Set TC Control, 0 1 1 1 0 1 1 0 (Ext Instr Set)
wim 32:59c4b8f648d4 489 // _writeData(0x02); // Set TC data, 0 0 0 0 0 TC2,TC1,TC0 = 0 1 0 (Ext Instr Set)
wim 32:59c4b8f648d4 490
wim 32:59c4b8f648d4 491 _writeCommand(0x20 | _function | 0x01); // Set function, 0 0 1 DL N DH RE(0) IS=1 Select Instruction Set 1
wim 32:59c4b8f648d4 492 // Select Std Instr set, Select IS=1
wim 32:59c4b8f648d4 493
wim 32:59c4b8f648d4 494 _contrast = LCD_SSD1_CONTRAST;
wim 32:59c4b8f648d4 495 _writeCommand(0x70 | (_contrast & 0x0F)); // Set Contrast 0 1 1 1 C3, C2, C1, C0 (Instr Set 1)
wim 32:59c4b8f648d4 496
wim 32:59c4b8f648d4 497 _icon_power = 0x04; // Icon off, Booster on (Instr Set 1)
wim 32:59c4b8f648d4 498 // Saved to allow contrast change at later time
wim 32:59c4b8f648d4 499 _writeCommand(0x50 | _icon_power | ((_contrast >> 4) & 0x03)); // Set Power, Icon and Contrast, 0 1 0 1 Ion Bon C5 C4 (Instr Set 1)
wim 32:59c4b8f648d4 500 wait_ms(10); // Wait 10ms to ensure powered up
wim 32:59c4b8f648d4 501
wim 32:59c4b8f648d4 502 _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)
wim 32:59c4b8f648d4 503 wait_ms(10); // Wait 10ms to ensure powered up
wim 32:59c4b8f648d4 504
wim 33:900a94bc7585 505 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 DL N BE RE(1) REV
wim 32:59c4b8f648d4 506 // Select Extended Instruction Set 1
wim 32:59c4b8f648d4 507 _writeCommand(0x10); // Shift/Scroll enable, 0 0 0 1 DS4/HS4 DS3/HS3 DS2/HS2 DS1/HS1 (Ext Instr Set 1)
wim 32:59c4b8f648d4 508
wim 32:59c4b8f648d4 509
wim 32:59c4b8f648d4 510 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
wim 32:59c4b8f648d4 511 // Select Std Instr set, Select IS=0
wim 32:59c4b8f648d4 512
wim 32:59c4b8f648d4 513 break; // case SSD1803 Controller
wim 32:59c4b8f648d4 514
wim 29:a3663151aa65 515
wim 32:59c4b8f648d4 516 // Note1: The PCF21XX family of controllers has several types that dont have an onboard voltage generator for V-LCD.
wim 32:59c4b8f648d4 517 // You must supply this LCD voltage externally and not try to enable VGen.
wim 32:59c4b8f648d4 518 // Note2: The early versions of PCF2116 controllers (eg PCF2116C) can not generate sufficiently negative voltage for the LCD at a VDD of 3V3.
wim 32:59c4b8f648d4 519 // You must supply this voltage externally and not enable VGen or you must use a higher VDD (e.g. 5V) and enable VGen.
wim 32:59c4b8f648d4 520 // More recent versions of the controller (eg PCF2116K) have an improved VGen that will work with 3V3.
wim 32:59c4b8f648d4 521 // 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
wim 32:59c4b8f648d4 522 // contrast control similar to that of pin 3 on the standard 14pin LCD module connector.
wim 32:59c4b8f648d4 523 // You can disable VGen by connecting Vo to VDD. VLCD will then be used directly as LCD voltage.
wim 32:59c4b8f648d4 524 // 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.
wim 32:59c4b8f648d4 525 // 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.
wim 32:59c4b8f648d4 526 // Note5: See datasheet, members of the PCF21XX family support different numbers of rows/columns. Not all can support 3 or 4 rows.
wim 32:59c4b8f648d4 527 // 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..
wim 32:59c4b8f648d4 528
wim 34:e5a0dcb43ecc 529 case PCF2103_3V3:
wim 34:e5a0dcb43ecc 530 // PCF2103 controller: No Voltage generator for VLCD, VDD=3V3..5V, VLCD input controls contrast voltage.
wim 34:e5a0dcb43ecc 531 // Initialise Display configuration
wim 34:e5a0dcb43ecc 532 switch (_type) {
wim 34:e5a0dcb43ecc 533 case LCD24x1:
wim 34:e5a0dcb43ecc 534 _function = 0x00; //FUNCTION SET 0 0 1 DL=0 4-bit, 0, M=0 1-line/24 chars display mode, 0, H=0
wim 34:e5a0dcb43ecc 535 //Note: 4 bit mode is ignored for I2C mode
wim 34:e5a0dcb43ecc 536 break;
wim 34:e5a0dcb43ecc 537
wim 34:e5a0dcb43ecc 538 // case LCD12x1D: //Special mode for PCF21XX, Only top line used
wim 34:e5a0dcb43ecc 539 case LCD12x2:
wim 34:e5a0dcb43ecc 540 _function = 0x04; //FUNCTION SET 0 0 1 DL=0 4-bit, 0, M=1 2-line/12 chars display mode, 0, H=0
wim 34:e5a0dcb43ecc 541 //Note: 4 bit mode is ignored for I2C mode
wim 34:e5a0dcb43ecc 542 break;
wim 34:e5a0dcb43ecc 543
wim 34:e5a0dcb43ecc 544 default:
wim 34:e5a0dcb43ecc 545 error("Error: LCD Controller type does not support this Display type\n\r");
wim 34:e5a0dcb43ecc 546 break;
wim 34:e5a0dcb43ecc 547
wim 34:e5a0dcb43ecc 548 } // switch type
wim 34:e5a0dcb43ecc 549
wim 34:e5a0dcb43ecc 550 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1
wim 34:e5a0dcb43ecc 551 wait_ms(10); // Wait 10ms to ensure powered up
wim 34:e5a0dcb43ecc 552
wim 34:e5a0dcb43ecc 553 // 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.
wim 34:e5a0dcb43ecc 554 _writeCommand(0x05); // Display Conf Set 0000 0, 1, P=0, Q=1 (Instr. Set 1)
wim 34:e5a0dcb43ecc 555
wim 34:e5a0dcb43ecc 556 _writeCommand(0x02); // Screen Config 0000 001, L=0 (Instr. Set 1)
wim 34:e5a0dcb43ecc 557 _writeCommand(0x08); // ICON Conf 0000 1, IM=0 (Char mode), IB=0 (no Icon blink), 0 (Instr. Set 1)
wim 34:e5a0dcb43ecc 558
wim 34:e5a0dcb43ecc 559 _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0
wim 34:e5a0dcb43ecc 560
wim 34:e5a0dcb43ecc 561 // Select CG RAM
wim 34:e5a0dcb43ecc 562 _writeCommand(0x40); //Set CG-RAM address, 8 sequential locations needed per UDC
wim 34:e5a0dcb43ecc 563 // Store UDC/Icon pattern:
wim 34:e5a0dcb43ecc 564 // 3 x 8 rows x 5 bits = 120 bits for Normal pattern (UDC 0..2) and
wim 34:e5a0dcb43ecc 565 // 3 x 8 rows x 5 bits = 120 bits for Blink pattern (UDC 4..6)
wim 34:e5a0dcb43ecc 566 for (int i=0; i<(8 * 8); i++) {
wim 34:e5a0dcb43ecc 567 // _writeData(0x1F); // All On
wim 34:e5a0dcb43ecc 568 _writeData(0x00); // All Off
wim 34:e5a0dcb43ecc 569 }
wim 34:e5a0dcb43ecc 570
wim 34:e5a0dcb43ecc 571 break; // case PCF2103_3V3 Controller
wim 34:e5a0dcb43ecc 572
wim 30:033048611c01 573 case PCF2113_3V3:
wim 32:59c4b8f648d4 574 // PCF2113 controller: Initialise Voltage booster for VLCD. VDD=3V3. VA and VB control contrast.
wim 29:a3663151aa65 575 // Initialise Display configuration
wim 29:a3663151aa65 576 switch (_type) {
wim 29:a3663151aa65 577 // case LCD12x1:
wim 33:900a94bc7585 578 // _function = 0x02; // FUNCTION SET 0 0 1 DL=0 4 bit, 0, M=0 1-line/12 chars display mode, SL=1, IS=0
wim 32:59c4b8f648d4 579 // Note: 4 bit mode is ignored for I2C mode
wim 29:a3663151aa65 580 case LCD24x1:
wim 33:900a94bc7585 581 _function = 0x00; // FUNCTION SET 0 0 1 DL=0 4 bit, 0, M=0 1-line/24 chars display mode, SL=0, IS=0
wim 32:59c4b8f648d4 582 // Note: 4 bit mode is ignored for I2C mode
wim 30:033048611c01 583 break;
wim 30:033048611c01 584
wim 30:033048611c01 585 case LCD12x2:
wim 33:900a94bc7585 586 _function = 0x04; // FUNCTION SET 0 0 1 DL=0 4 bit, 0, M=1 2-line/12 chars display mode, SL=0, IS=0
wim 30:033048611c01 587 break;
wim 30:033048611c01 588
wim 30:033048611c01 589 default:
wim 30:033048611c01 590 error("Error: LCD Controller type does not support this Display type\n\r");
wim 30:033048611c01 591 break;
wim 30:033048611c01 592
wim 30:033048611c01 593 } // switch type
wim 30:033048611c01 594
wim 32:59c4b8f648d4 595 // Init special features
wim 33:900a94bc7585 596 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1
wim 33:900a94bc7585 597
wim 33:900a94bc7585 598 _writeCommand(0x04); // Display Conf Set 0000 0, 1, P=0, Q=0 (Instr. Set 1)
wim 33:900a94bc7585 599 _writeCommand(0x10); // Temp Compensation Set 0001 0, 0, TC1=0, TC2=0 (Instr. Set 1)
wim 33:900a94bc7585 600 // _writeCommand(0x42); // HV GEN 0100 S1=1, S2=0 (2x multiplier) (Instr. Set 1)
wim 33:900a94bc7585 601 _writeCommand(0x40 | (LCD_PCF2_S12 & 0x03)); // HV Gen 0100 S1=1, S2=0 (2x multiplier) (Instr. Set 1)
wim 32:59c4b8f648d4 602
wim 32:59c4b8f648d4 603 _contrast = LCD_PCF2_CONTRAST;
wim 33:900a94bc7585 604 _writeCommand(0x80 | 0x00 | (_contrast & 0x3F)); // VLCD_set (Instr. Set 1) 1, V=0, VA=contrast
wim 33:900a94bc7585 605 _writeCommand(0x80 | 0x40 | (_contrast & 0x3F)); // VLCD_set (Instr. Set 1) 1, V=1, VB=contrast
wim 32:59c4b8f648d4 606 wait_ms(10); // Wait 10ms to ensure powered up
wim 32:59c4b8f648d4 607
wim 33:900a94bc7585 608 _writeCommand(0x02); // Screen Config 0000 001, L=0 (Instr. Set 1)
wim 33:900a94bc7585 609 _writeCommand(0x08); // ICON Conf 0000 1, IM=0 (Char mode), IB=0 (no icon blink) DM=0 (no direct mode) (Instr. Set 1)
wim 33:900a94bc7585 610
wim 33:900a94bc7585 611 _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0
wim 32:59c4b8f648d4 612
wim 30:033048611c01 613 break; // case PCF2113_3V3 Controller
wim 30:033048611c01 614
wim 30:033048611c01 615
wim 32:59c4b8f648d4 616 // case PCF2113_5V:
wim 32:59c4b8f648d4 617 // PCF2113 controller: No Voltage generator for VLCD. VDD=5V. Contrast voltage controlled by VA or VB.
wim 32:59c4b8f648d4 618 //@TODO
wim 32:59c4b8f648d4 619
wim 30:033048611c01 620
wim 30:033048611c01 621 case PCF2116_3V3:
wim 32:59c4b8f648d4 622 // PCF2116 controller: Voltage generator for VLCD. VDD=5V. V0 controls contrast voltage.
wim 30:033048611c01 623 // Initialise Display configuration
wim 30:033048611c01 624 switch (_type) {
wim 30:033048611c01 625 // case LCD12x1:
wim 30:033048611c01 626 // case LCD12x2:
wim 30:033048611c01 627 case LCD24x1:
wim 34:e5a0dcb43ecc 628 _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
wim 29:a3663151aa65 629 //Note: 4 bit mode is ignored for I2C mode
wim 29:a3663151aa65 630 wait_ms(10); // Wait 10ms to ensure powered up
wim 29:a3663151aa65 631 break;
wim 29:a3663151aa65 632
wim 32:59c4b8f648d4 633 case LCD12x3D: // Special mode for KS0078 and PCF21XX
wim 32:59c4b8f648d4 634 case LCD12x3D1: // Special mode for PCF21XX
wim 32:59c4b8f648d4 635 case LCD12x4D: // Special mode for PCF21XX:
wim 34:e5a0dcb43ecc 636 _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
wim 29:a3663151aa65 637 //Note: 4 bit mode is ignored for I2C mode
wim 29:a3663151aa65 638 wait_ms(10); // Wait 10ms to ensure powered up
wim 29:a3663151aa65 639 break;
wim 30:033048611c01 640
wim 30:033048611c01 641 case LCD24x2:
wim 34:e5a0dcb43ecc 642 _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
wim 29:a3663151aa65 643 //Note: 4 bit mode is ignored for I2C mode
wim 30:033048611c01 644 wait_ms(10); // Wait 10ms to ensure powered up
wim 32:59c4b8f648d4 645 break;
wim 32:59c4b8f648d4 646
wim 30:033048611c01 647 default:
wim 30:033048611c01 648 error("Error: LCD Controller type does not support this Display type\n\r");
wim 30:033048611c01 649 break;
wim 30:033048611c01 650
wim 29:a3663151aa65 651 } // switch type
wim 29:a3663151aa65 652
wim 30:033048611c01 653 break; // case PCF2116_3V3 Controller
wim 29:a3663151aa65 654
wim 32:59c4b8f648d4 655
wim 32:59c4b8f648d4 656 //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
wim 32:59c4b8f648d4 657 //@TODO
wim 32:59c4b8f648d4 658 case PCF2116_5V:
wim 32:59c4b8f648d4 659 // PCF2116 controller: No Voltage generator for VLCD. VDD=5V. V0 controls contrast voltage.
wim 32:59c4b8f648d4 660 // Initialise Display configuration
wim 32:59c4b8f648d4 661 switch (_type) {
wim 32:59c4b8f648d4 662 // case LCD12x1:
wim 32:59c4b8f648d4 663 // case LCD12x2:
wim 32:59c4b8f648d4 664 // case LCD24x1:
wim 34:e5a0dcb43ecc 665 // _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
wim 32:59c4b8f648d4 666 //Note: 4 bit mode is ignored for I2C mode
wim 32:59c4b8f648d4 667 // wait_ms(10); // Wait 10ms to ensure powered up
wim 32:59c4b8f648d4 668 // break;
wim 32:59c4b8f648d4 669
wim 32:59c4b8f648d4 670 case LCD12x3D: // Special mode for KS0078 and PCF21XX
wim 32:59c4b8f648d4 671 case LCD12x3D1: // Special mode for PCF21XX
wim 32:59c4b8f648d4 672 case LCD12x4D: // Special mode for PCF21XX:
wim 32:59c4b8f648d4 673 // _writeCommand(0x34); //FUNCTION SET 8 bit, N=0/M=1 4-line/12 chars display mode OK
wim 32:59c4b8f648d4 674 // _writeCommand(0x24); //FUNCTION SET 4 bit, N=0/M=1 4-line/12 chars display mode OK
wim 34:e5a0dcb43ecc 675 _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
wim 32:59c4b8f648d4 676 //Note: 4 bit mode is ignored for I2C mode
wim 32:59c4b8f648d4 677 wait_ms(10); // Wait 10ms to ensure powered up
wim 32:59c4b8f648d4 678 break;
wim 32:59c4b8f648d4 679
wim 32:59c4b8f648d4 680 // case LCD24x2:
wim 32:59c4b8f648d4 681 // _writeCommand(0x28); //FUNCTION SET 4 bit, N=1/M=0 2-line/24 chars display mode
wim 32:59c4b8f648d4 682 //Note: 4 bit mode is ignored for I2C mode
wim 32:59c4b8f648d4 683 // wait_ms(10); // Wait 10ms to ensure powered up
wim 32:59c4b8f648d4 684 // break;
wim 32:59c4b8f648d4 685
wim 32:59c4b8f648d4 686 default:
wim 32:59c4b8f648d4 687 error("Error: LCD Controller type does not support this Display type\n\r");
wim 32:59c4b8f648d4 688 break;
wim 32:59c4b8f648d4 689
wim 32:59c4b8f648d4 690 } // switch type
wim 32:59c4b8f648d4 691
wim 32:59c4b8f648d4 692 break; // case PCF2116_5V Controller
wim 32:59c4b8f648d4 693
wim 32:59c4b8f648d4 694 case PCF2119_3V3:
wim 32:59c4b8f648d4 695 // PCF2119 controller: Initialise Voltage booster for VLCD. VDD=3V3. VA and VB control contrast.
wim 32:59c4b8f648d4 696 // Note1: See datasheet, the PCF2119 supports icons and provides separate constrast control for Icons and characters.
wim 32:59c4b8f648d4 697 // Note2: Vgen is switched off when the contrast voltage VA or VB is set to 0x00.
wim 32:59c4b8f648d4 698
wim 32:59c4b8f648d4 699 //POR or Hardware Reset should be applied
wim 32:59c4b8f648d4 700 wait_ms(10); // Wait 10ms to ensure powered up
wim 32:59c4b8f648d4 701
wim 32:59c4b8f648d4 702 // Initialise Display configuration
wim 32:59c4b8f648d4 703 switch (_type) {
wim 32:59c4b8f648d4 704 case LCD8x1:
wim 32:59c4b8f648d4 705 // case LCD12x1:
wim 32:59c4b8f648d4 706 case LCD16x1:
wim 34:e5a0dcb43ecc 707 _function = 0x02; // FUNCTION SET 0 0 1 DL=0 4-bit, 0 , M=0 1-line/16 chars display mode, SL=1
wim 32:59c4b8f648d4 708 // Note: 4 bit mode is ignored for I2C mode
wim 32:59c4b8f648d4 709 break;
wim 32:59c4b8f648d4 710
wim 32:59c4b8f648d4 711 case LCD24x1:
wim 32:59c4b8f648d4 712 // case LCD32x1:
wim 34:e5a0dcb43ecc 713 _function = 0x00; // FUNCTION SET 0 0 1 DL=0 4-bit, 0 , M=0 1-line/32 chars display mode, SL=0
wim 32:59c4b8f648d4 714 // Note: 4 bit mode is ignored for I2C mode
wim 32:59c4b8f648d4 715 break;
wim 32:59c4b8f648d4 716
wim 32:59c4b8f648d4 717 case LCD8x2:
wim 32:59c4b8f648d4 718 // case LCD12x2:
wim 32:59c4b8f648d4 719 case LCD16x2:
wim 34:e5a0dcb43ecc 720 _function = 0x04; // FUNCTION SET 0 0 1 DL=0 4-bit, 0, M=1 2-line/16 chars display mode, SL=0
wim 32:59c4b8f648d4 721 // Note: 4 bit mode is ignored for I2C mode
wim 32:59c4b8f648d4 722 break;
wim 32:59c4b8f648d4 723
wim 32:59c4b8f648d4 724 default:
wim 32:59c4b8f648d4 725 error("Error: LCD Controller type does not support this Display type\n\r");
wim 32:59c4b8f648d4 726 break;
wim 32:59c4b8f648d4 727
wim 32:59c4b8f648d4 728 } // switch type
wim 32:59c4b8f648d4 729
wim 32:59c4b8f648d4 730 // Init special features
wim 32:59c4b8f648d4 731 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instruction Set = 1
wim 32:59c4b8f648d4 732
wim 32:59c4b8f648d4 733 _writeCommand(0x04); // DISP CONF SET (Instr. Set 1) 0000, 0, 1, P=0, Q=0
wim 32:59c4b8f648d4 734 _writeCommand(0x10); // TEMP CTRL SET (Instr. Set 1) 0001, 0, 0, TC1=0, TC2=0
wim 32:59c4b8f648d4 735 // _writeCommand(0x42); // HV GEN (Instr. Set 1) 0100, 0, 0, S1=1, S2=0 (2x multiplier)
wim 32:59c4b8f648d4 736 _writeCommand(0x40 | (LCD_PCF2_S12 & 0x03)); // HV GEN (Instr. Set 1) 0100, 0, 0, S1=1, S2=0 (2x multiplier)
wim 32:59c4b8f648d4 737
wim 32:59c4b8f648d4 738 _contrast = LCD_PCF2_CONTRAST;
wim 32:59c4b8f648d4 739 _writeCommand(0x80 | 0x00 | (_contrast & 0x3F)); // VLCD_set (Instr. Set 1) V=0, VA=contrast
wim 32:59c4b8f648d4 740 _writeCommand(0x80 | 0x40 | (_contrast & 0x3F)); // VLCD_set (Instr. Set 1) V=1, VB=contrast
wim 32:59c4b8f648d4 741 wait_ms(10); // Wait 10ms to ensure powered up
wim 32:59c4b8f648d4 742
wim 32:59c4b8f648d4 743 _writeCommand(0x02); // SCRN CONF (Instr. Set 1) L=0
wim 32:59c4b8f648d4 744 _writeCommand(0x08); // ICON CONF (Instr. Set 1) IM=0 (Char mode) IB=0 (no icon blink) DM=0 (no direct mode)
wim 32:59c4b8f648d4 745
wim 32:59c4b8f648d4 746 _writeCommand(0x20 | _function); // Select Instruction Set = 0
wim 32:59c4b8f648d4 747
wim 32:59c4b8f648d4 748 break; // case PCF2119_3V3 Controller
wim 32:59c4b8f648d4 749
wim 32:59c4b8f648d4 750 // case PCF2119_5V:
wim 32:59c4b8f648d4 751 // PCF2119 controller: No Voltage booster for VLCD. VDD=3V3. VA and VB control contrast.
wim 32:59c4b8f648d4 752 // Note1: See datasheet, the PCF2119 supports icons and provides separate constrast control for Icons and characters.
wim 32:59c4b8f648d4 753 // Note2: Vgen is switched off when the contrast voltage VA or VB is set to 0x00.
wim 30:033048611c01 754 //@TODO
wim 29:a3663151aa65 755
wim 19:c747b9e2e7b8 756 case WS0010:
wim 19:c747b9e2e7b8 757 // WS0010 OLED controller: Initialise DC/DC Voltage converter for LEDs
wim 30:033048611c01 758 // Note1: Identical to RS0010
wim 30:033048611c01 759 // Note2: supports 1 or 2 lines (and 16x100 graphics)
wim 30:033048611c01 760 // supports 4 fonts (English/Japanese (default), Western European-I, English/Russian, Western European-II)
wim 19:c747b9e2e7b8 761 // Cursor/Disp shift set 0001 SC RL 0 0
wim 19:c747b9e2e7b8 762 //
wim 30:033048611c01 763 // Mode and Power set 0001 GC PWR 1 1
wim 19:c747b9e2e7b8 764 // GC = 0 (Graph Mode=1, Char Mode=0)
wim 30:033048611c01 765 // PWR = 1 (DC/DC On/Off)
wim 30:033048611c01 766
wim 30:033048611c01 767 //@Todo: This may be needed to enable a warm reboot
wim 32:59c4b8f648d4 768 //_writeCommand(0x13); // Char mode, DC/DC off
wim 30:033048611c01 769 //wait_ms(10); // Wait 10ms to ensure powered down
wim 32:59c4b8f648d4 770 _writeCommand(0x17); // Char mode, DC/DC on
wim 30:033048611c01 771 wait_ms(10); // Wait 10ms to ensure powered up
wim 29:a3663151aa65 772
wim 29:a3663151aa65 773 // Initialise Display configuration
wim 29:a3663151aa65 774 switch (_type) {
wim 29:a3663151aa65 775 case LCD8x1: //8x1 is a regular 1 line display
wim 29:a3663151aa65 776 case LCD8x2B: //8x2B is a special case of 16x1
wim 29:a3663151aa65 777 // case LCD12x1:
wim 29:a3663151aa65 778 case LCD16x1:
wim 30:033048611c01 779 case LCD24x1:
wim 30:033048611c01 780 _writeCommand(0x20); // Function set 001 DL N F FT1 FT0
wim 30:033048611c01 781 // DL=0 (4 bits bus)
wim 30:033048611c01 782 // N=0 (1 line)
wim 30:033048611c01 783 // F=0 (5x7 dots font)
wim 30:033048611c01 784 // FT=00 (00 = Engl/Jap, 01 = WestEur1, 10 = Engl/Russian, 11 = WestEur2
wim 30:033048611c01 785 break;
wim 30:033048611c01 786
wim 32:59c4b8f648d4 787 case LCD12x3D: // Special mode for KS0078 and PCF21XX
wim 32:59c4b8f648d4 788 case LCD12x3D1: // Special mode for PCF21XX
wim 32:59c4b8f648d4 789 case LCD12x4D: // Special mode for PCF21XX:
wim 33:900a94bc7585 790 case LCD16x3G: // Special mode for ST7036
wim 30:033048611c01 791 case LCD24x4D: // Special mode for KS0078
wim 30:033048611c01 792 error("Error: LCD Controller type does not support this Display type\n\r");
wim 29:a3663151aa65 793 break;
wim 29:a3663151aa65 794
wim 29:a3663151aa65 795 default:
wim 30:033048611c01 796 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4)
wim 30:033048611c01 797 _writeCommand(0x28); // Function set 001 DL N F FT1 FT0
wim 30:033048611c01 798 // DL=0 (4 bits bus)
wim 30:033048611c01 799 // N=1 (2 lines)
wim 30:033048611c01 800 // F=0 (5x7 dots font)
wim 30:033048611c01 801 // FT=00 (00 = Engl/Jap, 01 = WestEur1, 10 = Engl/Russian, 11 = WestEur2
wim 30:033048611c01 802
wim 29:a3663151aa65 803 break;
wim 29:a3663151aa65 804 } // switch type
wim 29:a3663151aa65 805
wim 32:59c4b8f648d4 806 break; // case WS0010 Controller
wim 33:900a94bc7585 807
wim 33:900a94bc7585 808
wim 33:900a94bc7585 809 case US2066_3V3:
wim 33:900a94bc7585 810 // US2066/SSD1311 OLED controller, Initialise for VDD=3V3
wim 33:900a94bc7585 811 // Note: supports 1,2, 3 or 4 lines
wim 33:900a94bc7585 812 // case USS2066_5V:
wim 33:900a94bc7585 813 // US2066 controller, VDD=5V
wim 33:900a94bc7585 814
wim 33:900a94bc7585 815 // Initialise Display configuration
wim 33:900a94bc7585 816 switch (_type) {
wim 33:900a94bc7585 817 case LCD8x1: //8x1 is a regular 1 line display
wim 33:900a94bc7585 818 case LCD8x2B: //8x2D is a special case of 16x1
wim 33:900a94bc7585 819 // case LCD12x1:
wim 33:900a94bc7585 820 case LCD16x1:
wim 33:900a94bc7585 821 // case LCD20x1:
wim 33:900a94bc7585 822 _function = 0x00; // Set function 0 0 1 X N DH RE(0) IS
wim 33:900a94bc7585 823 // Saved to allow switch between Instruction sets at later time
wim 33:900a94bc7585 824 // DL=X bit is ignored for US2066. Uses hardwired pins instead
wim 33:900a94bc7585 825 // N=0 1 Line / 3 Line
wim 33:900a94bc7585 826 // DH=0 Double Height disable
wim 33:900a94bc7585 827 // IS=0
wim 33:900a94bc7585 828
wim 33:900a94bc7585 829 _function_1 = 0x02; // Set function, 0 0 1 X N BE RE(1) REV
wim 33:900a94bc7585 830 // Saved to allow switch between Instruction sets at later time
wim 33:900a94bc7585 831 // DL=X bit is ignored for US2066. Uses hardwired pins instead
wim 33:900a94bc7585 832 // N=0 1 Line / 3 Line
wim 33:900a94bc7585 833 // BE=0 Blink Enable off, special feature of SSD1803, US2066
wim 33:900a94bc7585 834 // REV=0 Reverse off, special feature of SSD1803, US2066
wim 33:900a94bc7585 835
wim 33:900a94bc7585 836 _lines = 0x00; // Ext function set 0 0 0 0 1 FW BW NW
wim 33:900a94bc7585 837 // NW=0 1-Line LCD (N=0)
wim 33:900a94bc7585 838 break;
wim 33:900a94bc7585 839
wim 33:900a94bc7585 840 case LCD16x1C:
wim 33:900a94bc7585 841 case LCD8x2:
wim 33:900a94bc7585 842 case LCD16x2:
wim 33:900a94bc7585 843 case LCD20x2:
wim 33:900a94bc7585 844 _function = 0x08; // Set function 0 0 1 X N DH RE(0) IS
wim 33:900a94bc7585 845 // Saved to allow switch between Instruction sets at later time
wim 33:900a94bc7585 846 // DL=X bit is ignored for US2066. Uses hardwired pins instead
wim 33:900a94bc7585 847 // N=1 2 line / 4 Line
wim 33:900a94bc7585 848 // DH=0 Double Height disable
wim 33:900a94bc7585 849 // IS=0
wim 33:900a94bc7585 850
wim 33:900a94bc7585 851 _function_1 = 0x0A; // Set function, 0 0 1 X N BE RE(1) REV
wim 33:900a94bc7585 852 // Saved to allow switch between Instruction sets at later time
wim 33:900a94bc7585 853 // DL=X bit is ignored for US2066. Uses hardwired pins instead
wim 33:900a94bc7585 854 // N=1 2 line / 4 Line
wim 33:900a94bc7585 855 // BE=0 Blink Enable off, special feature of SSD1803, US2066
wim 33:900a94bc7585 856 // REV=0 Reverse off, special feature of SSD1803, US2066
wim 33:900a94bc7585 857
wim 33:900a94bc7585 858 _lines = 0x00; // Ext function set 0 0 0 0 1 FW BW NW
wim 33:900a94bc7585 859 // NW=0 2-Line LCD (N=1)
wim 33:900a94bc7585 860 break;
wim 33:900a94bc7585 861
wim 33:900a94bc7585 862 case LCD12x3D: // Special mode for KS0078 and PCF21XX
wim 33:900a94bc7585 863 // case LCD12x3D1: // Special mode for KS0078 and PCF21XX
wim 33:900a94bc7585 864 case LCD16x3D: // Special mode for KS0078, SSD1803 and US2066
wim 33:900a94bc7585 865 // case LCD16x3D1: // Special mode for SSD1803, US2066
wim 33:900a94bc7585 866 // case LCD20x3D: // Special mode for SSD1803, US2066
wim 33:900a94bc7585 867 _function = 0x00; // Set function 0 0 1 X N DH RE(0) IS
wim 33:900a94bc7585 868 // Saved to allow switch between Instruction sets at later time
wim 33:900a94bc7585 869 // DL=X bit is ignored for US2066. Uses hardwired pins instead
wim 33:900a94bc7585 870 // N=0 1 Line / 3 Line
wim 33:900a94bc7585 871 // DH=0 Double Height disable
wim 33:900a94bc7585 872 // IS=0
wim 33:900a94bc7585 873
wim 33:900a94bc7585 874 _function_1 = 0x02; // Set function, 0 0 1 X N BE RE(1) REV
wim 33:900a94bc7585 875 // Saved to allow switch between Instruction sets at later time
wim 33:900a94bc7585 876 // DL=X bit is ignored for US2066. Uses hardwired pins instead
wim 33:900a94bc7585 877 // N=0 1 Line / 3 Line
wim 33:900a94bc7585 878 // BE=0 Blink Enable off, special feature of SSD1803, US2066
wim 33:900a94bc7585 879 // REV=0 Reverse off, special feature of SSD1803, US2066
wim 33:900a94bc7585 880
wim 33:900a94bc7585 881 _lines = 0x00; // Ext function set 0 0 0 0 1 FW BW NW
wim 33:900a94bc7585 882 // NW=1 3-Line LCD (N=0)
wim 33:900a94bc7585 883 break;
wim 33:900a94bc7585 884
wim 33:900a94bc7585 885 case LCD20x4D: // Special mode for SSD1803, US2066
wim 33:900a94bc7585 886 _function = 0x08; // Set function 0 0 1 X N DH RE(0) IS
wim 33:900a94bc7585 887 // Saved to allow switch between Instruction sets at later time
wim 33:900a94bc7585 888 // DL=X bit is ignored for US2066. Uses hardwired pins instead
wim 33:900a94bc7585 889 // N=1 2 line / 4 Line
wim 33:900a94bc7585 890 // DH=0 Double Height disable
wim 33:900a94bc7585 891 // IS=0
wim 33:900a94bc7585 892
wim 33:900a94bc7585 893 _function_1 = 0x0A; // Set function, 0 0 1 DL N BE RE(1) REV
wim 33:900a94bc7585 894 // Saved to allow switch between Instruction sets at later time
wim 33:900a94bc7585 895 // DL=0 bit is ignored for US2066. Uses hardwired pins instead
wim 33:900a94bc7585 896 // N=1 2 line / 4 Line
wim 33:900a94bc7585 897 // BE=0 Blink Enable off, special feature of SSD1803, US2066
wim 33:900a94bc7585 898 // REV=0 Reverse off, special feature of SSD1803, US2066
wim 33:900a94bc7585 899
wim 33:900a94bc7585 900 _lines = 0x01; // Ext function set 0 0 0 0 1 FW BW NW
wim 33:900a94bc7585 901 // NW=1 4-Line LCD (N=1)
wim 33:900a94bc7585 902 break;
wim 33:900a94bc7585 903
wim 33:900a94bc7585 904 // case LCD24x1:
wim 33:900a94bc7585 905 // case LCD16x3G: // Special mode for ST7036
wim 33:900a94bc7585 906 // case LCD24x4D: // Special mode for KS0078
wim 33:900a94bc7585 907 default:
wim 33:900a94bc7585 908 error("Error: LCD Controller type does not support this Display type\n\r");
wim 33:900a94bc7585 909 break;
wim 33:900a94bc7585 910
wim 33:900a94bc7585 911 } // switch type
wim 33:900a94bc7585 912
wim 34:e5a0dcb43ecc 913 _writeCommand(0x00); // NOP, make sure to sync SPI
wim 33:900a94bc7585 914
wim 33:900a94bc7585 915 // init special features
wim 33:900a94bc7585 916 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV
wim 33:900a94bc7585 917 // Select Extended Instruction Set
wim 33:900a94bc7585 918
wim 33:900a94bc7585 919 _writeCommand(0x71); // Function Select A: 0 1 1 1 0 0 0 1 (Ext Instr Set)
wim 33:900a94bc7585 920 _writeData(0x00); // Disable Internal VDD
wim 33:900a94bc7585 921
wim 33:900a94bc7585 922 _writeCommand(0x79); // Function Select OLED: 0 1 1 1 1 0 0 1 (Ext Instr Set)
wim 33:900a94bc7585 923
wim 33:900a94bc7585 924 _writeCommand(0xD5); // Display Clock Divide Ratio: 1 1 0 1 0 1 0 1 (Ext Instr Set, OLED Instr Set)
wim 33:900a94bc7585 925 _writeCommand(0x70); // Display Clock Divide Ratio value: 0 1 1 1 0 0 0 0 (Ext Instr Set, OLED Instr Set)
wim 33:900a94bc7585 926
wim 33:900a94bc7585 927 _writeCommand(0x78); // Function Disable OLED: 0 1 1 1 1 0 0 0 (Ext Instr Set)
wim 33:900a94bc7585 928
wim 33:900a94bc7585 929 // _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)
wim 33:900a94bc7585 930 _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)
wim 33:900a94bc7585 931
wim 33:900a94bc7585 932 _writeCommand(0x08 | _lines); // Set ext function 0 0 0 0 1 FW BW NW 1,2,3 or 4 lines (Ext Instr Set)
wim 33:900a94bc7585 933
wim 34:e5a0dcb43ecc 934 // _writeCommand(0x1C); // Double Height, 0 0 0 1 UD2=1, UD1=1, X, DH'=0 (Ext Instr Set)
wim 33:900a94bc7585 935 // // Default
wim 33:900a94bc7585 936
wim 33:900a94bc7585 937 _writeCommand(0x72); // Function Select B: 0 1 1 1 0 0 1 0 (Ext Instr Set)
wim 33:900a94bc7585 938 _writeData(0x01); // Select ROM A (CGRAM 8, CGROM 248)
wim 33:900a94bc7585 939
wim 33:900a94bc7585 940 _writeCommand(0x79); // Function Select OLED: 0 1 1 1 1 0 0 1 (Ext Instr Set)
wim 33:900a94bc7585 941
wim 33:900a94bc7585 942 _writeCommand(0xDA); // Set Segm Pins Config: 1 1 0 1 1 0 1 0 (Ext Instr Set, OLED)
wim 33:900a94bc7585 943 _writeCommand(0x10); // Set Segm Pins Config value: Altern Odd/Even, Disable Remap (Ext Instr Set, OLED)
wim 33:900a94bc7585 944
wim 33:900a94bc7585 945 _writeCommand(0xDC); // Function Select C: 1 1 0 1 1 1 0 0 (Ext Instr Set, OLED)
wim 33:900a94bc7585 946 // _writeCommand(0x00); // Set internal VSL, GPIO pin HiZ (always read low)
wim 33:900a94bc7585 947 _writeCommand(0x80); // Set external VSL, GPIO pin HiZ (always read low)
wim 33:900a94bc7585 948
wim 33:900a94bc7585 949 _contrast = LCD_US20_CONTRAST;
wim 33:900a94bc7585 950 _writeCommand(0x81); // Set Contrast Control: 1 0 0 0 0 0 0 1 (Ext Instr Set, OLED)
wim 33:900a94bc7585 951 _writeCommand((_contrast << 2) | 0x03); // Set Contrast Value: 8 bits, use 6 bits for compatibility
wim 33:900a94bc7585 952
wim 33:900a94bc7585 953 _writeCommand(0xD9); // Set Phase Length: 1 1 0 1 1 0 0 1 (Ext Instr Set, OLED)
wim 33:900a94bc7585 954 _writeCommand(0xF1); // Set Phase Length Value:
wim 33:900a94bc7585 955
wim 33:900a94bc7585 956 _writeCommand(0xDB); // Set VCOMH Deselect Lvl: 1 1 0 1 1 0 1 1 (Ext Instr Set, OLED)
wim 33:900a94bc7585 957 _writeCommand(0x30); // Set VCOMH Deselect Value: 0.83 x VCC
wim 33:900a94bc7585 958
wim 33:900a94bc7585 959 wait_ms(10); // Wait 10ms to ensure powered up
wim 33:900a94bc7585 960
wim 33:900a94bc7585 961 //Test Fade/Blinking. Hard Blink on/off, No fade in/out ??
wim 33:900a94bc7585 962 // _writeCommand(0x23); // Set (Ext Instr Set, OLED)
wim 33:900a94bc7585 963 // _writeCommand(0x3F); // Set interval 128 frames
wim 33:900a94bc7585 964 //End Test Blinking
wim 33:900a94bc7585 965
wim 33:900a94bc7585 966 _writeCommand(0x78); // Function Disable OLED: 0 1 1 1 1 0 0 0 (Ext Instr Set)
wim 33:900a94bc7585 967
wim 33:900a94bc7585 968 _writeCommand(0x20 | _function | 0x01); // Set function, 0 0 1 X N DH RE(0) IS=1 Select Instruction Set 1
wim 33:900a94bc7585 969 // Select Std Instr set, Select IS=1
wim 33:900a94bc7585 970
wim 33:900a94bc7585 971 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV
wim 33:900a94bc7585 972 // Select Ext Instr Set, IS=1
wim 33:900a94bc7585 973 _writeCommand(0x10); // Shift/Scroll enable, 0 0 0 1 DS4/HS4 DS3/HS3 DS2/HS2 DS1/HS1 (Ext Instr Set, IS=1)
wim 33:900a94bc7585 974
wim 33:900a94bc7585 975 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
wim 34:e5a0dcb43ecc 976 // Select Std Instr set, Select IS=0
wim 33:900a94bc7585 977 break; // case US2066/SSD1311 Controller
wim 33:900a94bc7585 978
wim 34:e5a0dcb43ecc 979 //not yet tested on hardware
wim 34:e5a0dcb43ecc 980 case PT6314 :
wim 34:e5a0dcb43ecc 981 // Initialise Display configuration
wim 34:e5a0dcb43ecc 982 switch (_type) {
wim 34:e5a0dcb43ecc 983 case LCD8x1: //8x1 is a regular 1 line display
wim 34:e5a0dcb43ecc 984 case LCD8x2B: //8x2B is a special case of 16x1
wim 34:e5a0dcb43ecc 985 // case LCD12x1:
wim 34:e5a0dcb43ecc 986 case LCD16x1:
wim 34:e5a0dcb43ecc 987 case LCD20x1:
wim 34:e5a0dcb43ecc 988 case LCD24x1:
wim 34:e5a0dcb43ecc 989 _function = 0x00; // Function set 001 DL N X BR1 BR0
wim 34:e5a0dcb43ecc 990 // DL=0 (4 bits bus)
wim 34:e5a0dcb43ecc 991 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 34:e5a0dcb43ecc 992 // N=0 (1 line)
wim 34:e5a0dcb43ecc 993 // X
wim 34:e5a0dcb43ecc 994 // BR1=0 (2 significant bits for brightness
wim 34:e5a0dcb43ecc 995 // BR0=0
wim 34:e5a0dcb43ecc 996 // 0x0 = 100%
wim 34:e5a0dcb43ecc 997 // 0x1 = 75%
wim 34:e5a0dcb43ecc 998 // 0x2 = 50%
wim 34:e5a0dcb43ecc 999 // 0x3 = 25%
wim 34:e5a0dcb43ecc 1000
wim 34:e5a0dcb43ecc 1001 break;
wim 34:e5a0dcb43ecc 1002
wim 34:e5a0dcb43ecc 1003 // All other valid LCD types are initialised as 2 Line displays
wim 34:e5a0dcb43ecc 1004 case LCD8x2:
wim 34:e5a0dcb43ecc 1005 case LCD16x2:
wim 34:e5a0dcb43ecc 1006 case LCD20x2:
wim 34:e5a0dcb43ecc 1007 case LCD24x2:
wim 34:e5a0dcb43ecc 1008 _function = 0x08; // Function set 001 DL N X BR1 BR2
wim 34:e5a0dcb43ecc 1009 // DL=0 (4 bits bus)
wim 34:e5a0dcb43ecc 1010 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 34:e5a0dcb43ecc 1011 // N=1 (2 lines)
wim 34:e5a0dcb43ecc 1012 // X
wim 34:e5a0dcb43ecc 1013 // BR1=0 (2 significant bits for brightness
wim 34:e5a0dcb43ecc 1014 // BR0=0
wim 34:e5a0dcb43ecc 1015 break;
wim 34:e5a0dcb43ecc 1016
wim 34:e5a0dcb43ecc 1017 default:
wim 34:e5a0dcb43ecc 1018 error("Error: LCD Controller type does not support this Display type\n\r");
wim 34:e5a0dcb43ecc 1019 break;
wim 34:e5a0dcb43ecc 1020 } // switch type
wim 34:e5a0dcb43ecc 1021
wim 34:e5a0dcb43ecc 1022 _contrast = LCD_PT63_CONTRAST;
wim 34:e5a0dcb43ecc 1023 _writeCommand(0x20 | _function | ((~_contrast) >> 4)); // Invert and shift to use 2 MSBs
wim 34:e5a0dcb43ecc 1024 break; // case PT6314 Controller (VFD)
wim 29:a3663151aa65 1025
wim 19:c747b9e2e7b8 1026 default:
wim 32:59c4b8f648d4 1027 // Devices fully compatible to HD44780 that do not use any DC/DC Voltage converters but external VLCD, no icons etc
wim 10:dd9b3a696acd 1028
wim 29:a3663151aa65 1029 // Initialise Display configuration
wim 29:a3663151aa65 1030 switch (_type) {
wim 29:a3663151aa65 1031 case LCD8x1: //8x1 is a regular 1 line display
wim 29:a3663151aa65 1032 case LCD8x2B: //8x2B is a special case of 16x1
wim 29:a3663151aa65 1033 // case LCD12x1:
wim 29:a3663151aa65 1034 case LCD16x1:
wim 30:033048611c01 1035 // case LCD20x1:
wim 29:a3663151aa65 1036 case LCD24x1:
wim 30:033048611c01 1037 // case LCD40x1:
wim 32:59c4b8f648d4 1038 _function = 0x00; // Function set 001 DL N F - -
wim 29:a3663151aa65 1039 // DL=0 (4 bits bus)
wim 29:a3663151aa65 1040 // N=0 (1 line)
wim 29:a3663151aa65 1041 // F=0 (5x7 dots font)
wim 29:a3663151aa65 1042 break;
wim 29:a3663151aa65 1043
wim 32:59c4b8f648d4 1044 case LCD12x3D: // Special mode for KS0078 and PCF21XX
wim 32:59c4b8f648d4 1045 case LCD12x3D1: // Special mode for KS0078 and PCF21XX
wim 32:59c4b8f648d4 1046 case LCD12x4D: // Special mode for KS0078 and PCF21XX:
wim 33:900a94bc7585 1047 case LCD16x3D: // Special mode for KS0078
wim 32:59c4b8f648d4 1048 // case LCD16x3D1: // Special mode for KS0078
wim 30:033048611c01 1049 // case LCD24x3D: // Special mode for KS0078
wim 32:59c4b8f648d4 1050 // case LCD24x3D1: // Special mode for KS0078
wim 30:033048611c01 1051 case LCD24x4D: // Special mode for KS0078
wim 30:033048611c01 1052 error("Error: LCD Controller type does not support this Display type\n\r");
wim 30:033048611c01 1053 break;
wim 30:033048611c01 1054
wim 30:033048611c01 1055 // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4)
wim 29:a3663151aa65 1056 default:
wim 32:59c4b8f648d4 1057 _function = 0x08; // Function set 001 DL N F - -
wim 29:a3663151aa65 1058 // DL=0 (4 bits bus)
wim 29:a3663151aa65 1059 // Note: 4 bit mode is ignored for native SPI and I2C devices
wim 29:a3663151aa65 1060 // N=1 (2 lines)
wim 29:a3663151aa65 1061 // F=0 (5x7 dots font, only option for 2 line display)
wim 32:59c4b8f648d4 1062 // - (Don't care)
wim 29:a3663151aa65 1063 break;
wim 29:a3663151aa65 1064 } // switch type
wim 10:dd9b3a696acd 1065
wim 34:e5a0dcb43ecc 1066 _writeCommand(0x20 | _function);
wim 29:a3663151aa65 1067 break; // case default Controller
wim 29:a3663151aa65 1068
wim 34:e5a0dcb43ecc 1069 } // switch Controller specific initialisations
wim 10:dd9b3a696acd 1070
wim 30:033048611c01 1071 // Controller general initialisations
wim 32:59c4b8f648d4 1072 // _writeCommand(0x01); // cls, and set cursor to 0
wim 32:59c4b8f648d4 1073 // wait_ms(10); // The CLS command takes 1.64 ms.
wim 32:59c4b8f648d4 1074 // // Since we are not using the Busy flag, Lets be safe and take 10 ms
wim 28:30fa94f7341c 1075
wim 28:30fa94f7341c 1076 _writeCommand(0x02); // Return Home
wim 28:30fa94f7341c 1077 // Cursor Home, DDRAM Address to Origin
wim 28:30fa94f7341c 1078
wim 28:30fa94f7341c 1079 _writeCommand(0x06); // Entry Mode 0000 0 1 I/D S
wim 13:24506ba22480 1080 // Cursor Direction and Display Shift
wim 28:30fa94f7341c 1081 // I/D=1 (Cur incr)
wim 28:30fa94f7341c 1082 // S=0 (No display shift)
wim 10:dd9b3a696acd 1083
wim 29:a3663151aa65 1084 _writeCommand(0x14); // Cursor or Display shift 0001 S/C R/L x x
wim 29:a3663151aa65 1085 // S/C=0 Cursor moves
wim 29:a3663151aa65 1086 // R/L=1 Right
wim 29:a3663151aa65 1087 //
wim 29:a3663151aa65 1088
wim 13:24506ba22480 1089 // _writeCommand(0x0C); // Display Ctrl 0000 1 D C B
wim 17:652ab113bc2e 1090 // // Display On, Cursor Off, Blink Off
wim 21:9eb628d9e164 1091 setCursor(CurOff_BlkOff);
wim 21:9eb628d9e164 1092 setMode(DispOn);
simon 1:ac48b187213c 1093 }
simon 1:ac48b187213c 1094
wim 8:03116f75b66e 1095
wim 21:9eb628d9e164 1096 /** Clear the screen, Cursor home.
wim 21:9eb628d9e164 1097 */
wim 21:9eb628d9e164 1098 void TextLCD_Base::cls() {
wim 15:b70ebfffb258 1099
wim 15:b70ebfffb258 1100 // Select and configure second LCD controller when needed
wim 15:b70ebfffb258 1101 if(_type==LCD40x4) {
wim 21:9eb628d9e164 1102 _ctrl_idx=_LCDCtrl_1; // Select 2nd controller
wim 15:b70ebfffb258 1103
wim 15:b70ebfffb258 1104 // Second LCD controller Cursor always Off
wim 21:9eb628d9e164 1105 _setCursorAndDisplayMode(_currentMode, CurOff_BlkOff);
wim 15:b70ebfffb258 1106
wim 15:b70ebfffb258 1107 // Second LCD controller Clearscreen
wim 27:22d5086f6ba6 1108 _writeCommand(0x01); // cls, and set cursor to 0
wim 29:a3663151aa65 1109 wait_ms(10); // The CLS command takes 1.64 ms.
wim 29:a3663151aa65 1110 // Since we are not using the Busy flag, Lets be safe and take 10 ms
wim 15:b70ebfffb258 1111
wim 21:9eb628d9e164 1112 _ctrl_idx=_LCDCtrl_0; // Select primary controller
wim 15:b70ebfffb258 1113 }
wim 15:b70ebfffb258 1114
wim 15:b70ebfffb258 1115 // Primary LCD controller Clearscreen
wim 27:22d5086f6ba6 1116 _writeCommand(0x01); // cls, and set cursor to 0
wim 29:a3663151aa65 1117 wait_ms(10); // The CLS command takes 1.64 ms.
wim 29:a3663151aa65 1118 // Since we are not using the Busy flag, Lets be safe and take 10 ms
wim 15:b70ebfffb258 1119
wim 15:b70ebfffb258 1120 // Restore cursormode on primary LCD controller when needed
wim 15:b70ebfffb258 1121 if(_type==LCD40x4) {
wim 17:652ab113bc2e 1122 _setCursorAndDisplayMode(_currentMode,_currentCursor);
wim 15:b70ebfffb258 1123 }
wim 15:b70ebfffb258 1124
wim 29:a3663151aa65 1125 setAddress(0, 0); // Reset Cursor location
wim 32:59c4b8f648d4 1126 // Note: This is needed because some displays (eg PCF21XX) don't use line 0 in the '3 Line' mode.
simon 1:ac48b187213c 1127 }
simon 1:ac48b187213c 1128
wim 29:a3663151aa65 1129 /** Locate cursor to a screen column and row
wim 29:a3663151aa65 1130 *
wim 29:a3663151aa65 1131 * @param column The horizontal position from the left, indexed from 0
wim 29:a3663151aa65 1132 * @param row The vertical position from the top, indexed from 0
wim 29:a3663151aa65 1133 */
wim 21:9eb628d9e164 1134 void TextLCD_Base::locate(int column, int row) {
wim 15:b70ebfffb258 1135
wim 15:b70ebfffb258 1136 // setAddress() does all the heavy lifting:
wim 15:b70ebfffb258 1137 // check column and row sanity,
wim 15:b70ebfffb258 1138 // switch controllers for LCD40x4 if needed
wim 15:b70ebfffb258 1139 // switch cursor for LCD40x4 if needed
wim 15:b70ebfffb258 1140 // set the new memory address to show cursor at correct location
wim 32:59c4b8f648d4 1141 setAddress(column, row);
wim 15:b70ebfffb258 1142 }
wim 30:033048611c01 1143
wim 15:b70ebfffb258 1144
wim 21:9eb628d9e164 1145 /** Write a single character (Stream implementation)
wim 21:9eb628d9e164 1146 */
wim 21:9eb628d9e164 1147 int TextLCD_Base::_putc(int value) {
wim 15:b70ebfffb258 1148 int addr;
wim 15:b70ebfffb258 1149
wim 15:b70ebfffb258 1150 if (value == '\n') {
wim 15:b70ebfffb258 1151 //No character to write
wim 15:b70ebfffb258 1152
wim 15:b70ebfffb258 1153 //Update Cursor
wim 15:b70ebfffb258 1154 _column = 0;
wim 15:b70ebfffb258 1155 _row++;
wim 15:b70ebfffb258 1156 if (_row >= rows()) {
wim 15:b70ebfffb258 1157 _row = 0;
wim 15:b70ebfffb258 1158 }
wim 15:b70ebfffb258 1159 }
wim 15:b70ebfffb258 1160 else {
wim 15:b70ebfffb258 1161 //Character to write
wim 15:b70ebfffb258 1162 _writeData(value);
wim 15:b70ebfffb258 1163
wim 15:b70ebfffb258 1164 //Update Cursor
wim 15:b70ebfffb258 1165 _column++;
wim 15:b70ebfffb258 1166 if (_column >= columns()) {
wim 15:b70ebfffb258 1167 _column = 0;
wim 15:b70ebfffb258 1168 _row++;
wim 15:b70ebfffb258 1169 if (_row >= rows()) {
wim 15:b70ebfffb258 1170 _row = 0;
wim 15:b70ebfffb258 1171 }
wim 15:b70ebfffb258 1172 }
wim 15:b70ebfffb258 1173 } //else
wim 15:b70ebfffb258 1174
wim 15:b70ebfffb258 1175 //Set next memoryaddress, make sure cursor blinks at next location
wim 15:b70ebfffb258 1176 addr = getAddress(_column, _row);
wim 15:b70ebfffb258 1177 _writeCommand(0x80 | addr);
wim 15:b70ebfffb258 1178
wim 15:b70ebfffb258 1179 return value;
wim 15:b70ebfffb258 1180 }
wim 15:b70ebfffb258 1181
wim 15:b70ebfffb258 1182
wim 16:c276b75e6585 1183 // get a single character (Stream implementation)
wim 21:9eb628d9e164 1184 int TextLCD_Base::_getc() {
simon 1:ac48b187213c 1185 return -1;
simon 1:ac48b187213c 1186 }
simon 1:ac48b187213c 1187
wim 14:0c32b66b14b8 1188
wim 34:e5a0dcb43ecc 1189 #if(LCD_PRINTF != 1)
wim 34:e5a0dcb43ecc 1190 /** Write a character to the LCD
wim 34:e5a0dcb43ecc 1191 *
wim 34:e5a0dcb43ecc 1192 * @param c The character to write to the display
wim 34:e5a0dcb43ecc 1193 */
wim 34:e5a0dcb43ecc 1194 int TextLCD_Base::putc(int c){
wim 34:e5a0dcb43ecc 1195 return _putc(c);
wim 34:e5a0dcb43ecc 1196 }
wim 34:e5a0dcb43ecc 1197
wim 34:e5a0dcb43ecc 1198
wim 34:e5a0dcb43ecc 1199 /** Write a raw string to the LCD
wim 34:e5a0dcb43ecc 1200 *
wim 34:e5a0dcb43ecc 1201 * @param string text, may be followed by variables to emulate formatting the string.
wim 34:e5a0dcb43ecc 1202 * However, printf formatting is NOT supported and variables will be ignored!
wim 34:e5a0dcb43ecc 1203 */
wim 34:e5a0dcb43ecc 1204 int TextLCD_Base::printf(const char* text, ...) {
wim 34:e5a0dcb43ecc 1205
wim 34:e5a0dcb43ecc 1206 while (*text !=0) {
wim 34:e5a0dcb43ecc 1207 _putc(*text);
wim 34:e5a0dcb43ecc 1208 text++;
wim 34:e5a0dcb43ecc 1209 }
wim 34:e5a0dcb43ecc 1210 return 0;
wim 34:e5a0dcb43ecc 1211 }
wim 34:e5a0dcb43ecc 1212 #endif
wim 34:e5a0dcb43ecc 1213
wim 34:e5a0dcb43ecc 1214
wim 34:e5a0dcb43ecc 1215
wim 17:652ab113bc2e 1216 // Write a nibble using the 4-bit interface
wim 21:9eb628d9e164 1217 void TextLCD_Base::_writeNibble(int value) {
wim 17:652ab113bc2e 1218
wim 17:652ab113bc2e 1219 // Enable is Low
wim 21:9eb628d9e164 1220 this->_setEnable(true);
wim 21:9eb628d9e164 1221 this->_setData(value & 0x0F); // Low nibble
wim 17:652ab113bc2e 1222 wait_us(1); // Data setup time
wim 21:9eb628d9e164 1223 this->_setEnable(false);
wim 17:652ab113bc2e 1224 wait_us(1); // Datahold time
wim 17:652ab113bc2e 1225
wim 17:652ab113bc2e 1226 // Enable is Low
wim 17:652ab113bc2e 1227 }
wim 17:652ab113bc2e 1228
wim 16:c276b75e6585 1229 // Write a byte using the 4-bit interface
wim 21:9eb628d9e164 1230 void TextLCD_Base::_writeByte(int value) {
wim 15:b70ebfffb258 1231
wim 15:b70ebfffb258 1232 // Enable is Low
wim 21:9eb628d9e164 1233 this->_setEnable(true);
wim 21:9eb628d9e164 1234 this->_setData(value >> 4); // High nibble
wim 15:b70ebfffb258 1235 wait_us(1); // Data setup time
wim 21:9eb628d9e164 1236 this->_setEnable(false);
wim 15:b70ebfffb258 1237 wait_us(1); // Data hold time
wim 15:b70ebfffb258 1238
wim 21:9eb628d9e164 1239 this->_setEnable(true);
wim 21:9eb628d9e164 1240 this->_setData(value >> 0); // Low nibble
wim 15:b70ebfffb258 1241 wait_us(1); // Data setup time
wim 21:9eb628d9e164 1242 this->_setEnable(false);
wim 15:b70ebfffb258 1243 wait_us(1); // Datahold time
wim 15:b70ebfffb258 1244
wim 15:b70ebfffb258 1245 // Enable is Low
simon 1:ac48b187213c 1246 }
simon 1:ac48b187213c 1247
wim 21:9eb628d9e164 1248 // Write a command byte to the LCD controller
wim 21:9eb628d9e164 1249 void TextLCD_Base::_writeCommand(int command) {
wim 15:b70ebfffb258 1250
wim 21:9eb628d9e164 1251 this->_setRS(false);
wim 16:c276b75e6585 1252 wait_us(1); // Data setup time for RS
wim 15:b70ebfffb258 1253
wim 21:9eb628d9e164 1254 this->_writeByte(command);
wim 15:b70ebfffb258 1255 wait_us(40); // most instructions take 40us
simon 1:ac48b187213c 1256 }
simon 1:ac48b187213c 1257
wim 21:9eb628d9e164 1258 // Write a data byte to the LCD controller
wim 21:9eb628d9e164 1259 void TextLCD_Base::_writeData(int data) {
wim 15:b70ebfffb258 1260
wim 21:9eb628d9e164 1261 this->_setRS(true);
wim 16:c276b75e6585 1262 wait_us(1); // Data setup time for RS
wim 15:b70ebfffb258 1263
wim 21:9eb628d9e164 1264 this->_writeByte(data);
wim 15:b70ebfffb258 1265 wait_us(40); // data writes take 40us
simon 1:ac48b187213c 1266 }
simon 1:ac48b187213c 1267
wim 8:03116f75b66e 1268
wim 32:59c4b8f648d4 1269 // This replaces the original _address() method.
wim 8:03116f75b66e 1270 // It is confusing since it returns the memoryaddress or-ed with the set memorycommand 0x80.
wim 8:03116f75b66e 1271 // Left it in here for compatibility with older code. New applications should use getAddress() instead.
wim 21:9eb628d9e164 1272 int TextLCD_Base::_address(int column, int row) {
wim 8:03116f75b66e 1273 return 0x80 | getAddress(column, row);
wim 8:03116f75b66e 1274 }
wim 8:03116f75b66e 1275
wim 30:033048611c01 1276
wim 30:033048611c01 1277 // This is new method to return the memory address based on row, column and displaytype.
wim 30:033048611c01 1278 //
wim 30:033048611c01 1279 /** Return the memoryaddress of screen column and row location
wim 30:033048611c01 1280 *
wim 30:033048611c01 1281 * @param column The horizontal position from the left, indexed from 0
wim 30:033048611c01 1282 * @param row The vertical position from the top, indexed from 0
wim 30:033048611c01 1283 * @param return The memoryaddress of screen column and row location
wim 30:033048611c01 1284 *
wim 30:033048611c01 1285 */
wim 30:033048611c01 1286 int TextLCD_Base::getAddress(int column, int row) {
wim 30:033048611c01 1287
wim 30:033048611c01 1288 switch (_addr_mode) {
wim 30:033048611c01 1289
wim 30:033048611c01 1290 case LCD_T_A:
wim 30:033048611c01 1291 //Default addressing mode for 1, 2 and 4 rows (except 40x4)
wim 30:033048611c01 1292 //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.
wim 30:033048611c01 1293 //Displays top rows when less than four are used.
wim 30:033048611c01 1294 switch (row) {
wim 30:033048611c01 1295 case 0:
wim 30:033048611c01 1296 return 0x00 + column;
wim 30:033048611c01 1297 case 1:
wim 30:033048611c01 1298 return 0x40 + column;
wim 30:033048611c01 1299 case 2:
wim 30:033048611c01 1300 return 0x00 + _nr_cols + column;
wim 30:033048611c01 1301 case 3:
wim 30:033048611c01 1302 return 0x40 + _nr_cols + column;
wim 30:033048611c01 1303 // Should never get here.
wim 30:033048611c01 1304 default:
wim 30:033048611c01 1305 return 0x00;
wim 30:033048611c01 1306 }
wim 30:033048611c01 1307
wim 30:033048611c01 1308 case LCD_T_B:
wim 30:033048611c01 1309 // LCD8x2B is a special layout of LCD16x1
wim 30:033048611c01 1310 if (row==0)
wim 30:033048611c01 1311 return 0x00 + column;
wim 30:033048611c01 1312 else
wim 30:033048611c01 1313 // return _nr_cols + column;
wim 30:033048611c01 1314 return 0x08 + column;
wim 30:033048611c01 1315
wim 30:033048611c01 1316 case LCD_T_C:
wim 30:033048611c01 1317 // LCD16x1C is a special layout of LCD8x2
wim 33:900a94bc7585 1318 // LCD32x1C is a special layout of LCD16x2
wim 33:900a94bc7585 1319 // LCD40x1C is a special layout of LCD20x2
wim 33:900a94bc7585 1320 #if(0)
wim 32:59c4b8f648d4 1321 if (column < 8)
wim 30:033048611c01 1322 return 0x00 + column;
wim 30:033048611c01 1323 else
wim 30:033048611c01 1324 return 0x40 + (column - 8);
wim 32:59c4b8f648d4 1325 #else
wim 32:59c4b8f648d4 1326 if (column < (_nr_cols >> 1))
wim 32:59c4b8f648d4 1327 return 0x00 + column;
wim 32:59c4b8f648d4 1328 else
wim 32:59c4b8f648d4 1329 return 0x40 + (column - (_nr_cols >> 1));
wim 32:59c4b8f648d4 1330 #endif
wim 30:033048611c01 1331
wim 30:033048611c01 1332 // Not sure about this one, seems wrong.
wim 30:033048611c01 1333 // Left in for compatibility with original library
wim 30:033048611c01 1334 // case LCD16x2B:
wim 30:033048611c01 1335 // return 0x00 + (row * 40) + column;
wim 30:033048611c01 1336
wim 30:033048611c01 1337 case LCD_T_D:
wim 33:900a94bc7585 1338 //Alternate addressing mode for 3 and 4 row displays (except 40x4). Used by PCF21XX, KS0078, SSD1803
wim 30:033048611c01 1339 //The 4 available rows start at a hardcoded address.
wim 30:033048611c01 1340 //Displays top rows when less than four are used.
wim 30:033048611c01 1341 switch (row) {
wim 30:033048611c01 1342 case 0:
wim 30:033048611c01 1343 return 0x00 + column;
wim 30:033048611c01 1344 case 1:
wim 30:033048611c01 1345 return 0x20 + column;
wim 30:033048611c01 1346 case 2:
wim 30:033048611c01 1347 return 0x40 + column;
wim 30:033048611c01 1348 case 3:
wim 30:033048611c01 1349 return 0x60 + column;
wim 30:033048611c01 1350 // Should never get here.
wim 30:033048611c01 1351 default:
wim 30:033048611c01 1352 return 0x00;
wim 30:033048611c01 1353 }
wim 30:033048611c01 1354
wim 30:033048611c01 1355 case LCD_T_D1:
wim 32:59c4b8f648d4 1356 //Alternate addressing mode for 3 row displays. Used by PCF21XX, KS0078, SSD1803
wim 30:033048611c01 1357 //The 4 available rows start at a hardcoded address.
wim 30:033048611c01 1358 //Skips top row of 4 row display and starts display at row 1
wim 30:033048611c01 1359 switch (row) {
wim 30:033048611c01 1360 case 0:
wim 30:033048611c01 1361 return 0x20 + column;
wim 30:033048611c01 1362 case 1:
wim 30:033048611c01 1363 return 0x40 + column;
wim 30:033048611c01 1364 case 2:
wim 30:033048611c01 1365 return 0x60 + column;
wim 30:033048611c01 1366 // Should never get here.
wim 30:033048611c01 1367 default:
wim 30:033048611c01 1368 return 0x00;
wim 30:033048611c01 1369 }
wim 30:033048611c01 1370
wim 30:033048611c01 1371 case LCD_T_E:
wim 30:033048611c01 1372 // LCD40x4 is a special case since it has 2 controllers.
wim 30:033048611c01 1373 // Each controller is configured as 40x2 (Type A)
wim 30:033048611c01 1374 if (row<2) {
wim 30:033048611c01 1375 // Test to see if we need to switch between controllers
wim 30:033048611c01 1376 if (_ctrl_idx != _LCDCtrl_0) {
wim 30:033048611c01 1377
wim 30:033048611c01 1378 // Second LCD controller Cursor Off
wim 30:033048611c01 1379 _setCursorAndDisplayMode(_currentMode, CurOff_BlkOff);
wim 30:033048611c01 1380
wim 30:033048611c01 1381 // Select primary controller
wim 30:033048611c01 1382 _ctrl_idx = _LCDCtrl_0;
wim 30:033048611c01 1383
wim 30:033048611c01 1384 // Restore cursormode on primary LCD controller
wim 30:033048611c01 1385 _setCursorAndDisplayMode(_currentMode, _currentCursor);
wim 30:033048611c01 1386 }
wim 30:033048611c01 1387
wim 30:033048611c01 1388 return 0x00 + (row * 0x40) + column;
wim 30:033048611c01 1389 }
wim 30:033048611c01 1390 else {
wim 30:033048611c01 1391
wim 30:033048611c01 1392 // Test to see if we need to switch between controllers
wim 30:033048611c01 1393 if (_ctrl_idx != _LCDCtrl_1) {
wim 30:033048611c01 1394 // Primary LCD controller Cursor Off
wim 30:033048611c01 1395 _setCursorAndDisplayMode(_currentMode, CurOff_BlkOff);
wim 30:033048611c01 1396
wim 30:033048611c01 1397 // Select secondary controller
wim 30:033048611c01 1398 _ctrl_idx = _LCDCtrl_1;
wim 30:033048611c01 1399
wim 30:033048611c01 1400 // Restore cursormode on secondary LCD controller
wim 30:033048611c01 1401 _setCursorAndDisplayMode(_currentMode, _currentCursor);
wim 30:033048611c01 1402 }
wim 30:033048611c01 1403
wim 30:033048611c01 1404 return 0x00 + ((row-2) * 0x40) + column;
wim 30:033048611c01 1405 }
wim 30:033048611c01 1406
wim 32:59c4b8f648d4 1407 case LCD_T_F:
wim 32:59c4b8f648d4 1408 //Alternate addressing mode for 3 row displays.
wim 32:59c4b8f648d4 1409 //The first half of 3rd row continues from 1st row, the second half continues from 2nd row.
wim 32:59c4b8f648d4 1410 switch (row) {
wim 32:59c4b8f648d4 1411 case 0:
wim 32:59c4b8f648d4 1412 return 0x00 + column;
wim 32:59c4b8f648d4 1413 case 1:
wim 32:59c4b8f648d4 1414 return 0x40 + column;
wim 32:59c4b8f648d4 1415 case 2:
wim 32:59c4b8f648d4 1416 if (column < (_nr_cols >> 1)) // check first or second half of line
wim 32:59c4b8f648d4 1417 return (0x00 + _nr_cols + column);
wim 32:59c4b8f648d4 1418 else
wim 32:59c4b8f648d4 1419 return (0x40 + _nr_cols + (column - (_nr_cols >> 1)));
wim 32:59c4b8f648d4 1420 // Should never get here.
wim 32:59c4b8f648d4 1421 default:
wim 32:59c4b8f648d4 1422 return 0x00;
wim 32:59c4b8f648d4 1423 }
wim 32:59c4b8f648d4 1424
wim 32:59c4b8f648d4 1425 case LCD_T_G:
wim 32:59c4b8f648d4 1426 //Alternate addressing mode for 3 row displays. Used by ST7036
wim 32:59c4b8f648d4 1427 switch (row) {
wim 32:59c4b8f648d4 1428 case 0:
wim 32:59c4b8f648d4 1429 return 0x00 + column;
wim 32:59c4b8f648d4 1430 case 1:
wim 32:59c4b8f648d4 1431 return 0x10 + column;
wim 32:59c4b8f648d4 1432 case 2:
wim 32:59c4b8f648d4 1433 return 0x20 + column;
wim 32:59c4b8f648d4 1434 // Should never get here.
wim 32:59c4b8f648d4 1435 default:
wim 32:59c4b8f648d4 1436 return 0x00;
wim 32:59c4b8f648d4 1437 }
wim 32:59c4b8f648d4 1438
wim 30:033048611c01 1439 // Should never get here.
wim 30:033048611c01 1440 default:
wim 30:033048611c01 1441 return 0x00;
wim 32:59c4b8f648d4 1442
wim 32:59c4b8f648d4 1443 } // switch _addr_mode
wim 30:033048611c01 1444 }
wim 30:033048611c01 1445
wim 30:033048611c01 1446
wim 29:a3663151aa65 1447 /** Set the memoryaddress of screen column and row location
wim 29:a3663151aa65 1448 *
wim 29:a3663151aa65 1449 * @param column The horizontal position from the left, indexed from 0
wim 29:a3663151aa65 1450 * @param row The vertical position from the top, indexed from 0
wim 29:a3663151aa65 1451 */
wim 21:9eb628d9e164 1452 void TextLCD_Base::setAddress(int column, int row) {
wim 15:b70ebfffb258 1453
wim 15:b70ebfffb258 1454 // Sanity Check column
wim 15:b70ebfffb258 1455 if (column < 0) {
wim 15:b70ebfffb258 1456 _column = 0;
wim 15:b70ebfffb258 1457 }
wim 15:b70ebfffb258 1458 else if (column >= columns()) {
wim 15:b70ebfffb258 1459 _column = columns() - 1;
wim 15:b70ebfffb258 1460 } else _column = column;
wim 8:03116f75b66e 1461
wim 15:b70ebfffb258 1462 // Sanity Check row
wim 15:b70ebfffb258 1463 if (row < 0) {
wim 15:b70ebfffb258 1464 _row = 0;
wim 15:b70ebfffb258 1465 }
wim 15:b70ebfffb258 1466 else if (row >= rows()) {
wim 15:b70ebfffb258 1467 _row = rows() - 1;
wim 15:b70ebfffb258 1468 } else _row = row;
wim 15:b70ebfffb258 1469
wim 15:b70ebfffb258 1470
wim 15:b70ebfffb258 1471 // Compute the memory address
wim 15:b70ebfffb258 1472 // For LCD40x4: switch controllers if needed
wim 15:b70ebfffb258 1473 // switch cursor if needed
wim 15:b70ebfffb258 1474 int addr = getAddress(_column, _row);
wim 8:03116f75b66e 1475
wim 13:24506ba22480 1476 _writeCommand(0x80 | addr);
wim 8:03116f75b66e 1477 }
simon 1:ac48b187213c 1478
wim 29:a3663151aa65 1479
wim 29:a3663151aa65 1480 /** Return the number of columns
wim 29:a3663151aa65 1481 *
wim 29:a3663151aa65 1482 * @param return The number of columns
wim 30:033048611c01 1483 *
wim 30:033048611c01 1484 * Note: some configurations are commented out because they have not yet been tested due to lack of hardware
wim 29:a3663151aa65 1485 */
wim 21:9eb628d9e164 1486 int TextLCD_Base::columns() {
wim 30:033048611c01 1487
wim 30:033048611c01 1488 // Columns encoded in b7..b0
wim 30:033048611c01 1489 //return (_type & 0xFF);
wim 31:ef31cd8a00d1 1490 return _nr_cols;
simon 1:ac48b187213c 1491 }
simon 1:ac48b187213c 1492
wim 29:a3663151aa65 1493 /** Return the number of rows
wim 29:a3663151aa65 1494 *
wim 29:a3663151aa65 1495 * @param return The number of rows
wim 30:033048611c01 1496 *
wim 30:033048611c01 1497 * Note: some configurations are commented out because they have not yet been tested due to lack of hardware
wim 29:a3663151aa65 1498 */
wim 21:9eb628d9e164 1499 int TextLCD_Base::rows() {
wim 30:033048611c01 1500
wim 30:033048611c01 1501 // Rows encoded in b15..b8
wim 30:033048611c01 1502 //return ((_type >> 8) & 0xFF);
wim 30:033048611c01 1503 return _nr_rows;
simon 1:ac48b187213c 1504 }
wim 10:dd9b3a696acd 1505
wim 29:a3663151aa65 1506 /** Set the Cursormode
wim 29:a3663151aa65 1507 *
wim 29:a3663151aa65 1508 * @param cursorMode The Cursor mode (CurOff_BlkOff, CurOn_BlkOff, CurOff_BlkOn, CurOn_BlkOn)
wim 29:a3663151aa65 1509 */
wim 21:9eb628d9e164 1510 void TextLCD_Base::setCursor(LCDCursor cursorMode) {
wim 15:b70ebfffb258 1511
wim 17:652ab113bc2e 1512 // Save new cursor mode, needed when 2 controllers are in use or when display is switched off/on
wim 17:652ab113bc2e 1513 _currentCursor = cursorMode;
wim 10:dd9b3a696acd 1514
wim 17:652ab113bc2e 1515 // Configure only current LCD controller
wim 31:ef31cd8a00d1 1516 _setCursorAndDisplayMode(_currentMode, _currentCursor);
wim 15:b70ebfffb258 1517 }
wim 15:b70ebfffb258 1518
wim 29:a3663151aa65 1519 /** Set the Displaymode
wim 29:a3663151aa65 1520 *
wim 29:a3663151aa65 1521 * @param displayMode The Display mode (DispOff, DispOn)
wim 29:a3663151aa65 1522 */
wim 21:9eb628d9e164 1523 void TextLCD_Base::setMode(LCDMode displayMode) {
wim 17:652ab113bc2e 1524
wim 17:652ab113bc2e 1525 // Save new displayMode, needed when 2 controllers are in use or when cursor is changed
wim 17:652ab113bc2e 1526 _currentMode = displayMode;
wim 15:b70ebfffb258 1527
wim 17:652ab113bc2e 1528 // Select and configure second LCD controller when needed
wim 17:652ab113bc2e 1529 if(_type==LCD40x4) {
wim 21:9eb628d9e164 1530 if (_ctrl_idx==_LCDCtrl_0) {
wim 17:652ab113bc2e 1531 // Configure primary LCD controller
wim 17:652ab113bc2e 1532 _setCursorAndDisplayMode(_currentMode, _currentCursor);
wim 11:9ec02df863a1 1533
wim 17:652ab113bc2e 1534 // Select 2nd controller
wim 21:9eb628d9e164 1535 _ctrl_idx=_LCDCtrl_1;
wim 17:652ab113bc2e 1536
wim 17:652ab113bc2e 1537 // Configure secondary LCD controller
wim 21:9eb628d9e164 1538 _setCursorAndDisplayMode(_currentMode, CurOff_BlkOff);
wim 11:9ec02df863a1 1539
wim 17:652ab113bc2e 1540 // Restore current controller
wim 21:9eb628d9e164 1541 _ctrl_idx=_LCDCtrl_0;
wim 17:652ab113bc2e 1542 }
wim 17:652ab113bc2e 1543 else {
wim 17:652ab113bc2e 1544 // Select primary controller
wim 21:9eb628d9e164 1545 _ctrl_idx=_LCDCtrl_0;
wim 17:652ab113bc2e 1546
wim 17:652ab113bc2e 1547 // Configure primary LCD controller
wim 21:9eb628d9e164 1548 _setCursorAndDisplayMode(_currentMode, CurOff_BlkOff);
wim 17:652ab113bc2e 1549
wim 17:652ab113bc2e 1550 // Restore current controller
wim 21:9eb628d9e164 1551 _ctrl_idx=_LCDCtrl_1;
wim 11:9ec02df863a1 1552
wim 17:652ab113bc2e 1553 // Configure secondary LCD controller
wim 17:652ab113bc2e 1554 _setCursorAndDisplayMode(_currentMode, _currentCursor);
wim 10:dd9b3a696acd 1555 }
wim 17:652ab113bc2e 1556 }
wim 17:652ab113bc2e 1557 else {
wim 17:652ab113bc2e 1558 // Configure primary LCD controller
wim 17:652ab113bc2e 1559 _setCursorAndDisplayMode(_currentMode, _currentCursor);
wim 30:033048611c01 1560 }
wim 17:652ab113bc2e 1561 }
wim 17:652ab113bc2e 1562
wim 17:652ab113bc2e 1563
wim 29:a3663151aa65 1564 /** Low level method to restore the cursortype and display mode for current controller
wim 29:a3663151aa65 1565 */
wim 21:9eb628d9e164 1566 void TextLCD_Base::_setCursorAndDisplayMode(LCDMode displayMode, LCDCursor cursorType) {
wim 17:652ab113bc2e 1567
wim 17:652ab113bc2e 1568 // Configure current LCD controller
wim 17:652ab113bc2e 1569 _writeCommand(0x08 | displayMode | cursorType);
wim 10:dd9b3a696acd 1570 }
wim 10:dd9b3a696acd 1571
wim 29:a3663151aa65 1572 /** Set the Backlight mode
wim 29:a3663151aa65 1573 *
wim 29:a3663151aa65 1574 * @param backlightMode The Backlight mode (LightOff, LightOn)
wim 29:a3663151aa65 1575 */
wim 21:9eb628d9e164 1576 void TextLCD_Base::setBacklight(LCDBacklight backlightMode) {
wim 20:e0da005a777f 1577
wim 35:311be6444a39 1578 #if (BACKLIGHT_INV==0)
wim 35:311be6444a39 1579 // Positive Backlight control pin logic
wim 20:e0da005a777f 1580 if (backlightMode == LightOn) {
wim 35:311be6444a39 1581 this->_setBL(true);
wim 20:e0da005a777f 1582 }
wim 20:e0da005a777f 1583 else {
wim 21:9eb628d9e164 1584 this->_setBL(false);
wim 20:e0da005a777f 1585 }
wim 35:311be6444a39 1586 #else
wim 35:311be6444a39 1587 // Inverted Backlight control pin logic
wim 35:311be6444a39 1588 if (backlightMode == LightOn) {
wim 35:311be6444a39 1589 this->_setBL(false);
wim 35:311be6444a39 1590 }
wim 35:311be6444a39 1591 else {
wim 35:311be6444a39 1592 this->_setBL(true);
wim 35:311be6444a39 1593 }
wim 35:311be6444a39 1594 #endif
wim 20:e0da005a777f 1595 }
wim 20:e0da005a777f 1596
wim 29:a3663151aa65 1597 /** Set User Defined Characters
wim 29:a3663151aa65 1598 *
wim 34:e5a0dcb43ecc 1599 * @param unsigned char c The Index of the UDC (0..7) for HD44780 or clones and (0..15) for some more advanced controllers
wim 34:e5a0dcb43ecc 1600 * @param char *udc_data The bitpatterns for the UDC (8 bytes of 5 significant bits for bitpattern and 3 bits for blinkmode (advanced types))
wim 29:a3663151aa65 1601 */
wim 21:9eb628d9e164 1602 void TextLCD_Base::setUDC(unsigned char c, char *udc_data) {
wim 15:b70ebfffb258 1603
wim 15:b70ebfffb258 1604 // Select and configure second LCD controller when needed
wim 15:b70ebfffb258 1605 if(_type==LCD40x4) {
wim 19:c747b9e2e7b8 1606 _LCDCtrl_Idx current_ctrl_idx = _ctrl_idx; // Temp save current controller
wim 15:b70ebfffb258 1607
wim 15:b70ebfffb258 1608 // Select primary controller
wim 21:9eb628d9e164 1609 _ctrl_idx=_LCDCtrl_0;
wim 15:b70ebfffb258 1610
wim 15:b70ebfffb258 1611 // Configure primary LCD controller
wim 15:b70ebfffb258 1612 _setUDC(c, udc_data);
wim 15:b70ebfffb258 1613
wim 15:b70ebfffb258 1614 // Select 2nd controller
wim 21:9eb628d9e164 1615 _ctrl_idx=_LCDCtrl_1;
wim 15:b70ebfffb258 1616
wim 15:b70ebfffb258 1617 // Configure secondary LCD controller
wim 15:b70ebfffb258 1618 _setUDC(c, udc_data);
wim 11:9ec02df863a1 1619
wim 15:b70ebfffb258 1620 // Restore current controller
wim 19:c747b9e2e7b8 1621 _ctrl_idx=current_ctrl_idx;
wim 15:b70ebfffb258 1622 }
wim 15:b70ebfffb258 1623 else {
wim 15:b70ebfffb258 1624 // Configure primary LCD controller
wim 15:b70ebfffb258 1625 _setUDC(c, udc_data);
wim 34:e5a0dcb43ecc 1626 }
wim 15:b70ebfffb258 1627 }
wim 15:b70ebfffb258 1628
wim 34:e5a0dcb43ecc 1629 /** Low level method to store user defined characters for current controller
wim 34:e5a0dcb43ecc 1630 *
wim 34:e5a0dcb43ecc 1631 * @param unsigned char c The Index of the UDC (0..7) for HD44780 clones and (0..15) for some more advanced controllers
wim 34:e5a0dcb43ecc 1632 * @param char *udc_data The bitpatterns for the UDC (8 bytes of 5 significant bits for bitpattern and 3 bits for blinkmode (advanced types))
wim 34:e5a0dcb43ecc 1633 */
wim 34:e5a0dcb43ecc 1634 void TextLCD_Base::_setUDC(unsigned char c, char *udc_data) {
wim 34:e5a0dcb43ecc 1635
wim 34:e5a0dcb43ecc 1636 switch (_ctrl) {
wim 34:e5a0dcb43ecc 1637 case PCF2103_3V3 : // Some UDCs may be used for Icons
wim 34:e5a0dcb43ecc 1638 case PCF2113_3V3 : // Some UDCs may be used for Icons
wim 34:e5a0dcb43ecc 1639 case PCF2116_3V3 :
wim 34:e5a0dcb43ecc 1640 case PCF2116_5V :
wim 34:e5a0dcb43ecc 1641 case PCF2119_3V3 : // Some UDCs may be used for Icons
wim 34:e5a0dcb43ecc 1642 c = c & 0x0F; // mask down to valid range
wim 34:e5a0dcb43ecc 1643 break;
wim 34:e5a0dcb43ecc 1644
wim 34:e5a0dcb43ecc 1645 default:
wim 34:e5a0dcb43ecc 1646 c = c & 0x07; // mask down to valid range
wim 34:e5a0dcb43ecc 1647 break;
wim 34:e5a0dcb43ecc 1648 } //switch _ctrl
wim 34:e5a0dcb43ecc 1649
wim 34:e5a0dcb43ecc 1650 // Select DD RAM for current LCD controller
wim 34:e5a0dcb43ecc 1651 // This is needed to correctly set Bit 6 of the addresspointer for controllers that support 16 UDCs
wim 34:e5a0dcb43ecc 1652 _writeCommand(0x80 | ((c << 3) & 0x40)) ;
wim 34:e5a0dcb43ecc 1653
wim 34:e5a0dcb43ecc 1654 // Select CG RAM for current LCD controller
wim 34:e5a0dcb43ecc 1655 _writeCommand(0x40 | ((c << 3) & 0x3F)); //Set CG-RAM address, (note that Bit 6 is retained and can not be set by this command !)
wim 34:e5a0dcb43ecc 1656 //8 sequential locations needed per UDC
wim 34:e5a0dcb43ecc 1657 // Store UDC pattern
wim 34:e5a0dcb43ecc 1658 for (int i=0; i<8; i++) {
wim 34:e5a0dcb43ecc 1659 _writeData(*udc_data++);
wim 34:e5a0dcb43ecc 1660 }
wim 34:e5a0dcb43ecc 1661
wim 34:e5a0dcb43ecc 1662 //Select DD RAM again for current LCD controller and restore the addresspointer
wim 34:e5a0dcb43ecc 1663 int addr = getAddress(_column, _row);
wim 34:e5a0dcb43ecc 1664 _writeCommand(0x80 | addr);
wim 34:e5a0dcb43ecc 1665 }
wim 32:59c4b8f648d4 1666
wim 33:900a94bc7585 1667 /** Set UDC Blink
wim 33:900a94bc7585 1668 * setUDCBlink method is supported by some compatible devices (eg SSD1803)
wim 33:900a94bc7585 1669 *
wim 33:900a94bc7585 1670 * @param blinkMode The Blink mode (BlinkOff, BlinkOn)
wim 33:900a94bc7585 1671 */
wim 33:900a94bc7585 1672 void TextLCD_Base::setUDCBlink(LCDBlink blinkMode){
wim 33:900a94bc7585 1673 // Blinking UDCs are enabled when a specific controlbit (BE) is set.
wim 33:900a94bc7585 1674 // The blinking pixels in the UDC can be controlled by setting additional bits in the UDC bitpattern.
wim 33:900a94bc7585 1675 // UDCs are defined by an 8 byte bitpattern. The P0..P5 form the character pattern.
wim 33:900a94bc7585 1676 // P7 P6 P5 P4 P3 P2 P1 P0
wim 33:900a94bc7585 1677 // 0 B1 B0 x 0 1 1 1 0
wim 33:900a94bc7585 1678 // 1 B1 B0 x 1 0 0 0 1
wim 33:900a94bc7585 1679 // .............
wim 33:900a94bc7585 1680 // 7 B1 B0 x 1 0 0 0 1
wim 33:900a94bc7585 1681 //
wim 33:900a94bc7585 1682 // Bit 6 and Bit 7 in the pattern will control the blinking mode when Blink is enabled through BE.
wim 33:900a94bc7585 1683 // B1 B0 Mode
wim 33:900a94bc7585 1684 // 0 0 No Blinking in this row of the UDC
wim 33:900a94bc7585 1685 // 0 1 Enabled pixels in P4 will blink
wim 33:900a94bc7585 1686 // 1 x Enabled pixels in P0..P4 will blink
wim 33:900a94bc7585 1687
wim 33:900a94bc7585 1688 switch (blinkMode) {
wim 33:900a94bc7585 1689 case BlinkOn:
wim 33:900a94bc7585 1690 // Controllers that support UDC Blink
wim 33:900a94bc7585 1691 switch (_ctrl) {
wim 33:900a94bc7585 1692 case KS0078 :
wim 33:900a94bc7585 1693 _function_1 |= 0x02; // Enable UDC Blink
wim 33:900a94bc7585 1694 _writeCommand(0x20 | _function_1); // Function set 0 0 1 DL N RE(1) BE 0 (Ext Regs)
wim 33:900a94bc7585 1695
wim 33:900a94bc7585 1696 _writeCommand(0x20 | _function); // Function set 0 0 1 DL N RE(0) DH REV (Std Regs)
wim 33:900a94bc7585 1697 break; // case KS0078 Controller
wim 33:900a94bc7585 1698
wim 33:900a94bc7585 1699 case US2066_3V3 :
wim 33:900a94bc7585 1700 case SSD1803_3V3 :
wim 33:900a94bc7585 1701 _function_1 |= 0x04; // Enable UDC Blink
wim 33:900a94bc7585 1702 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 DL N BE RE(1) REV
wim 33:900a94bc7585 1703 // Select Ext Instr Set
wim 33:900a94bc7585 1704
wim 33:900a94bc7585 1705 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
wim 33:900a94bc7585 1706 // Select Std Instr set, Select IS=0
wim 33:900a94bc7585 1707 break; // case SSD1803, US2066
wim 33:900a94bc7585 1708
wim 33:900a94bc7585 1709 default:
wim 33:900a94bc7585 1710 //Unsupported feature for other controllers
wim 33:900a94bc7585 1711 break;
wim 33:900a94bc7585 1712 } //switch _ctrl
wim 33:900a94bc7585 1713
wim 33:900a94bc7585 1714 break;
wim 33:900a94bc7585 1715
wim 33:900a94bc7585 1716 case BlinkOff:
wim 33:900a94bc7585 1717 // Controllers that support UDC Blink
wim 33:900a94bc7585 1718 switch (_ctrl) {
wim 33:900a94bc7585 1719 case KS0078 :
wim 33:900a94bc7585 1720 _function_1 &= ~0x02; // Disable UDC Blink
wim 33:900a94bc7585 1721 _writeCommand(0x20 | _function_1); // Function set 0 0 1 DL N RE(1) BE 0 (Ext Regs)
wim 33:900a94bc7585 1722
wim 33:900a94bc7585 1723 _writeCommand(0x20 | _function); // Function set 0 0 1 DL N RE(0) DH REV (Std Regs)
wim 33:900a94bc7585 1724 break; // case KS0078 Controller
wim 33:900a94bc7585 1725
wim 33:900a94bc7585 1726 case US2066_3V3 :
wim 33:900a94bc7585 1727 case SSD1803_3V3 :
wim 33:900a94bc7585 1728 _function_1 &= ~0x04; // Disable UDC Blink
wim 33:900a94bc7585 1729 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 DL N BE RE(1) REV
wim 33:900a94bc7585 1730 // Select Ext Instr Set
wim 33:900a94bc7585 1731
wim 33:900a94bc7585 1732 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
wim 33:900a94bc7585 1733 // Select Std Instr set, Select IS=0
wim 33:900a94bc7585 1734 break; // case SSD1803, US2066
wim 33:900a94bc7585 1735
wim 33:900a94bc7585 1736 default:
wim 33:900a94bc7585 1737 //Unsupported feature for other controllers
wim 33:900a94bc7585 1738 break;
wim 33:900a94bc7585 1739 } //switch _ctrl
wim 33:900a94bc7585 1740
wim 33:900a94bc7585 1741 break;
wim 33:900a94bc7585 1742
wim 33:900a94bc7585 1743 default:
wim 33:900a94bc7585 1744 break;
wim 33:900a94bc7585 1745 } // blinkMode
wim 33:900a94bc7585 1746
wim 33:900a94bc7585 1747 } // setUDCBlink()
wim 33:900a94bc7585 1748
wim 33:900a94bc7585 1749
wim 32:59c4b8f648d4 1750 /** Set Contrast
wim 32:59c4b8f648d4 1751 * setContrast method is supported by some compatible devices (eg ST7032i) that have onboard LCD voltage generation
wim 32:59c4b8f648d4 1752 * Initial code for ST70XX imported from fork by JH1PJL
wim 32:59c4b8f648d4 1753 *
wim 32:59c4b8f648d4 1754 * @param unsigned char c contrast data (6 significant bits, valid range 0..63, Value 0 will disable the Vgen)
wim 32:59c4b8f648d4 1755 * @return none
wim 32:59c4b8f648d4 1756 */
wim 32:59c4b8f648d4 1757 //@TODO Add support for 40x4 dual controller
wim 32:59c4b8f648d4 1758 void TextLCD_Base::setContrast(unsigned char c) {
wim 32:59c4b8f648d4 1759
wim 32:59c4b8f648d4 1760 // Function set mode stored during Init. Make sure we dont accidentally switch between 1-line and 2-line mode!
wim 32:59c4b8f648d4 1761 // Icon/Booster mode stored during Init. Make sure we dont accidentally change this!
wim 32:59c4b8f648d4 1762
wim 32:59c4b8f648d4 1763 _contrast = c & 0x3F; // Sanity check
wim 32:59c4b8f648d4 1764
wim 33:900a94bc7585 1765 switch (_ctrl) {
wim 32:59c4b8f648d4 1766 case PCF2113_3V3 :
wim 32:59c4b8f648d4 1767 case PCF2119_3V3 :
wim 32:59c4b8f648d4 1768 if (_contrast < 5) _contrast = 0; // See datasheet. Sanity check for PCF2113/PCF2119
wim 32:59c4b8f648d4 1769 if (_contrast > 55) _contrast = 55;
wim 32:59c4b8f648d4 1770
wim 32:59c4b8f648d4 1771 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instruction Set = 1
wim 32:59c4b8f648d4 1772 _writeCommand(0x80 | 0x00 | (_contrast & 0x3F)); // VLCD_set (Instr. Set 1) V=0, VA=contrast
wim 32:59c4b8f648d4 1773 _writeCommand(0x80 | 0x40 | (_contrast & 0x3F)); // VLCD_set (Instr. Set 1) V=1, VB=contrast
wim 32:59c4b8f648d4 1774 _writeCommand(0x20 | _function); // Select Instruction Set = 0
wim 32:59c4b8f648d4 1775 break;
wim 32:59c4b8f648d4 1776
wim 32:59c4b8f648d4 1777 case ST7032_3V3 :
wim 32:59c4b8f648d4 1778 case ST7032_5V :
wim 32:59c4b8f648d4 1779 case ST7036_3V3 :
wim 32:59c4b8f648d4 1780 // case ST7036_5V :
wim 32:59c4b8f648d4 1781 case SSD1803_3V3 :
wim 32:59c4b8f648d4 1782 _writeCommand(0x20 | _function | 0x01); // Select Instruction Set = 1
wim 32:59c4b8f648d4 1783 _writeCommand(0x70 | (_contrast & 0x0F)); // Contrast Low bits
wim 32:59c4b8f648d4 1784 _writeCommand(0x50 | _icon_power | ((_contrast >> 4) & 0x03)); // Contrast High bits
wim 32:59c4b8f648d4 1785 _writeCommand(0x20 | _function); // Select Instruction Set = 0
wim 32:59c4b8f648d4 1786 break;
wim 32:59c4b8f648d4 1787
wim 33:900a94bc7585 1788 case US2066_3V3 :
wim 33:900a94bc7585 1789 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 DL N BE RE(1) REV
wim 33:900a94bc7585 1790 // Select Extended Instruction Set
wim 33:900a94bc7585 1791
wim 33:900a94bc7585 1792 _writeCommand(0x79); // Function Select OLED: 0 1 1 1 1 0 0 1 (Ext Instr Set)
wim 33:900a94bc7585 1793
wim 33:900a94bc7585 1794 _writeCommand(0x81); // Set Contrast Control: 1 0 0 0 0 0 0 1 (Ext Instr Set, OLED)
wim 33:900a94bc7585 1795 _writeCommand((_contrast << 2) | 0x03); // Set Contrast Value: 8 bits. Use 6 bits for compatibility
wim 33:900a94bc7585 1796
wim 33:900a94bc7585 1797 _writeCommand(0x78); // Function Disable OLED: 0 1 1 1 1 0 0 0 (Ext Instr Set)
wim 33:900a94bc7585 1798
wim 33:900a94bc7585 1799 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
wim 33:900a94bc7585 1800 // Select Std Instr set, Select IS=0
wim 33:900a94bc7585 1801 break;
wim 33:900a94bc7585 1802
wim 34:e5a0dcb43ecc 1803 //not yet tested on hardware
wim 32:59c4b8f648d4 1804 case PT6314 :
wim 32:59c4b8f648d4 1805 // Only 2 significant bits
wim 32:59c4b8f648d4 1806 // 0x00 = 100%
wim 32:59c4b8f648d4 1807 // 0x01 = 75%
wim 32:59c4b8f648d4 1808 // 0x02 = 50%
wim 32:59c4b8f648d4 1809 // 0x03 = 25%
wim 32:59c4b8f648d4 1810 _writeCommand(0x20 | _function | ((~_contrast) >> 4)); // Invert and shift to use 2 MSBs
wim 32:59c4b8f648d4 1811 break;
wim 32:59c4b8f648d4 1812
wim 32:59c4b8f648d4 1813 default:
wim 32:59c4b8f648d4 1814 //Unsupported feature for other controllers
wim 33:900a94bc7585 1815 break;
wim 33:900a94bc7585 1816 } // end switch
wim 33:900a94bc7585 1817 } // end setContrast()
wim 32:59c4b8f648d4 1818
wim 32:59c4b8f648d4 1819
wim 32:59c4b8f648d4 1820 /** Set Power
wim 32:59c4b8f648d4 1821 * setPower method is supported by some compatible devices (eg SSD1803) that have power down modes
wim 32:59c4b8f648d4 1822 *
wim 32:59c4b8f648d4 1823 * @param bool powerOn Power on/off
wim 32:59c4b8f648d4 1824 * @return none
wim 32:59c4b8f648d4 1825 */
wim 32:59c4b8f648d4 1826 //@TODO Add support for 40x4 dual controller
wim 32:59c4b8f648d4 1827 void TextLCD_Base::setPower(bool powerOn) {
wim 32:59c4b8f648d4 1828
wim 32:59c4b8f648d4 1829 if (powerOn) {
wim 32:59c4b8f648d4 1830 // Switch on
wim 32:59c4b8f648d4 1831 setMode(DispOn);
wim 32:59c4b8f648d4 1832
wim 32:59c4b8f648d4 1833 // Controllers that supports specific Power Down mode
wim 32:59c4b8f648d4 1834 switch (_ctrl) {
wim 32:59c4b8f648d4 1835
wim 32:59c4b8f648d4 1836 // case PCF2113_3V3 :
wim 32:59c4b8f648d4 1837 // case PCF2119_3V3 :
wim 32:59c4b8f648d4 1838 // case ST7032_3V3 :
wim 32:59c4b8f648d4 1839 //@todo
wim 33:900a94bc7585 1840 // enable Booster Bon
wim 33:900a94bc7585 1841
wim 33:900a94bc7585 1842 case WS0010:
wim 33:900a94bc7585 1843 _writeCommand(0x17); // Char mode, DC/DC on
wim 33:900a94bc7585 1844 wait_ms(10); // Wait 10ms to ensure powered up
wim 33:900a94bc7585 1845 break;
wim 33:900a94bc7585 1846
wim 33:900a94bc7585 1847 case KS0078:
wim 32:59c4b8f648d4 1848 case SSD1803_3V3 :
wim 32:59c4b8f648d4 1849 // case SSD1803_5V :
wim 33:900a94bc7585 1850 _writeCommand(0x20 | _function_1); // Select Ext Instr Set
wim 33:900a94bc7585 1851 _writeCommand(0x02); // Power On
wim 32:59c4b8f648d4 1852 _writeCommand(0x20 | _function); // Select Std Instr Set
wim 32:59c4b8f648d4 1853 break;
wim 32:59c4b8f648d4 1854
wim 32:59c4b8f648d4 1855 default:
wim 32:59c4b8f648d4 1856 //Unsupported feature for other controllers
wim 32:59c4b8f648d4 1857 break;
wim 32:59c4b8f648d4 1858 } // end switch
wim 32:59c4b8f648d4 1859 }
wim 32:59c4b8f648d4 1860 else {
wim 32:59c4b8f648d4 1861 // Switch off
wim 32:59c4b8f648d4 1862 setMode(DispOff);
wim 32:59c4b8f648d4 1863
wim 32:59c4b8f648d4 1864 // Controllers that support specific Power Down mode
wim 32:59c4b8f648d4 1865 switch (_ctrl) {
wim 32:59c4b8f648d4 1866
wim 32:59c4b8f648d4 1867 // case PCF2113_3V3 :
wim 32:59c4b8f648d4 1868 // case PCF2119_3V3 :
wim 32:59c4b8f648d4 1869 // case ST7032_3V3 :
wim 32:59c4b8f648d4 1870 //@todo
wim 33:900a94bc7585 1871 // disable Booster Bon
wim 33:900a94bc7585 1872
wim 33:900a94bc7585 1873 case WS0010:
wim 33:900a94bc7585 1874 _writeCommand(0x13); // Char mode, DC/DC off
wim 33:900a94bc7585 1875 break;
wim 33:900a94bc7585 1876
wim 33:900a94bc7585 1877 case KS0078:
wim 32:59c4b8f648d4 1878 case SSD1803_3V3 :
wim 32:59c4b8f648d4 1879 // case SSD1803_5V :
wim 33:900a94bc7585 1880 _writeCommand(0x20 | _function_1); // Select Ext Instr Set
wim 33:900a94bc7585 1881 _writeCommand(0x03); // Power Down
wim 32:59c4b8f648d4 1882 _writeCommand(0x20 | _function); // Select Std Instr Set
wim 32:59c4b8f648d4 1883 break;
wim 32:59c4b8f648d4 1884
wim 32:59c4b8f648d4 1885 default:
wim 32:59c4b8f648d4 1886 //Unsupported feature for other controllers
wim 32:59c4b8f648d4 1887 break;
wim 32:59c4b8f648d4 1888 } // end switch
wim 32:59c4b8f648d4 1889 }
wim 33:900a94bc7585 1890 } // end setPower()
wim 33:900a94bc7585 1891
wim 33:900a94bc7585 1892
wim 33:900a94bc7585 1893 /** Set Orient
wim 33:900a94bc7585 1894 * setOrient method is supported by some compatible devices (eg SSD1803, US2066) that have top/bottom view modes
wim 33:900a94bc7585 1895 *
wim 33:900a94bc7585 1896 * @param LCDOrient orient Orientation
wim 33:900a94bc7585 1897 * @return none
wim 33:900a94bc7585 1898 */
wim 33:900a94bc7585 1899 void TextLCD_Base::setOrient(LCDOrient orient){
wim 33:900a94bc7585 1900
wim 33:900a94bc7585 1901 switch (orient) {
wim 33:900a94bc7585 1902
wim 33:900a94bc7585 1903 case Top:
wim 33:900a94bc7585 1904 switch (_ctrl) {
wim 34:e5a0dcb43ecc 1905 case PCF2103_3V3:
wim 34:e5a0dcb43ecc 1906 case PCF2116_3V3:
wim 34:e5a0dcb43ecc 1907 case PCF2116_5V:
wim 34:e5a0dcb43ecc 1908 case PCF2119_3V3:
wim 34:e5a0dcb43ecc 1909 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1
wim 34:e5a0dcb43ecc 1910 _writeCommand(0x05); // Display Conf Set 0000 0, 1, P=0, Q=1 (Instr. Set 1)
wim 34:e5a0dcb43ecc 1911 _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0
wim 34:e5a0dcb43ecc 1912 break;
wim 34:e5a0dcb43ecc 1913
wim 33:900a94bc7585 1914 case SSD1803_3V3 :
wim 33:900a94bc7585 1915 // case SSD1803_5V :
wim 33:900a94bc7585 1916 case US2066_3V3 :
wim 33:900a94bc7585 1917 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV
wim 33:900a94bc7585 1918 // Select Extended Instruction Set
wim 33:900a94bc7585 1919 // _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)
wim 33:900a94bc7585 1920 _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)
wim 33:900a94bc7585 1921
wim 33:900a94bc7585 1922 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
wim 33:900a94bc7585 1923 // Select Std Instr set, Select IS=0
wim 33:900a94bc7585 1924 break;
wim 33:900a94bc7585 1925
wim 33:900a94bc7585 1926 default:
wim 33:900a94bc7585 1927 //Unsupported feature for other controllers
wim 33:900a94bc7585 1928 break;
wim 33:900a94bc7585 1929
wim 33:900a94bc7585 1930 } // end switch _ctrl
wim 33:900a94bc7585 1931 break; // end Top
wim 33:900a94bc7585 1932
wim 33:900a94bc7585 1933 case Bottom:
wim 33:900a94bc7585 1934 switch (_ctrl) {
wim 34:e5a0dcb43ecc 1935 case PCF2103_3V3:
wim 34:e5a0dcb43ecc 1936 case PCF2116_3V3:
wim 34:e5a0dcb43ecc 1937 case PCF2116_5V:
wim 34:e5a0dcb43ecc 1938 case PCF2119_3V3:
wim 34:e5a0dcb43ecc 1939 _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1
wim 34:e5a0dcb43ecc 1940 _writeCommand(0x06); // Display Conf Set 0000 0, 1, P=1, Q=0 (Instr. Set 1)
wim 34:e5a0dcb43ecc 1941 _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0
wim 34:e5a0dcb43ecc 1942 break;
wim 34:e5a0dcb43ecc 1943
wim 33:900a94bc7585 1944 case SSD1803_3V3 :
wim 33:900a94bc7585 1945 // case SSD1803_5V :
wim 33:900a94bc7585 1946 case US2066_3V3 :
wim 33:900a94bc7585 1947 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV
wim 33:900a94bc7585 1948 // Select Extended Instruction Set
wim 33:900a94bc7585 1949 _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)
wim 33:900a94bc7585 1950 // _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)
wim 33:900a94bc7585 1951
wim 33:900a94bc7585 1952 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
wim 33:900a94bc7585 1953 // Select Std Instr set, Select IS=0
wim 33:900a94bc7585 1954 break;
wim 33:900a94bc7585 1955
wim 33:900a94bc7585 1956 default:
wim 33:900a94bc7585 1957 //Unsupported feature for other controllers
wim 33:900a94bc7585 1958 break;
wim 33:900a94bc7585 1959
wim 33:900a94bc7585 1960 } // end switch _ctrl
wim 33:900a94bc7585 1961
wim 33:900a94bc7585 1962 break; // end Bottom
wim 33:900a94bc7585 1963 } // end switch orient
wim 33:900a94bc7585 1964 } // end setOrient()
wim 33:900a94bc7585 1965
wim 33:900a94bc7585 1966
wim 34:e5a0dcb43ecc 1967 /** Set Big Font
wim 34:e5a0dcb43ecc 1968 * setBigFont method is supported by some compatible devices (eg SSD1803, US2066)
wim 34:e5a0dcb43ecc 1969 *
wim 34:e5a0dcb43ecc 1970 * @param lines The selected Big Font lines (None, TopLine, CenterLine, BottomLine, TopBottomLine)
wim 34:e5a0dcb43ecc 1971 * Double height characters can be shown on lines 1+2, 2+3, 3+4 or 1+2 and 3+4
wim 34:e5a0dcb43ecc 1972 * Valid double height lines depend on the LCDs number of rows.
wim 34:e5a0dcb43ecc 1973 */
wim 34:e5a0dcb43ecc 1974 void TextLCD_Base::setBigFont(LCDBigFont lines) {
wim 34:e5a0dcb43ecc 1975
wim 34:e5a0dcb43ecc 1976 switch (lines) {
wim 34:e5a0dcb43ecc 1977 case None:
wim 34:e5a0dcb43ecc 1978 switch (_ctrl) {
wim 34:e5a0dcb43ecc 1979 case SSD1803_3V3 :
wim 34:e5a0dcb43ecc 1980 case US2066_3V3 :
wim 34:e5a0dcb43ecc 1981 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV
wim 34:e5a0dcb43ecc 1982 // Select Extended Instruction Set
wim 34:e5a0dcb43ecc 1983 _writeCommand(0x1C); // Double Height, 0 0 0 1 UD2=1, UD1=1, X, DH'=0 (Ext Instr Set)
wim 34:e5a0dcb43ecc 1984 // Default
wim 34:e5a0dcb43ecc 1985 _function = _function & ~0x04; // Set function, 0 0 1 DL N DH=0 RE(0) IS=0 Select Instruction Set 0
wim 34:e5a0dcb43ecc 1986 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
wim 34:e5a0dcb43ecc 1987 // Select Std Instr set, Select IS=0
wim 34:e5a0dcb43ecc 1988 break; // end US2066
wim 34:e5a0dcb43ecc 1989
wim 34:e5a0dcb43ecc 1990 default:
wim 34:e5a0dcb43ecc 1991 break; // end default
wim 34:e5a0dcb43ecc 1992 } // end switch _ctrl
wim 34:e5a0dcb43ecc 1993 break; // end None
wim 34:e5a0dcb43ecc 1994
wim 34:e5a0dcb43ecc 1995 case TopLine:
wim 34:e5a0dcb43ecc 1996 if (_nr_rows < 2) return; //Sanity check
wim 34:e5a0dcb43ecc 1997
wim 34:e5a0dcb43ecc 1998 switch (_ctrl) {
wim 34:e5a0dcb43ecc 1999 case SSD1803_3V3 :
wim 34:e5a0dcb43ecc 2000 case US2066_3V3 :
wim 34:e5a0dcb43ecc 2001 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV
wim 34:e5a0dcb43ecc 2002 // Select Extended Instruction Set
wim 34:e5a0dcb43ecc 2003 _writeCommand(0x1C); // Double Height, 0 0 0 1 UD2=1, UD1=1, X, DH'=0 (Ext Instr Set)
wim 34:e5a0dcb43ecc 2004 // Default
wim 34:e5a0dcb43ecc 2005 _function = _function | 0x04; // Set function, 0 0 1 DL N DH=1 RE(0) IS=0 Select Instruction Set 0
wim 34:e5a0dcb43ecc 2006 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
wim 34:e5a0dcb43ecc 2007 // Select Std Instr set, Select IS=0
wim 34:e5a0dcb43ecc 2008 break; // end US2066, SSD1803
wim 34:e5a0dcb43ecc 2009
wim 34:e5a0dcb43ecc 2010 default:
wim 34:e5a0dcb43ecc 2011 break; // end default
wim 34:e5a0dcb43ecc 2012 } // end switch _ctrl
wim 34:e5a0dcb43ecc 2013 break; // end TopLine
wim 34:e5a0dcb43ecc 2014
wim 34:e5a0dcb43ecc 2015 case CenterLine:
wim 34:e5a0dcb43ecc 2016 if (_nr_rows != 4) return; //Sanity check
wim 34:e5a0dcb43ecc 2017
wim 34:e5a0dcb43ecc 2018 switch (_ctrl) {
wim 34:e5a0dcb43ecc 2019 case SSD1803_3V3 :
wim 34:e5a0dcb43ecc 2020 case US2066_3V3 :
wim 34:e5a0dcb43ecc 2021 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV
wim 34:e5a0dcb43ecc 2022 // Select Extended Instruction Set
wim 34:e5a0dcb43ecc 2023 _writeCommand(0x14); // Double Height, 0 0 0 1 UD2=0, UD1=1, X, DH'=0 (Ext Instr Set)
wim 34:e5a0dcb43ecc 2024 // Default
wim 34:e5a0dcb43ecc 2025 _function = _function | 0x04; // Set function, 0 0 1 DL N DH=1 RE(0) IS=0 Select Instruction Set 0
wim 34:e5a0dcb43ecc 2026 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
wim 34:e5a0dcb43ecc 2027 // Select Std Instr set, Select IS=0
wim 34:e5a0dcb43ecc 2028 break; // end US2066, SSD1803
wim 34:e5a0dcb43ecc 2029
wim 34:e5a0dcb43ecc 2030 default:
wim 34:e5a0dcb43ecc 2031 break; // end default
wim 34:e5a0dcb43ecc 2032 } // end switch _ctrl
wim 34:e5a0dcb43ecc 2033 break; // end CenterLine
wim 34:e5a0dcb43ecc 2034
wim 34:e5a0dcb43ecc 2035 case BottomLine:
wim 34:e5a0dcb43ecc 2036 if (_nr_rows < 3) return; //Sanity check
wim 34:e5a0dcb43ecc 2037
wim 34:e5a0dcb43ecc 2038 switch (_ctrl) {
wim 34:e5a0dcb43ecc 2039 case SSD1803_3V3 :
wim 34:e5a0dcb43ecc 2040 case US2066_3V3 :
wim 34:e5a0dcb43ecc 2041 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV
wim 34:e5a0dcb43ecc 2042 // Select Extended Instruction Set
wim 34:e5a0dcb43ecc 2043 if (_nr_rows == 3) {
wim 34:e5a0dcb43ecc 2044 _writeCommand(0x14); // Double Height, 0 0 0 1 UD2=0, UD1=1, X, DH'=0 (Ext Instr Set)
wim 34:e5a0dcb43ecc 2045 }
wim 34:e5a0dcb43ecc 2046 else {
wim 34:e5a0dcb43ecc 2047 _writeCommand(0x10); // Double Height, 0 0 0 1 UD2=0, UD1=0, X, DH'=0 (Ext Instr Set)
wim 34:e5a0dcb43ecc 2048 }
wim 34:e5a0dcb43ecc 2049 _function = _function | 0x04; // Set function, 0 0 1 DL N DH=1 RE(0) IS=0 Select Instruction Set 0
wim 34:e5a0dcb43ecc 2050 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
wim 34:e5a0dcb43ecc 2051 // Select Std Instr set, Select IS=0
wim 34:e5a0dcb43ecc 2052 break; // end US2066, SSD1803
wim 34:e5a0dcb43ecc 2053
wim 34:e5a0dcb43ecc 2054 default:
wim 34:e5a0dcb43ecc 2055 break; // end default
wim 34:e5a0dcb43ecc 2056 } // end switch _ctrl
wim 34:e5a0dcb43ecc 2057 break; // end BottomLine
wim 34:e5a0dcb43ecc 2058
wim 34:e5a0dcb43ecc 2059 case TopBottomLine:
wim 34:e5a0dcb43ecc 2060 if (_nr_rows != 4) return; //Sanity check
wim 34:e5a0dcb43ecc 2061
wim 34:e5a0dcb43ecc 2062 switch (_ctrl) {
wim 34:e5a0dcb43ecc 2063 case SSD1803_3V3 :
wim 34:e5a0dcb43ecc 2064 case US2066_3V3 :
wim 34:e5a0dcb43ecc 2065 _writeCommand(0x20 | _function_1); // Set function, 0 0 1 X N BE RE(1) REV
wim 34:e5a0dcb43ecc 2066 // Select Extended Instruction Set
wim 34:e5a0dcb43ecc 2067 _writeCommand(0x18); // Double Height, 0 0 0 1 UD2=1, UD1=0, X, DH'=0 (Ext Instr Set)
wim 34:e5a0dcb43ecc 2068 // Default
wim 34:e5a0dcb43ecc 2069 _function = _function | 0x04; // Set function, 0 0 1 DL N DH=1 RE(0) IS=0 Select Instruction Set 0
wim 34:e5a0dcb43ecc 2070 _writeCommand(0x20 | _function); // Set function, 0 0 1 DL N DH RE(0) IS=0 Select Instruction Set 0
wim 34:e5a0dcb43ecc 2071 // Select Std Instr set, Select IS=0
wim 34:e5a0dcb43ecc 2072 break; // end US2066, SSD1803
wim 34:e5a0dcb43ecc 2073
wim 34:e5a0dcb43ecc 2074 default:
wim 34:e5a0dcb43ecc 2075 break; // end default
wim 34:e5a0dcb43ecc 2076 } // end switch _ctrl
wim 34:e5a0dcb43ecc 2077 break; // end TopBottomLine
wim 34:e5a0dcb43ecc 2078
wim 34:e5a0dcb43ecc 2079 } // end switch lines
wim 34:e5a0dcb43ecc 2080
wim 34:e5a0dcb43ecc 2081 } // end setBigFont()
wim 32:59c4b8f648d4 2082
wim 23:d47f226efb24 2083 //--------- End TextLCD_Base -----------
wim 21:9eb628d9e164 2084
wim 22:35742ec80c24 2085
wim 23:d47f226efb24 2086 //--------- Start TextLCD Bus -----------
wim 21:9eb628d9e164 2087
wim 21:9eb628d9e164 2088 /* Create a TextLCD interface for using regular mbed pins
wim 21:9eb628d9e164 2089 *
wim 21:9eb628d9e164 2090 * @param rs Instruction/data control line
wim 21:9eb628d9e164 2091 * @param e Enable line (clock)
wim 21:9eb628d9e164 2092 * @param d4-d7 Data lines for using as a 4-bit interface
wim 21:9eb628d9e164 2093 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 21:9eb628d9e164 2094 * @param bl Backlight control line (optional, default = NC)
wim 21:9eb628d9e164 2095 * @param e2 Enable2 line (clock for second controller, LCD40x4 only)
wim 21:9eb628d9e164 2096 * @param ctrl LCD controller (default = HD44780)
wim 21:9eb628d9e164 2097 */
wim 21:9eb628d9e164 2098 TextLCD::TextLCD(PinName rs, PinName e,
wim 21:9eb628d9e164 2099 PinName d4, PinName d5, PinName d6, PinName d7,
wim 21:9eb628d9e164 2100 LCDType type, PinName bl, PinName e2, LCDCtrl ctrl) :
wim 21:9eb628d9e164 2101 TextLCD_Base(type, ctrl),
wim 22:35742ec80c24 2102 _rs(rs), _e(e), _d(d4, d5, d6, d7) {
wim 22:35742ec80c24 2103
wim 22:35742ec80c24 2104 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access.
wim 22:35742ec80c24 2105 if (bl != NC) {
wim 22:35742ec80c24 2106 _bl = new DigitalOut(bl); //Construct new pin
wim 22:35742ec80c24 2107 _bl->write(0); //Deactivate
wim 22:35742ec80c24 2108 }
wim 22:35742ec80c24 2109 else {
wim 22:35742ec80c24 2110 // No Hardware Backlight pin
wim 22:35742ec80c24 2111 _bl = NULL; //Construct dummy pin
wim 22:35742ec80c24 2112 }
wim 22:35742ec80c24 2113
wim 22:35742ec80c24 2114 // The hardware Enable2 pin is only needed for LCD40x4. Test and make sure whether it exists or not to prevent illegal access.
wim 22:35742ec80c24 2115 if (e2 != NC) {
wim 22:35742ec80c24 2116 _e2 = new DigitalOut(e2); //Construct new pin
wim 22:35742ec80c24 2117 _e2->write(0); //Deactivate
wim 22:35742ec80c24 2118 }
wim 22:35742ec80c24 2119 else {
wim 22:35742ec80c24 2120 // No Hardware Enable pin
wim 22:35742ec80c24 2121 _e2 = NULL; //Construct dummy pin
wim 22:35742ec80c24 2122 }
wim 21:9eb628d9e164 2123
wim 21:9eb628d9e164 2124 _init();
wim 21:9eb628d9e164 2125 }
wim 21:9eb628d9e164 2126
wim 29:a3663151aa65 2127 /** Destruct a TextLCD interface for using regular mbed pins
wim 29:a3663151aa65 2128 *
wim 29:a3663151aa65 2129 * @param none
wim 29:a3663151aa65 2130 * @return none
wim 29:a3663151aa65 2131 */
wim 29:a3663151aa65 2132 TextLCD::~TextLCD() {
wim 29:a3663151aa65 2133 if (_bl != NULL) {delete _bl;} // BL pin
wim 29:a3663151aa65 2134 if (_e2 != NULL) {delete _e2;} // E2 pin
wim 29:a3663151aa65 2135 }
wim 29:a3663151aa65 2136
wim 29:a3663151aa65 2137
wim 22:35742ec80c24 2138 /** Set E pin (or E2 pin)
wim 22:35742ec80c24 2139 * Used for mbed pins, I2C bus expander or SPI shiftregister
wim 22:35742ec80c24 2140 * Default PinName value for E2 is NC, must be used as pointer to avoid issues with mbed lib and DigitalOut pins
wim 22:35742ec80c24 2141 * @param value true or false
wim 22:35742ec80c24 2142 * @return none
wim 22:35742ec80c24 2143 */
wim 21:9eb628d9e164 2144 void TextLCD::_setEnable(bool value) {
wim 21:9eb628d9e164 2145
wim 22:35742ec80c24 2146 if(_ctrl_idx==_LCDCtrl_0) {
wim 22:35742ec80c24 2147 if (value) {
wim 22:35742ec80c24 2148 _e = 1; // Set E bit
wim 22:35742ec80c24 2149 }
wim 22:35742ec80c24 2150 else {
wim 22:35742ec80c24 2151 _e = 0; // Reset E bit
wim 22:35742ec80c24 2152 }
wim 22:35742ec80c24 2153 }
wim 22:35742ec80c24 2154 else {
wim 22:35742ec80c24 2155 if (value) {
wim 22:35742ec80c24 2156 if (_e2 != NULL) {_e2->write(1);} //Set E2 bit
wim 22:35742ec80c24 2157 }
wim 22:35742ec80c24 2158 else {
wim 22:35742ec80c24 2159 if (_e2 != NULL) {_e2->write(0);} //Reset E2 bit
wim 22:35742ec80c24 2160 }
wim 22:35742ec80c24 2161 }
wim 21:9eb628d9e164 2162 }
wim 21:9eb628d9e164 2163
wim 21:9eb628d9e164 2164 // Set RS pin
wim 21:9eb628d9e164 2165 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 21:9eb628d9e164 2166 void TextLCD::_setRS(bool value) {
wim 21:9eb628d9e164 2167
wim 22:35742ec80c24 2168 if (value) {
wim 21:9eb628d9e164 2169 _rs = 1; // Set RS bit
wim 22:35742ec80c24 2170 }
wim 22:35742ec80c24 2171 else {
wim 21:9eb628d9e164 2172 _rs = 0; // Reset RS bit
wim 22:35742ec80c24 2173 }
wim 21:9eb628d9e164 2174 }
wim 21:9eb628d9e164 2175
wim 22:35742ec80c24 2176 /** Set BL pin
wim 22:35742ec80c24 2177 * Used for mbed pins, I2C bus expander or SPI shiftregister
wim 22:35742ec80c24 2178 * Default PinName value is NC, must be used as pointer to avoid issues with mbed lib and DigitalOut pins
wim 22:35742ec80c24 2179 * @param value true or false
wim 22:35742ec80c24 2180 * @return none
wim 22:35742ec80c24 2181 */
wim 21:9eb628d9e164 2182 void TextLCD::_setBL(bool value) {
wim 21:9eb628d9e164 2183
wim 22:35742ec80c24 2184 if (value) {
wim 22:35742ec80c24 2185 if (_bl != NULL) {_bl->write(1);} //Set BL bit
wim 22:35742ec80c24 2186 }
wim 22:35742ec80c24 2187 else {
wim 22:35742ec80c24 2188 if (_bl != NULL) {_bl->write(0);} //Reset BL bit
wim 22:35742ec80c24 2189 }
wim 21:9eb628d9e164 2190 }
wim 21:9eb628d9e164 2191
wim 21:9eb628d9e164 2192 // Place the 4bit data on the databus
wim 21:9eb628d9e164 2193 // Used for mbed pins, I2C bus expander or SPI shifregister
wim 21:9eb628d9e164 2194 void TextLCD::_setData(int value) {
wim 21:9eb628d9e164 2195 _d = value & 0x0F; // Write Databits
wim 21:9eb628d9e164 2196 }
wim 34:e5a0dcb43ecc 2197
wim 23:d47f226efb24 2198 //----------- End TextLCD ---------------
wim 21:9eb628d9e164 2199
wim 21:9eb628d9e164 2200
wim 23:d47f226efb24 2201 //--------- Start TextLCD_I2C -----------
wim 34:e5a0dcb43ecc 2202 #if(LCD_I2C == 1) /* I2C Expander PCF8574/MCP23008 */
wim 26:bd897a001012 2203 /** Create a TextLCD interface using an I2C PC8574 (or PCF8574A) or MCP23008 portexpander
wim 22:35742ec80c24 2204 *
wim 22:35742ec80c24 2205 * @param i2c I2C Bus
wim 26:bd897a001012 2206 * @param deviceAddress I2C slave address (PCF8574, PCF8574A or MCP23008, default = 0x40)
wim 22:35742ec80c24 2207 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 22:35742ec80c24 2208 * @param ctrl LCD controller (default = HD44780)
wim 22:35742ec80c24 2209 */
wim 21:9eb628d9e164 2210 TextLCD_I2C::TextLCD_I2C(I2C *i2c, char deviceAddress, LCDType type, LCDCtrl ctrl) :
wim 21:9eb628d9e164 2211 TextLCD_Base(type, ctrl),
wim 21:9eb628d9e164 2212 _i2c(i2c){
wim 21:9eb628d9e164 2213
wim 22:35742ec80c24 2214 _slaveAddress = deviceAddress & 0xFE;
wim 28:30fa94f7341c 2215
wim 28:30fa94f7341c 2216 // Setup the I2C bus
wim 28:30fa94f7341c 2217 // The max bitrate for PCF8574 is 100kbit, the max bitrate for MCP23008 is 400kbit,
wim 32:59c4b8f648d4 2218 _i2c->frequency(100000);
wim 21:9eb628d9e164 2219
wim 26:bd897a001012 2220 #if (MCP23008==1)
wim 26:bd897a001012 2221 // MCP23008 portexpander Init
wim 27:22d5086f6ba6 2222 _write_register(IODIR, 0x00); // All outputs
wim 27:22d5086f6ba6 2223 _write_register(IPOL, 0x00); // No reverse polarity
wim 27:22d5086f6ba6 2224 _write_register(GPINTEN, 0x00); // No interrupt
wim 27:22d5086f6ba6 2225 _write_register(DEFVAL, 0x00); // Default value to compare against for interrupts
wim 27:22d5086f6ba6 2226 _write_register(INTCON, 0x00); // No interrupt on changes
wim 27:22d5086f6ba6 2227 _write_register(IOCON, 0x00); // Interrupt polarity
wim 27:22d5086f6ba6 2228 _write_register(GPPU, 0x00); // No Pullup
wim 27:22d5086f6ba6 2229 _write_register(INTF, 0x00); //
wim 27:22d5086f6ba6 2230 _write_register(INTCAP, 0x00); //
wim 27:22d5086f6ba6 2231 _write_register(GPIO, 0x00); // Output/Input pins
wim 27:22d5086f6ba6 2232 _write_register(OLAT, 0x00); // Output Latch
wim 26:bd897a001012 2233
wim 21:9eb628d9e164 2234 // Init the portexpander bus
wim 21:9eb628d9e164 2235 _lcd_bus = D_LCD_BUS_DEF;
wim 21:9eb628d9e164 2236
wim 21:9eb628d9e164 2237 // write the new data to the portexpander
wim 26:bd897a001012 2238 _write_register(GPIO, _lcd_bus);
wim 26:bd897a001012 2239 #else
wim 26:bd897a001012 2240 // PCF8574 of PCF8574A portexpander
wim 26:bd897a001012 2241
wim 26:bd897a001012 2242 // Init the portexpander bus
wim 26:bd897a001012 2243 _lcd_bus = D_LCD_BUS_DEF;
wim 26:bd897a001012 2244
wim 26:bd897a001012 2245 // write the new data to the portexpander
wim 21:9eb628d9e164 2246 _i2c->write(_slaveAddress, &_lcd_bus, 1);
wim 26:bd897a001012 2247 #endif
wim 21:9eb628d9e164 2248
wim 30:033048611c01 2249 _init();
wim 21:9eb628d9e164 2250 }
wim 21:9eb628d9e164 2251
wim 21:9eb628d9e164 2252 // Set E pin (or E2 pin)
wim 21:9eb628d9e164 2253 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 21:9eb628d9e164 2254 void TextLCD_I2C::_setEnable(bool value) {
wim 21:9eb628d9e164 2255
wim 22:35742ec80c24 2256 if(_ctrl_idx==_LCDCtrl_0) {
wim 26:bd897a001012 2257 if (value) {
wim 22:35742ec80c24 2258 _lcd_bus |= D_LCD_E; // Set E bit
wim 26:bd897a001012 2259 }
wim 26:bd897a001012 2260 else {
wim 22:35742ec80c24 2261 _lcd_bus &= ~D_LCD_E; // Reset E bit
wim 26:bd897a001012 2262 }
wim 22:35742ec80c24 2263 }
wim 22:35742ec80c24 2264 else {
wim 26:bd897a001012 2265 if (value) {
wim 22:35742ec80c24 2266 _lcd_bus |= D_LCD_E2; // Set E2 bit
wim 26:bd897a001012 2267 }
wim 26:bd897a001012 2268 else {
wim 22:35742ec80c24 2269 _lcd_bus &= ~D_LCD_E2; // Reset E2bit
wim 26:bd897a001012 2270 }
wim 26:bd897a001012 2271 }
wim 26:bd897a001012 2272
wim 26:bd897a001012 2273 #if (MCP23008==1)
wim 26:bd897a001012 2274 // MCP23008 portexpander
wim 26:bd897a001012 2275
wim 26:bd897a001012 2276 // write the new data to the portexpander
wim 26:bd897a001012 2277 _write_register(GPIO, _lcd_bus);
wim 26:bd897a001012 2278 #else
wim 26:bd897a001012 2279 // PCF8574 of PCF8574A portexpander
wim 21:9eb628d9e164 2280
wim 22:35742ec80c24 2281 // write the new data to the I2C portexpander
wim 22:35742ec80c24 2282 _i2c->write(_slaveAddress, &_lcd_bus, 1);
wim 26:bd897a001012 2283 #endif
wim 21:9eb628d9e164 2284 }
wim 21:9eb628d9e164 2285
wim 21:9eb628d9e164 2286 // Set RS pin
wim 21:9eb628d9e164 2287 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 21:9eb628d9e164 2288 void TextLCD_I2C::_setRS(bool value) {
wim 21:9eb628d9e164 2289
wim 26:bd897a001012 2290 if (value) {
wim 22:35742ec80c24 2291 _lcd_bus |= D_LCD_RS; // Set RS bit
wim 26:bd897a001012 2292 }
wim 26:bd897a001012 2293 else {
wim 22:35742ec80c24 2294 _lcd_bus &= ~D_LCD_RS; // Reset RS bit
wim 26:bd897a001012 2295 }
wim 26:bd897a001012 2296
wim 26:bd897a001012 2297 #if (MCP23008==1)
wim 26:bd897a001012 2298 // MCP23008 portexpander
wim 26:bd897a001012 2299
wim 26:bd897a001012 2300 // write the new data to the portexpander
wim 26:bd897a001012 2301 _write_register(GPIO, _lcd_bus);
wim 26:bd897a001012 2302 #else
wim 26:bd897a001012 2303 // PCF8574 of PCF8574A portexpander
wim 21:9eb628d9e164 2304
wim 22:35742ec80c24 2305 // write the new data to the I2C portexpander
wim 22:35742ec80c24 2306 _i2c->write(_slaveAddress, &_lcd_bus, 1);
wim 30:033048611c01 2307 #endif
wim 21:9eb628d9e164 2308 }
wim 21:9eb628d9e164 2309
wim 21:9eb628d9e164 2310 // Set BL pin
wim 21:9eb628d9e164 2311 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 21:9eb628d9e164 2312 void TextLCD_I2C::_setBL(bool value) {
wim 21:9eb628d9e164 2313
wim 26:bd897a001012 2314 if (value) {
wim 21:9eb628d9e164 2315 _lcd_bus |= D_LCD_BL; // Set BL bit
wim 26:bd897a001012 2316 }
wim 26:bd897a001012 2317 else {
wim 21:9eb628d9e164 2318 _lcd_bus &= ~D_LCD_BL; // Reset BL bit
wim 26:bd897a001012 2319 }
wim 26:bd897a001012 2320
wim 26:bd897a001012 2321 #if (MCP23008==1)
wim 26:bd897a001012 2322 // MCP23008 portexpander
wim 26:bd897a001012 2323
wim 26:bd897a001012 2324 // write the new data to the portexpander
wim 26:bd897a001012 2325 _write_register(GPIO, _lcd_bus);
wim 26:bd897a001012 2326 #else
wim 26:bd897a001012 2327 // PCF8574 of PCF8574A portexpander
wim 21:9eb628d9e164 2328
wim 21:9eb628d9e164 2329 // write the new data to the I2C portexpander
wim 21:9eb628d9e164 2330 _i2c->write(_slaveAddress, &_lcd_bus, 1);
wim 30:033048611c01 2331 #endif
wim 21:9eb628d9e164 2332 }
wim 21:9eb628d9e164 2333
wim 21:9eb628d9e164 2334
wim 21:9eb628d9e164 2335 // Place the 4bit data on the databus
wim 21:9eb628d9e164 2336 // Used for mbed pins, I2C bus expander or SPI shifregister
wim 21:9eb628d9e164 2337 void TextLCD_I2C::_setData(int value) {
wim 21:9eb628d9e164 2338 int data;
wim 22:35742ec80c24 2339
wim 22:35742ec80c24 2340 // Set bit by bit to support any mapping of expander portpins to LCD pins
wim 21:9eb628d9e164 2341
wim 22:35742ec80c24 2342 data = value & 0x0F;
wim 26:bd897a001012 2343 if (data & 0x01){
wim 22:35742ec80c24 2344 _lcd_bus |= D_LCD_D4; // Set Databit
wim 26:bd897a001012 2345 }
wim 26:bd897a001012 2346 else {
wim 26:bd897a001012 2347 _lcd_bus &= ~D_LCD_D4; // Reset Databit
wim 26:bd897a001012 2348 }
wim 21:9eb628d9e164 2349
wim 26:bd897a001012 2350 if (data & 0x02){
wim 22:35742ec80c24 2351 _lcd_bus |= D_LCD_D5; // Set Databit
wim 26:bd897a001012 2352 }
wim 26:bd897a001012 2353 else {
wim 26:bd897a001012 2354 _lcd_bus &= ~D_LCD_D5; // Reset Databit
wim 26:bd897a001012 2355 }
wim 21:9eb628d9e164 2356
wim 26:bd897a001012 2357 if (data & 0x04) {
wim 22:35742ec80c24 2358 _lcd_bus |= D_LCD_D6; // Set Databit
wim 26:bd897a001012 2359 }
wim 26:bd897a001012 2360 else {
wim 26:bd897a001012 2361 _lcd_bus &= ~D_LCD_D6; // Reset Databit
wim 26:bd897a001012 2362 }
wim 21:9eb628d9e164 2363
wim 26:bd897a001012 2364 if (data & 0x08) {
wim 22:35742ec80c24 2365 _lcd_bus |= D_LCD_D7; // Set Databit
wim 26:bd897a001012 2366 }
wim 26:bd897a001012 2367 else {
wim 26:bd897a001012 2368 _lcd_bus &= ~D_LCD_D7; // Reset Databit
wim 26:bd897a001012 2369 }
wim 21:9eb628d9e164 2370
wim 26:bd897a001012 2371 #if (MCP23008==1)
wim 26:bd897a001012 2372 // MCP23008 portexpander
wim 26:bd897a001012 2373
wim 26:bd897a001012 2374 // write the new data to the portexpander
wim 26:bd897a001012 2375 _write_register(GPIO, _lcd_bus);
wim 26:bd897a001012 2376 #else
wim 26:bd897a001012 2377 // PCF8574 of PCF8574A portexpander
wim 26:bd897a001012 2378
wim 22:35742ec80c24 2379 // write the new data to the I2C portexpander
wim 26:bd897a001012 2380 _i2c->write(_slaveAddress, &_lcd_bus, 1);
wim 26:bd897a001012 2381 #endif
wim 22:35742ec80c24 2382
wim 22:35742ec80c24 2383 }
wim 21:9eb628d9e164 2384
wim 26:bd897a001012 2385 // Write data to MCP23008 I2C portexpander
wim 26:bd897a001012 2386 void TextLCD_I2C::_write_register (int reg, int value) {
wim 26:bd897a001012 2387 char data[] = {reg, value};
wim 26:bd897a001012 2388
wim 30:033048611c01 2389 _i2c->write(_slaveAddress, data, 2);
wim 26:bd897a001012 2390 }
wim 34:e5a0dcb43ecc 2391 #endif /* I2C Expander PCF8574/MCP23008 */
wim 23:d47f226efb24 2392 //---------- End TextLCD_I2C ------------
wim 21:9eb628d9e164 2393
wim 21:9eb628d9e164 2394
wim 28:30fa94f7341c 2395 //--------- Start TextLCD_I2C_N ---------
wim 34:e5a0dcb43ecc 2396 #if(LCD_I2C_N == 1) /* Native I2C */
wim 28:30fa94f7341c 2397
wim 28:30fa94f7341c 2398 /** Create a TextLCD interface using a controller with native I2C interface
wim 28:30fa94f7341c 2399 *
wim 28:30fa94f7341c 2400 * @param i2c I2C Bus
wim 28:30fa94f7341c 2401 * @param deviceAddress I2C slave address (default = 0x7C)
wim 28:30fa94f7341c 2402 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 28:30fa94f7341c 2403 * @param bl Backlight control line (optional, default = NC)
wim 28:30fa94f7341c 2404 * @param ctrl LCD controller (default = ST7032_3V3)
wim 28:30fa94f7341c 2405 */
wim 28:30fa94f7341c 2406 TextLCD_I2C_N::TextLCD_I2C_N(I2C *i2c, char deviceAddress, LCDType type, PinName bl, LCDCtrl ctrl) :
wim 28:30fa94f7341c 2407 TextLCD_Base(type, ctrl),
wim 32:59c4b8f648d4 2408
wim 33:900a94bc7585 2409 _i2c(i2c){
wim 30:033048611c01 2410
wim 28:30fa94f7341c 2411 _slaveAddress = deviceAddress & 0xFE;
wim 28:30fa94f7341c 2412
wim 28:30fa94f7341c 2413 // Setup the I2C bus
wim 29:a3663151aa65 2414 // The max bitrate for ST7032i is 400kbit, lets stick to default here
wim 29:a3663151aa65 2415 _i2c->frequency(100000);
wim 32:59c4b8f648d4 2416
wim 30:033048611c01 2417
wim 28:30fa94f7341c 2418 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access.
wim 28:30fa94f7341c 2419 if (bl != NC) {
wim 28:30fa94f7341c 2420 _bl = new DigitalOut(bl); //Construct new pin
wim 28:30fa94f7341c 2421 _bl->write(0); //Deactivate
wim 28:30fa94f7341c 2422 }
wim 28:30fa94f7341c 2423 else {
wim 28:30fa94f7341c 2424 // No Hardware Backlight pin
wim 28:30fa94f7341c 2425 _bl = NULL; //Construct dummy pin
wim 28:30fa94f7341c 2426 }
wim 28:30fa94f7341c 2427
wim 30:033048611c01 2428 //Sanity check
wim 30:033048611c01 2429 if (_ctrl & LCD_C_I2C) {
wim 30:033048611c01 2430 _init();
wim 30:033048611c01 2431 }
wim 30:033048611c01 2432 else {
wim 30:033048611c01 2433 error("Error: LCD Controller type does not support native I2C interface\n\r");
wim 30:033048611c01 2434 }
wim 30:033048611c01 2435
wim 28:30fa94f7341c 2436 }
wim 28:30fa94f7341c 2437
wim 28:30fa94f7341c 2438 TextLCD_I2C_N::~TextLCD_I2C_N() {
wim 28:30fa94f7341c 2439 if (_bl != NULL) {delete _bl;} // BL pin
wim 28:30fa94f7341c 2440 }
wim 28:30fa94f7341c 2441
wim 28:30fa94f7341c 2442 // Not used in this mode
wim 28:30fa94f7341c 2443 void TextLCD_I2C_N::_setEnable(bool value) {
wim 28:30fa94f7341c 2444 }
wim 28:30fa94f7341c 2445
wim 28:30fa94f7341c 2446 // Set RS pin
wim 28:30fa94f7341c 2447 // Used for mbed pins, I2C bus expander or SPI shiftregister and native I2C or SPI
wim 28:30fa94f7341c 2448 void TextLCD_I2C_N::_setRS(bool value) {
wim 30:033048611c01 2449 // The controlbyte defines the meaning of the next byte. This next byte can either be data or command.
wim 30:033048611c01 2450 // Start Slaveaddress+RW b7 b6 b5 b4 b3 b2 b1 b0 b7...........b0 Stop
wim 30:033048611c01 2451 // Co RS RW 0 0 0 0 0 command or data
wim 30:033048611c01 2452 //
wim 30:033048611c01 2453 // C0=1 indicates that another controlbyte will follow after the next data or command byte
wim 30:033048611c01 2454 // RS=1 means that next byte is data, RS=0 means that next byte is command
wim 30:033048611c01 2455 // RW=0 means write to controller. RW=1 means that controller will be read from after the next command.
wim 30:033048611c01 2456 // Many native I2C controllers dont support this option and it is not used by this lib.
wim 30:033048611c01 2457 //
wim 30:033048611c01 2458
wim 28:30fa94f7341c 2459 if (value) {
wim 28:30fa94f7341c 2460 _controlbyte = 0x40; // Next byte is data, No more control bytes will follow
wim 28:30fa94f7341c 2461 }
wim 28:30fa94f7341c 2462 else {
wim 28:30fa94f7341c 2463 _controlbyte = 0x00; // Next byte is command, No more control bytes will follow
wim 28:30fa94f7341c 2464 }
wim 28:30fa94f7341c 2465 }
wim 28:30fa94f7341c 2466
wim 28:30fa94f7341c 2467 // Set BL pin
wim 28:30fa94f7341c 2468 void TextLCD_I2C_N::_setBL(bool value) {
wim 28:30fa94f7341c 2469 if (_bl) {
wim 28:30fa94f7341c 2470 _bl->write(value);
wim 28:30fa94f7341c 2471 }
wim 28:30fa94f7341c 2472 }
wim 29:a3663151aa65 2473
wim 29:a3663151aa65 2474 // Not used in this mode
wim 29:a3663151aa65 2475 void TextLCD_I2C_N::_setData(int value) {
wim 29:a3663151aa65 2476 }
wim 29:a3663151aa65 2477
wim 28:30fa94f7341c 2478 // Write a byte using I2C
wim 28:30fa94f7341c 2479 void TextLCD_I2C_N::_writeByte(int value) {
wim 30:033048611c01 2480 // The controlbyte defines the meaning of the next byte. This next byte can either be data or command.
wim 30:033048611c01 2481 // Start Slaveaddress+RW b7 b6 b5 b4 b3 b2 b1 b0 b7...........b0 Stop
wim 30:033048611c01 2482 // Co RS RW 0 0 0 0 0 command or data
wim 30:033048611c01 2483 //
wim 30:033048611c01 2484 // C0=1 indicates that another controlbyte will follow after the next data or command byte
wim 30:033048611c01 2485 // RS=1 means that next byte is data, RS=0 means that next byte is command
wim 30:033048611c01 2486 // RW=0 means write to controller. RW=1 means that controller will be read from after the next command.
wim 30:033048611c01 2487 // Many native I2C controllers dont support this option and it is not used by this lib.
wim 30:033048611c01 2488 //
wim 28:30fa94f7341c 2489 char data[] = {_controlbyte, value};
wim 28:30fa94f7341c 2490
wim 32:59c4b8f648d4 2491 #if(LCD_I2C_ACK==1)
wim 32:59c4b8f648d4 2492 //Controllers that support ACK
wim 30:033048611c01 2493 _i2c->write(_slaveAddress, data, 2);
wim 32:59c4b8f648d4 2494 #else
wim 32:59c4b8f648d4 2495 //Controllers that dont support ACK
wim 32:59c4b8f648d4 2496 _i2c->start();
wim 32:59c4b8f648d4 2497 _i2c->write(_slaveAddress);
wim 32:59c4b8f648d4 2498 _i2c->write(data[0]);
wim 32:59c4b8f648d4 2499 _i2c->write(data[1]);
wim 32:59c4b8f648d4 2500 _i2c->stop();
wim 32:59c4b8f648d4 2501 #endif
wim 28:30fa94f7341c 2502 }
wim 34:e5a0dcb43ecc 2503 #endif /* Native I2C */
wim 28:30fa94f7341c 2504 //-------- End TextLCD_I2C_N ------------
wim 28:30fa94f7341c 2505
wim 28:30fa94f7341c 2506
wim 23:d47f226efb24 2507 //--------- Start TextLCD_SPI -----------
wim 34:e5a0dcb43ecc 2508 #if(LCD_SPI == 1) /* SPI Expander SN74595 */
wim 21:9eb628d9e164 2509
wim 22:35742ec80c24 2510 /** Create a TextLCD interface using an SPI 74595 portexpander
wim 22:35742ec80c24 2511 *
wim 22:35742ec80c24 2512 * @param spi SPI Bus
wim 22:35742ec80c24 2513 * @param cs chip select pin (active low)
wim 22:35742ec80c24 2514 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 22:35742ec80c24 2515 * @param ctrl LCD controller (default = HD44780)
wim 22:35742ec80c24 2516 */
wim 21:9eb628d9e164 2517 TextLCD_SPI::TextLCD_SPI(SPI *spi, PinName cs, LCDType type, LCDCtrl ctrl) :
wim 21:9eb628d9e164 2518 TextLCD_Base(type, ctrl),
wim 21:9eb628d9e164 2519 _spi(spi),
wim 21:9eb628d9e164 2520 _cs(cs) {
wim 21:9eb628d9e164 2521
wim 32:59c4b8f648d4 2522 // Init cs
wim 32:59c4b8f648d4 2523 _setCS(true);
wim 32:59c4b8f648d4 2524
wim 21:9eb628d9e164 2525 // Setup the spi for 8 bit data, low steady state clock,
wim 21:9eb628d9e164 2526 // rising edge capture, with a 500KHz or 1MHz clock rate
wim 21:9eb628d9e164 2527 _spi->format(8,0);
wim 21:9eb628d9e164 2528 _spi->frequency(500000);
wim 21:9eb628d9e164 2529 //_spi.frequency(1000000);
wim 21:9eb628d9e164 2530
wim 21:9eb628d9e164 2531 // Init the portexpander bus
wim 21:9eb628d9e164 2532 _lcd_bus = D_LCD_BUS_DEF;
wim 21:9eb628d9e164 2533
wim 21:9eb628d9e164 2534 // write the new data to the portexpander
wim 21:9eb628d9e164 2535 _setCS(false);
wim 21:9eb628d9e164 2536 _spi->write(_lcd_bus);
wim 21:9eb628d9e164 2537 _setCS(true);
wim 30:033048611c01 2538
wim 30:033048611c01 2539 _init();
wim 21:9eb628d9e164 2540 }
wim 21:9eb628d9e164 2541
wim 21:9eb628d9e164 2542 // Set E pin (or E2 pin)
wim 21:9eb628d9e164 2543 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 21:9eb628d9e164 2544 void TextLCD_SPI::_setEnable(bool value) {
wim 21:9eb628d9e164 2545
wim 22:35742ec80c24 2546 if(_ctrl_idx==_LCDCtrl_0) {
wim 26:bd897a001012 2547 if (value) {
wim 22:35742ec80c24 2548 _lcd_bus |= D_LCD_E; // Set E bit
wim 26:bd897a001012 2549 }
wim 26:bd897a001012 2550 else {
wim 22:35742ec80c24 2551 _lcd_bus &= ~D_LCD_E; // Reset E bit
wim 26:bd897a001012 2552 }
wim 22:35742ec80c24 2553 }
wim 22:35742ec80c24 2554 else {
wim 26:bd897a001012 2555 if (value) {
wim 22:35742ec80c24 2556 _lcd_bus |= D_LCD_E2; // Set E2 bit
wim 26:bd897a001012 2557 }
wim 26:bd897a001012 2558 else {
wim 22:35742ec80c24 2559 _lcd_bus &= ~D_LCD_E2; // Reset E2 bit
wim 26:bd897a001012 2560 }
wim 22:35742ec80c24 2561 }
wim 21:9eb628d9e164 2562
wim 22:35742ec80c24 2563 // write the new data to the SPI portexpander
wim 22:35742ec80c24 2564 _setCS(false);
wim 22:35742ec80c24 2565 _spi->write(_lcd_bus);
wim 30:033048611c01 2566 _setCS(true);
wim 21:9eb628d9e164 2567 }
wim 21:9eb628d9e164 2568
wim 21:9eb628d9e164 2569 // Set RS pin
wim 21:9eb628d9e164 2570 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 21:9eb628d9e164 2571 void TextLCD_SPI::_setRS(bool value) {
wim 21:9eb628d9e164 2572
wim 22:35742ec80c24 2573 if (value) {
wim 21:9eb628d9e164 2574 _lcd_bus |= D_LCD_RS; // Set RS bit
wim 22:35742ec80c24 2575 }
wim 22:35742ec80c24 2576 else {
wim 21:9eb628d9e164 2577 _lcd_bus &= ~D_LCD_RS; // Reset RS bit
wim 22:35742ec80c24 2578 }
wim 21:9eb628d9e164 2579
wim 21:9eb628d9e164 2580 // write the new data to the SPI portexpander
wim 21:9eb628d9e164 2581 _setCS(false);
wim 21:9eb628d9e164 2582 _spi->write(_lcd_bus);
wim 21:9eb628d9e164 2583 _setCS(true);
wim 21:9eb628d9e164 2584 }
wim 21:9eb628d9e164 2585
wim 21:9eb628d9e164 2586 // Set BL pin
wim 21:9eb628d9e164 2587 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 21:9eb628d9e164 2588 void TextLCD_SPI::_setBL(bool value) {
wim 21:9eb628d9e164 2589
wim 22:35742ec80c24 2590 if (value) {
wim 21:9eb628d9e164 2591 _lcd_bus |= D_LCD_BL; // Set BL bit
wim 22:35742ec80c24 2592 }
wim 22:35742ec80c24 2593 else {
wim 21:9eb628d9e164 2594 _lcd_bus &= ~D_LCD_BL; // Reset BL bit
wim 22:35742ec80c24 2595 }
wim 21:9eb628d9e164 2596
wim 21:9eb628d9e164 2597 // write the new data to the SPI portexpander
wim 21:9eb628d9e164 2598 _setCS(false);
wim 21:9eb628d9e164 2599 _spi->write(_lcd_bus);
wim 30:033048611c01 2600 _setCS(true);
wim 21:9eb628d9e164 2601 }
wim 21:9eb628d9e164 2602
wim 21:9eb628d9e164 2603 // Place the 4bit data on the databus
wim 21:9eb628d9e164 2604 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 21:9eb628d9e164 2605 void TextLCD_SPI::_setData(int value) {
wim 21:9eb628d9e164 2606 int data;
wim 21:9eb628d9e164 2607
wim 22:35742ec80c24 2608 // Set bit by bit to support any mapping of expander portpins to LCD pins
wim 22:35742ec80c24 2609
wim 22:35742ec80c24 2610 data = value & 0x0F;
wim 26:bd897a001012 2611 if (data & 0x01) {
wim 22:35742ec80c24 2612 _lcd_bus |= D_LCD_D4; // Set Databit
wim 26:bd897a001012 2613 }
wim 26:bd897a001012 2614 else {
wim 22:35742ec80c24 2615 _lcd_bus &= ~D_LCD_D4; // Reset Databit
wim 26:bd897a001012 2616 }
wim 26:bd897a001012 2617
wim 26:bd897a001012 2618 if (data & 0x02) {
wim 22:35742ec80c24 2619 _lcd_bus |= D_LCD_D5; // Set Databit
wim 26:bd897a001012 2620 }
wim 26:bd897a001012 2621 else {
wim 22:35742ec80c24 2622 _lcd_bus &= ~D_LCD_D5; // Reset Databit
wim 26:bd897a001012 2623 }
wim 26:bd897a001012 2624
wim 26:bd897a001012 2625 if (data & 0x04) {
wim 22:35742ec80c24 2626 _lcd_bus |= D_LCD_D6; // Set Databit
wim 26:bd897a001012 2627 }
wim 26:bd897a001012 2628 else {
wim 22:35742ec80c24 2629 _lcd_bus &= ~D_LCD_D6; // Reset Databit
wim 26:bd897a001012 2630 }
wim 26:bd897a001012 2631
wim 26:bd897a001012 2632 if (data & 0x08) {
wim 22:35742ec80c24 2633 _lcd_bus |= D_LCD_D7; // Set Databit
wim 26:bd897a001012 2634 }
wim 26:bd897a001012 2635 else {
wim 26:bd897a001012 2636 _lcd_bus &= ~D_LCD_D7; // Reset Databit
wim 26:bd897a001012 2637 }
wim 21:9eb628d9e164 2638
wim 22:35742ec80c24 2639 // write the new data to the SPI portexpander
wim 22:35742ec80c24 2640 _setCS(false);
wim 22:35742ec80c24 2641 _spi->write(_lcd_bus);
wim 30:033048611c01 2642 _setCS(true);
wim 21:9eb628d9e164 2643 }
wim 21:9eb628d9e164 2644
wim 21:9eb628d9e164 2645 // Set CS line.
wim 21:9eb628d9e164 2646 // Only used for SPI bus
wim 21:9eb628d9e164 2647 void TextLCD_SPI::_setCS(bool value) {
wim 21:9eb628d9e164 2648
wim 21:9eb628d9e164 2649 if (value) {
wim 21:9eb628d9e164 2650 _cs = 1; // Set CS pin
wim 21:9eb628d9e164 2651 }
wim 22:35742ec80c24 2652 else {
wim 21:9eb628d9e164 2653 _cs = 0; // Reset CS pin
wim 22:35742ec80c24 2654 }
wim 21:9eb628d9e164 2655 }
wim 34:e5a0dcb43ecc 2656 #endif /* SPI Expander SN74595 */
wim 23:d47f226efb24 2657 //---------- End TextLCD_SPI ------------
wim 22:35742ec80c24 2658
wim 22:35742ec80c24 2659
wim 25:6162b31128c9 2660 //--------- Start TextLCD_SPI_N ---------
wim 34:e5a0dcb43ecc 2661 #if(LCD_SPI_N == 1) /* Native SPI bus */
wim 30:033048611c01 2662 /** Create a TextLCD interface using a controller with a native SPI4 interface
Sissors 24:fb3399713710 2663 *
Sissors 24:fb3399713710 2664 * @param spi SPI Bus
Sissors 24:fb3399713710 2665 * @param cs chip select pin (active low)
wim 25:6162b31128c9 2666 * @param rs Instruction/data control line
Sissors 24:fb3399713710 2667 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 25:6162b31128c9 2668 * @param bl Backlight control line (optional, default = NC)
wim 26:bd897a001012 2669 * @param ctrl LCD controller (default = ST7032_3V3)
wim 25:6162b31128c9 2670 */
wim 25:6162b31128c9 2671 TextLCD_SPI_N::TextLCD_SPI_N(SPI *spi, PinName cs, PinName rs, LCDType type, PinName bl, LCDCtrl ctrl) :
wim 25:6162b31128c9 2672 TextLCD_Base(type, ctrl),
wim 25:6162b31128c9 2673 _spi(spi),
wim 25:6162b31128c9 2674 _cs(cs),
wim 25:6162b31128c9 2675 _rs(rs) {
Sissors 24:fb3399713710 2676
wim 32:59c4b8f648d4 2677 // Init CS
wim 32:59c4b8f648d4 2678 _cs = 1;
wim 32:59c4b8f648d4 2679
Sissors 24:fb3399713710 2680 // Setup the spi for 8 bit data, low steady state clock,
Sissors 24:fb3399713710 2681 // rising edge capture, with a 500KHz or 1MHz clock rate
Sissors 24:fb3399713710 2682 _spi->format(8,0);
Sissors 24:fb3399713710 2683 _spi->frequency(1000000);
Sissors 24:fb3399713710 2684
Sissors 24:fb3399713710 2685 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access.
Sissors 24:fb3399713710 2686 if (bl != NC) {
Sissors 24:fb3399713710 2687 _bl = new DigitalOut(bl); //Construct new pin
Sissors 24:fb3399713710 2688 _bl->write(0); //Deactivate
Sissors 24:fb3399713710 2689 }
Sissors 24:fb3399713710 2690 else {
Sissors 24:fb3399713710 2691 // No Hardware Backlight pin
Sissors 24:fb3399713710 2692 _bl = NULL; //Construct dummy pin
Sissors 24:fb3399713710 2693 }
wim 30:033048611c01 2694
wim 30:033048611c01 2695 //Sanity check
wim 30:033048611c01 2696 if (_ctrl & LCD_C_SPI4) {
wim 30:033048611c01 2697 _init();
wim 30:033048611c01 2698 }
wim 30:033048611c01 2699 else {
wim 30:033048611c01 2700 error("Error: LCD Controller type does not support native SPI4 interface\n\r");
wim 30:033048611c01 2701 }
Sissors 24:fb3399713710 2702 }
Sissors 24:fb3399713710 2703
wim 25:6162b31128c9 2704 TextLCD_SPI_N::~TextLCD_SPI_N() {
Sissors 24:fb3399713710 2705 if (_bl != NULL) {delete _bl;} // BL pin
Sissors 24:fb3399713710 2706 }
Sissors 24:fb3399713710 2707
Sissors 24:fb3399713710 2708 // Not used in this mode
wim 25:6162b31128c9 2709 void TextLCD_SPI_N::_setEnable(bool value) {
Sissors 24:fb3399713710 2710 }
Sissors 24:fb3399713710 2711
Sissors 24:fb3399713710 2712 // Set RS pin
Sissors 24:fb3399713710 2713 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 25:6162b31128c9 2714 void TextLCD_SPI_N::_setRS(bool value) {
Sissors 24:fb3399713710 2715 _rs = value;
Sissors 24:fb3399713710 2716 }
Sissors 24:fb3399713710 2717
Sissors 24:fb3399713710 2718 // Set BL pin
wim 25:6162b31128c9 2719 void TextLCD_SPI_N::_setBL(bool value) {
wim 26:bd897a001012 2720 if (_bl) {
Sissors 24:fb3399713710 2721 _bl->write(value);
wim 26:bd897a001012 2722 }
Sissors 24:fb3399713710 2723 }
Sissors 24:fb3399713710 2724
wim 29:a3663151aa65 2725 // Not used in this mode
wim 29:a3663151aa65 2726 void TextLCD_SPI_N::_setData(int value) {
wim 29:a3663151aa65 2727 }
wim 29:a3663151aa65 2728
Sissors 24:fb3399713710 2729 // Write a byte using SPI
wim 25:6162b31128c9 2730 void TextLCD_SPI_N::_writeByte(int value) {
Sissors 24:fb3399713710 2731 _cs = 0;
Sissors 24:fb3399713710 2732 wait_us(1);
Sissors 24:fb3399713710 2733 _spi->write(value);
Sissors 24:fb3399713710 2734 wait_us(1);
Sissors 24:fb3399713710 2735 _cs = 1;
Sissors 24:fb3399713710 2736 }
wim 34:e5a0dcb43ecc 2737 #endif /* Native SPI bus */
wim 25:6162b31128c9 2738 //-------- End TextLCD_SPI_N ------------
wim 21:9eb628d9e164 2739
wim 21:9eb628d9e164 2740
wim 30:033048611c01 2741 //-------- Start TextLCD_SPI_N_3_9 --------
wim 34:e5a0dcb43ecc 2742 #if(LCD_SPI_N_3_9 == 1) /* Native SPI bus */
wim 34:e5a0dcb43ecc 2743 //Code checked out on logic analyser. Not yet tested on hardware..
wim 30:033048611c01 2744
wim 30:033048611c01 2745 /** Create a TextLCD interface using a controller with a native SPI3 9 bits interface
wim 30:033048611c01 2746 *
wim 30:033048611c01 2747 * @param spi SPI Bus
wim 30:033048611c01 2748 * @param cs chip select pin (active low)
wim 30:033048611c01 2749 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 30:033048611c01 2750 * @param bl Backlight control line (optional, default = NC)
wim 30:033048611c01 2751 * @param ctrl LCD controller (default = AIP31068)
wim 30:033048611c01 2752 */
wim 30:033048611c01 2753 TextLCD_SPI_N_3_9::TextLCD_SPI_N_3_9(SPI *spi, PinName cs, LCDType type, PinName bl, LCDCtrl ctrl) :
wim 30:033048611c01 2754 TextLCD_Base(type, ctrl),
wim 30:033048611c01 2755 _spi(spi),
wim 33:900a94bc7585 2756 _cs(cs) {
wim 32:59c4b8f648d4 2757
wim 32:59c4b8f648d4 2758 // Init CS
wim 32:59c4b8f648d4 2759 _cs = 1;
wim 32:59c4b8f648d4 2760
wim 34:e5a0dcb43ecc 2761 // Setup the spi for 9 bit data, high steady state clock,
wim 30:033048611c01 2762 // rising edge capture, with a 500KHz or 1MHz clock rate
wim 32:59c4b8f648d4 2763 _spi->format(9,3);
wim 30:033048611c01 2764 _spi->frequency(1000000);
wim 30:033048611c01 2765
wim 30:033048611c01 2766 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access.
wim 30:033048611c01 2767 if (bl != NC) {
wim 30:033048611c01 2768 _bl = new DigitalOut(bl); //Construct new pin
wim 30:033048611c01 2769 _bl->write(0); //Deactivate
wim 30:033048611c01 2770 }
wim 30:033048611c01 2771 else {
wim 30:033048611c01 2772 // No Hardware Backlight pin
wim 30:033048611c01 2773 _bl = NULL; //Construct dummy pin
wim 30:033048611c01 2774 }
wim 30:033048611c01 2775
wim 30:033048611c01 2776 //Sanity check
wim 30:033048611c01 2777 if (_ctrl & LCD_C_SPI3_9) {
wim 30:033048611c01 2778 _init();
wim 30:033048611c01 2779 }
wim 30:033048611c01 2780 else {
wim 30:033048611c01 2781 error("Error: LCD Controller type does not support native SPI3 9 bits interface\n\r");
wim 30:033048611c01 2782 }
wim 30:033048611c01 2783 }
wim 30:033048611c01 2784
wim 30:033048611c01 2785 TextLCD_SPI_N_3_9::~TextLCD_SPI_N_3_9() {
wim 30:033048611c01 2786 if (_bl != NULL) {delete _bl;} // BL pin
wim 30:033048611c01 2787 }
wim 30:033048611c01 2788
wim 30:033048611c01 2789 // Not used in this mode
wim 30:033048611c01 2790 void TextLCD_SPI_N_3_9::_setEnable(bool value) {
wim 30:033048611c01 2791 }
wim 30:033048611c01 2792
wim 30:033048611c01 2793 // Set RS pin
wim 30:033048611c01 2794 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 30:033048611c01 2795 void TextLCD_SPI_N_3_9::_setRS(bool value) {
wim 30:033048611c01 2796 // The controlbits define the meaning of the next byte. This next byte can either be data or command.
wim 30:033048611c01 2797 // b8 b7...........b0
wim 30:033048611c01 2798 // RS command or data
wim 30:033048611c01 2799 //
wim 30:033048611c01 2800 // RS=1 means that next byte is data, RS=0 means that next byte is command
wim 30:033048611c01 2801 //
wim 30:033048611c01 2802
wim 30:033048611c01 2803 if (value) {
wim 30:033048611c01 2804 _controlbyte = 0x01; // Next byte is data
wim 30:033048611c01 2805 }
wim 30:033048611c01 2806 else {
wim 30:033048611c01 2807 _controlbyte = 0x00; // Next byte is command
wim 34:e5a0dcb43ecc 2808 }
wim 30:033048611c01 2809 }
wim 30:033048611c01 2810
wim 30:033048611c01 2811 // Set BL pin
wim 30:033048611c01 2812 void TextLCD_SPI_N_3_9::_setBL(bool value) {
wim 30:033048611c01 2813 if (_bl) {
wim 30:033048611c01 2814 _bl->write(value);
wim 30:033048611c01 2815 }
wim 30:033048611c01 2816 }
wim 30:033048611c01 2817
wim 30:033048611c01 2818 // Not used in this mode
wim 30:033048611c01 2819 void TextLCD_SPI_N_3_9::_setData(int value) {
wim 30:033048611c01 2820 }
wim 30:033048611c01 2821
wim 30:033048611c01 2822 // Write a byte using SPI3 9 bits mode
wim 30:033048611c01 2823 void TextLCD_SPI_N_3_9::_writeByte(int value) {
wim 30:033048611c01 2824 _cs = 0;
wim 30:033048611c01 2825 wait_us(1);
wim 30:033048611c01 2826 _spi->write( (_controlbyte << 8) | (value & 0xFF));
wim 30:033048611c01 2827 wait_us(1);
wim 30:033048611c01 2828 _cs = 1;
wim 30:033048611c01 2829 }
wim 34:e5a0dcb43ecc 2830 #endif /* Native SPI bus */
wim 30:033048611c01 2831 //------- End TextLCD_SPI_N_3_9 -----------
wim 34:e5a0dcb43ecc 2832
wim 34:e5a0dcb43ecc 2833
wim 30:033048611c01 2834 //------- Start TextLCD_SPI_N_3_10 --------
wim 34:e5a0dcb43ecc 2835 #if(LCD_SPI_N_3_10 == 1) /* Native SPI bus */
wim 30:033048611c01 2836
wim 30:033048611c01 2837 /** Create a TextLCD interface using a controller with a native SPI3 10 bits interface
wim 30:033048611c01 2838 *
wim 30:033048611c01 2839 * @param spi SPI Bus
wim 30:033048611c01 2840 * @param cs chip select pin (active low)
wim 30:033048611c01 2841 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 30:033048611c01 2842 * @param bl Backlight control line (optional, default = NC)
wim 30:033048611c01 2843 * @param ctrl LCD controller (default = AIP31068)
wim 30:033048611c01 2844 */
wim 30:033048611c01 2845 TextLCD_SPI_N_3_10::TextLCD_SPI_N_3_10(SPI *spi, PinName cs, LCDType type, PinName bl, LCDCtrl ctrl) :
wim 30:033048611c01 2846 TextLCD_Base(type, ctrl),
wim 30:033048611c01 2847 _spi(spi),
wim 30:033048611c01 2848 _cs(cs) {
wim 30:033048611c01 2849
wim 32:59c4b8f648d4 2850 // Init CS
wim 32:59c4b8f648d4 2851 _cs = 1;
wim 32:59c4b8f648d4 2852
wim 30:033048611c01 2853 // Setup the spi for 10 bit data, low steady state clock,
wim 30:033048611c01 2854 // rising edge capture, with a 500KHz or 1MHz clock rate
wim 30:033048611c01 2855 _spi->format(10,0);
wim 30:033048611c01 2856 _spi->frequency(1000000);
wim 30:033048611c01 2857
wim 30:033048611c01 2858 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access.
wim 30:033048611c01 2859 if (bl != NC) {
wim 30:033048611c01 2860 _bl = new DigitalOut(bl); //Construct new pin
wim 30:033048611c01 2861 _bl->write(0); //Deactivate
wim 30:033048611c01 2862 }
wim 30:033048611c01 2863 else {
wim 30:033048611c01 2864 // No Hardware Backlight pin
wim 30:033048611c01 2865 _bl = NULL; //Construct dummy pin
wim 30:033048611c01 2866 }
wim 30:033048611c01 2867
wim 30:033048611c01 2868 //Sanity check
wim 30:033048611c01 2869 if (_ctrl & LCD_C_SPI3_10) {
wim 30:033048611c01 2870 _init();
wim 30:033048611c01 2871 }
wim 30:033048611c01 2872 else {
wim 30:033048611c01 2873 error("Error: LCD Controller type does not support native SPI3 10 bits interface\n\r");
wim 30:033048611c01 2874 }
wim 30:033048611c01 2875 }
wim 30:033048611c01 2876
wim 30:033048611c01 2877 TextLCD_SPI_N_3_10::~TextLCD_SPI_N_3_10() {
wim 30:033048611c01 2878 if (_bl != NULL) {delete _bl;} // BL pin
wim 30:033048611c01 2879 }
wim 30:033048611c01 2880
wim 30:033048611c01 2881 // Not used in this mode
wim 30:033048611c01 2882 void TextLCD_SPI_N_3_10::_setEnable(bool value) {
wim 30:033048611c01 2883 }
wim 30:033048611c01 2884
wim 30:033048611c01 2885 // Set RS pin
wim 30:033048611c01 2886 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 30:033048611c01 2887 void TextLCD_SPI_N_3_10::_setRS(bool value) {
wim 30:033048611c01 2888 // The controlbits define the meaning of the next byte. This next byte can either be data or command.
wim 30:033048611c01 2889 // b9 b8 b7...........b0
wim 30:033048611c01 2890 // RS RW command or data
wim 30:033048611c01 2891 //
wim 30:033048611c01 2892 // RS=1 means that next byte is data, RS=0 means that next byte is command
wim 30:033048611c01 2893 // RW=0 means that next byte is writen, RW=1 means that next byte is read (not used in this lib)
wim 30:033048611c01 2894 //
wim 30:033048611c01 2895
wim 30:033048611c01 2896 if (value) {
wim 30:033048611c01 2897 _controlbyte = 0x02; // Next byte is data
wim 30:033048611c01 2898 }
wim 30:033048611c01 2899 else {
wim 30:033048611c01 2900 _controlbyte = 0x00; // Next byte is command
wim 34:e5a0dcb43ecc 2901 }
wim 30:033048611c01 2902 }
wim 30:033048611c01 2903
wim 30:033048611c01 2904 // Set BL pin
wim 30:033048611c01 2905 void TextLCD_SPI_N_3_10::_setBL(bool value) {
wim 30:033048611c01 2906 if (_bl) {
wim 30:033048611c01 2907 _bl->write(value);
wim 30:033048611c01 2908 }
wim 30:033048611c01 2909 }
wim 30:033048611c01 2910
wim 30:033048611c01 2911 // Not used in this mode
wim 30:033048611c01 2912 void TextLCD_SPI_N_3_10::_setData(int value) {
wim 30:033048611c01 2913 }
wim 30:033048611c01 2914
wim 30:033048611c01 2915 // Write a byte using SPI3 10 bits mode
wim 30:033048611c01 2916 void TextLCD_SPI_N_3_10::_writeByte(int value) {
wim 30:033048611c01 2917 _cs = 0;
wim 30:033048611c01 2918 wait_us(1);
wim 30:033048611c01 2919 _spi->write( (_controlbyte << 8) | (value & 0xFF));
wim 30:033048611c01 2920 wait_us(1);
wim 30:033048611c01 2921 _cs = 1;
wim 30:033048611c01 2922 }
wim 34:e5a0dcb43ecc 2923 #endif /* Native SPI bus */
wim 30:033048611c01 2924 //------- End TextLCD_SPI_N_3_10 ----------
wim 34:e5a0dcb43ecc 2925
wim 32:59c4b8f648d4 2926
wim 32:59c4b8f648d4 2927 //------- Start TextLCD_SPI_N_3_16 --------
wim 34:e5a0dcb43ecc 2928 #if(LCD_SPI_N_3_16 == 1) /* Native SPI bus */
wim 34:e5a0dcb43ecc 2929 //Code checked out on logic analyser. Not yet tested on hardware..
wim 32:59c4b8f648d4 2930
wim 32:59c4b8f648d4 2931 /** Create a TextLCD interface using a controller with a native SPI3 16 bits interface
wim 32:59c4b8f648d4 2932 *
wim 32:59c4b8f648d4 2933 * @param spi SPI Bus
wim 32:59c4b8f648d4 2934 * @param cs chip select pin (active low)
wim 32:59c4b8f648d4 2935 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 32:59c4b8f648d4 2936 * @param bl Backlight control line (optional, default = NC)
wim 32:59c4b8f648d4 2937 * @param ctrl LCD controller (default = PT6314)
wim 32:59c4b8f648d4 2938 */
wim 32:59c4b8f648d4 2939 TextLCD_SPI_N_3_16::TextLCD_SPI_N_3_16(SPI *spi, PinName cs, LCDType type, PinName bl, LCDCtrl ctrl) :
wim 32:59c4b8f648d4 2940 TextLCD_Base(type, ctrl),
wim 32:59c4b8f648d4 2941 _spi(spi),
wim 32:59c4b8f648d4 2942 _cs(cs) {
wim 32:59c4b8f648d4 2943
wim 32:59c4b8f648d4 2944 // Init CS
wim 32:59c4b8f648d4 2945 _cs = 1;
wim 32:59c4b8f648d4 2946
wim 32:59c4b8f648d4 2947 // Setup the spi for 8 bit data, low steady state clock,
wim 32:59c4b8f648d4 2948 // rising edge capture, with a 500KHz or 1MHz clock rate
wim 32:59c4b8f648d4 2949 _spi->format(8,0);
wim 32:59c4b8f648d4 2950 _spi->frequency(1000000);
wim 32:59c4b8f648d4 2951
wim 32:59c4b8f648d4 2952 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access.
wim 32:59c4b8f648d4 2953 if (bl != NC) {
wim 32:59c4b8f648d4 2954 _bl = new DigitalOut(bl); //Construct new pin
wim 32:59c4b8f648d4 2955 _bl->write(0); //Deactivate
wim 32:59c4b8f648d4 2956 }
wim 32:59c4b8f648d4 2957 else {
wim 32:59c4b8f648d4 2958 // No Hardware Backlight pin
wim 32:59c4b8f648d4 2959 _bl = NULL; //Construct dummy pin
wim 32:59c4b8f648d4 2960 }
wim 32:59c4b8f648d4 2961
wim 32:59c4b8f648d4 2962 //Sanity check
wim 32:59c4b8f648d4 2963 if (_ctrl & LCD_C_SPI3_16) {
wim 32:59c4b8f648d4 2964 _init();
wim 32:59c4b8f648d4 2965 }
wim 32:59c4b8f648d4 2966 else {
wim 32:59c4b8f648d4 2967 error("Error: LCD Controller type does not support native SPI3 16 bits interface\n\r");
wim 32:59c4b8f648d4 2968 }
wim 32:59c4b8f648d4 2969 }
wim 32:59c4b8f648d4 2970
wim 32:59c4b8f648d4 2971 TextLCD_SPI_N_3_16::~TextLCD_SPI_N_3_16() {
wim 32:59c4b8f648d4 2972 if (_bl != NULL) {delete _bl;} // BL pin
wim 32:59c4b8f648d4 2973 }
wim 32:59c4b8f648d4 2974
wim 32:59c4b8f648d4 2975 // Not used in this mode
wim 32:59c4b8f648d4 2976 void TextLCD_SPI_N_3_16::_setEnable(bool value) {
wim 32:59c4b8f648d4 2977 }
wim 32:59c4b8f648d4 2978
wim 32:59c4b8f648d4 2979 // Set RS pin
wim 32:59c4b8f648d4 2980 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 32:59c4b8f648d4 2981 void TextLCD_SPI_N_3_16::_setRS(bool value) {
wim 32:59c4b8f648d4 2982 // 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.
wim 32:59c4b8f648d4 2983 // The 8 actual bits represent either a data or a command byte.
wim 32:59c4b8f648d4 2984 // b15 b14 b13 b12 b11 b10 b9 b8 - b7 b6 b5 b4 b3 b2 b1 b0
wim 32:59c4b8f648d4 2985 // 1 1 1 1 1 RW RS 0 d7 d6 d5 d4 d3 d2 d1 d0
wim 32:59c4b8f648d4 2986 //
wim 32:59c4b8f648d4 2987 // RS=1 means that next byte is data, RS=0 means that next byte is command
wim 32:59c4b8f648d4 2988 // RW=0 means that next byte is writen, RW=1 means that next byte is read (not used in this lib)
wim 32:59c4b8f648d4 2989 //
wim 32:59c4b8f648d4 2990
wim 32:59c4b8f648d4 2991 if (value) {
wim 32:59c4b8f648d4 2992 _controlbyte = 0xFA; // Next byte is data
wim 32:59c4b8f648d4 2993 }
wim 32:59c4b8f648d4 2994 else {
wim 32:59c4b8f648d4 2995 _controlbyte = 0xF8; // Next byte is command
wim 32:59c4b8f648d4 2996 }
wim 32:59c4b8f648d4 2997 }
wim 32:59c4b8f648d4 2998
wim 32:59c4b8f648d4 2999 // Set BL pin
wim 32:59c4b8f648d4 3000 void TextLCD_SPI_N_3_16::_setBL(bool value) {
wim 32:59c4b8f648d4 3001 if (_bl) {
wim 32:59c4b8f648d4 3002 _bl->write(value);
wim 32:59c4b8f648d4 3003 }
wim 32:59c4b8f648d4 3004 }
wim 32:59c4b8f648d4 3005
wim 32:59c4b8f648d4 3006 // Not used in this mode
wim 32:59c4b8f648d4 3007 void TextLCD_SPI_N_3_16::_setData(int value) {
wim 32:59c4b8f648d4 3008 }
wim 34:e5a0dcb43ecc 3009
wim 32:59c4b8f648d4 3010 // Write a byte using SPI3 16 bits mode
wim 32:59c4b8f648d4 3011 void TextLCD_SPI_N_3_16::_writeByte(int value) {
wim 32:59c4b8f648d4 3012 _cs = 0;
wim 32:59c4b8f648d4 3013 wait_us(1);
wim 32:59c4b8f648d4 3014
wim 32:59c4b8f648d4 3015 _spi->write(_controlbyte);
wim 32:59c4b8f648d4 3016
wim 32:59c4b8f648d4 3017 _spi->write(value);
wim 32:59c4b8f648d4 3018
wim 32:59c4b8f648d4 3019 wait_us(1);
wim 32:59c4b8f648d4 3020 _cs = 1;
wim 32:59c4b8f648d4 3021 }
wim 34:e5a0dcb43ecc 3022 #endif /* Native SPI bus */
wim 32:59c4b8f648d4 3023 //------- End TextLCD_SPI_N_3_16 ----------
wim 34:e5a0dcb43ecc 3024
wim 34:e5a0dcb43ecc 3025
wim 32:59c4b8f648d4 3026 //------- Start TextLCD_SPI_N_3_24 --------
wim 34:e5a0dcb43ecc 3027 #if(LCD_SPI_N_3_24 == 1) /* Native SPI bus */
wim 32:59c4b8f648d4 3028
wim 32:59c4b8f648d4 3029 /** Create a TextLCD interface using a controller with a native SPI3 24 bits interface
wim 32:59c4b8f648d4 3030 *
wim 32:59c4b8f648d4 3031 * @param spi SPI Bus
wim 32:59c4b8f648d4 3032 * @param cs chip select pin (active low)
wim 32:59c4b8f648d4 3033 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 32:59c4b8f648d4 3034 * @param bl Backlight control line (optional, default = NC)
wim 32:59c4b8f648d4 3035 * @param ctrl LCD controller (default = SSD1803)
wim 32:59c4b8f648d4 3036 */
wim 32:59c4b8f648d4 3037 TextLCD_SPI_N_3_24::TextLCD_SPI_N_3_24(SPI *spi, PinName cs, LCDType type, PinName bl, LCDCtrl ctrl) :
wim 32:59c4b8f648d4 3038 TextLCD_Base(type, ctrl),
wim 32:59c4b8f648d4 3039 _spi(spi),
wim 32:59c4b8f648d4 3040 _cs(cs) {
wim 32:59c4b8f648d4 3041
wim 32:59c4b8f648d4 3042 // Init CS
wim 32:59c4b8f648d4 3043 _cs = 1;
wim 32:59c4b8f648d4 3044
wim 34:e5a0dcb43ecc 3045 // Setup the spi for 8 bit data, high steady state clock,
wim 32:59c4b8f648d4 3046 // rising edge capture, with a 500KHz or 1MHz clock rate
wim 34:e5a0dcb43ecc 3047 _spi->format(8,3);
wim 32:59c4b8f648d4 3048 _spi->frequency(1000000);
wim 32:59c4b8f648d4 3049
wim 32:59c4b8f648d4 3050 // The hardware Backlight pin is optional. Test and make sure whether it exists or not to prevent illegal access.
wim 32:59c4b8f648d4 3051 if (bl != NC) {
wim 32:59c4b8f648d4 3052 _bl = new DigitalOut(bl); //Construct new pin
wim 32:59c4b8f648d4 3053 _bl->write(0); //Deactivate
wim 32:59c4b8f648d4 3054 }
wim 32:59c4b8f648d4 3055 else {
wim 32:59c4b8f648d4 3056 // No Hardware Backlight pin
wim 32:59c4b8f648d4 3057 _bl = NULL; //Construct dummy pin
wim 32:59c4b8f648d4 3058 }
wim 32:59c4b8f648d4 3059
wim 32:59c4b8f648d4 3060 //Sanity check
wim 32:59c4b8f648d4 3061 if (_ctrl & LCD_C_SPI3_24) {
wim 32:59c4b8f648d4 3062 _init();
wim 32:59c4b8f648d4 3063 }
wim 32:59c4b8f648d4 3064 else {
wim 32:59c4b8f648d4 3065 error("Error: LCD Controller type does not support native SPI3 24 bits interface\n\r");
wim 32:59c4b8f648d4 3066 }
wim 32:59c4b8f648d4 3067 }
wim 32:59c4b8f648d4 3068
wim 32:59c4b8f648d4 3069 TextLCD_SPI_N_3_24::~TextLCD_SPI_N_3_24() {
wim 32:59c4b8f648d4 3070 if (_bl != NULL) {delete _bl;} // BL pin
wim 32:59c4b8f648d4 3071 }
wim 32:59c4b8f648d4 3072
wim 32:59c4b8f648d4 3073 // Not used in this mode
wim 32:59c4b8f648d4 3074 void TextLCD_SPI_N_3_24::_setEnable(bool value) {
wim 32:59c4b8f648d4 3075 }
wim 32:59c4b8f648d4 3076
wim 32:59c4b8f648d4 3077 // Set RS pin
wim 32:59c4b8f648d4 3078 // Used for mbed pins, I2C bus expander or SPI shiftregister
wim 32:59c4b8f648d4 3079 void TextLCD_SPI_N_3_24::_setRS(bool value) {
wim 32:59c4b8f648d4 3080 // 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.
wim 32:59c4b8f648d4 3081 // Each byte encodes 4 actual bits. The 8 actual bits represent either a data or a command byte.
wim 32:59c4b8f648d4 3082 // b23 b22 b21 b20 b19 b18 b17 b16 - b15 b14 b13 b12 b11 b10 b9 b8 - b7 b6 b5 b4 b3 b2 b1 b0
wim 32:59c4b8f648d4 3083 // 1 1 1 1 1 RW RS 0 d0 d1 d2 d3 0 0 0 0 d4 d5 d6 d7 0 0 0 0
wim 32:59c4b8f648d4 3084 //
wim 32:59c4b8f648d4 3085 // RS=1 means that next byte is data, RS=0 means that next byte is command
wim 32:59c4b8f648d4 3086 // RW=0 means that next byte is writen, RW=1 means that next byte is read (not used in this lib)
wim 32:59c4b8f648d4 3087 //
wim 32:59c4b8f648d4 3088 // Note: SPI3_24 expects LSB first. This is inconsistent with regular SPI convention (and hardware) that sends MSB first.
wim 32:59c4b8f648d4 3089
wim 32:59c4b8f648d4 3090 if (value) {
wim 32:59c4b8f648d4 3091 _controlbyte = 0xFA; // Next byte is data
wim 32:59c4b8f648d4 3092 }
wim 32:59c4b8f648d4 3093 else {
wim 32:59c4b8f648d4 3094 _controlbyte = 0xF8; // Next byte is command
wim 34:e5a0dcb43ecc 3095 }
wim 32:59c4b8f648d4 3096 }
wim 32:59c4b8f648d4 3097
wim 32:59c4b8f648d4 3098 // Set BL pin
wim 32:59c4b8f648d4 3099 void TextLCD_SPI_N_3_24::_setBL(bool value) {
wim 32:59c4b8f648d4 3100 if (_bl) {
wim 32:59c4b8f648d4 3101 _bl->write(value);
wim 32:59c4b8f648d4 3102 }
wim 32:59c4b8f648d4 3103 }
wim 32:59c4b8f648d4 3104
wim 32:59c4b8f648d4 3105 // Not used in this mode
wim 32:59c4b8f648d4 3106 void TextLCD_SPI_N_3_24::_setData(int value) {
wim 32:59c4b8f648d4 3107 }
wim 32:59c4b8f648d4 3108
wim 32:59c4b8f648d4 3109 //Mapping table to flip the bits around cause SPI3_24 expects LSB first.
wim 32:59c4b8f648d4 3110 const uint8_t map3_24[16] = {0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0};
wim 32:59c4b8f648d4 3111
wim 32:59c4b8f648d4 3112 // Write a byte using SPI3 24 bits mode
wim 32:59c4b8f648d4 3113 void TextLCD_SPI_N_3_24::_writeByte(int value) {
wim 32:59c4b8f648d4 3114 _cs = 0;
wim 32:59c4b8f648d4 3115 wait_us(1);
wim 32:59c4b8f648d4 3116 _spi->write(_controlbyte);
wim 32:59c4b8f648d4 3117
wim 32:59c4b8f648d4 3118 //Map and send the LSB nibble
wim 32:59c4b8f648d4 3119 _spi->write( map3_24[value & 0x0F]);
wim 32:59c4b8f648d4 3120
wim 32:59c4b8f648d4 3121 //Map and send the MSB nibble
wim 32:59c4b8f648d4 3122 _spi->write( map3_24[(value >> 4) & 0x0F]);
wim 32:59c4b8f648d4 3123
wim 32:59c4b8f648d4 3124 wait_us(1);
wim 32:59c4b8f648d4 3125 _cs = 1;
wim 32:59c4b8f648d4 3126 }
wim 34:e5a0dcb43ecc 3127 #endif /* Native SPI bus */
wim 32:59c4b8f648d4 3128 //------- End TextLCD_SPI_N_3_24 ----------