Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: TextLCD.cpp
- Revision:
- 39:e9c2319de9c5
- Parent:
- 38:cbe275b0b647
- Child:
- 40:d3496c3ea301
--- a/TextLCD.cpp Sat Apr 18 11:33:02 2015 +0000
+++ b/TextLCD.cpp Tue May 19 18:13:00 2015 +0000
@@ -20,6 +20,8 @@
* 2015, v17: WH, Clean up low-level _writeCommand() and _writeData(), Added support for alternative fonttables (eg PCF21XX), Added ST7066_ACM controller for ACM1602 module
* 2015, v18: WH, Performance improvement I2C portexpander
* 2015, v19: WH, Fixed Adafruit I2C/SPI portexpander pinmappings, fixed SYDZ Backlight
+ * 2015, v20: WH, Fixed occasional Init fail caused by insufficient wait time after ReturnHome command (0x02), Added defines to reduce memory footprint (eg LCD_ICON),
+ * Fixed and Added more fonttable support for PCF2119K, Added HD66712 controller.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -62,7 +64,7 @@
_addr_mode = _type & LCD_T_ADR_MSK;
// Font table, encoded in LCDCtrl
- _font = _type & LCD_C_FNT_MSK;
+ _font = _ctrl & LCD_C_FNT_MSK;
}
/** Init the LCD Controller(s)
@@ -138,6 +140,7 @@
else {
// Reset in 8 bit mode, final Function set will follow
_writeCommand(0x30); // Function set 0 0 1 DL=1 N F x x
+ wait_ms(1); // most instructions take 40us
}
// Device specific initialisations: DC/DC converter to generate VLCD or VLED, number of lines etc
@@ -601,6 +604,8 @@
// NW=1 3-Line LCD (N=0)
break;
+// case LCD10x2D: // Special mode for SSD1803, 4-line mode but switch to double height font
+ case LCD10x4D: // Special mode for SSD1803
case LCD20x4D: // Special mode for SSD1803
_function = 0x08; // Set function 0 0 1 DL N DH RE(0) IS
// Saved to allow switch between Instruction sets at later time
@@ -874,6 +879,7 @@
break; // case PCF2116_5V Controller
case PCF2119_3V3:
+ case PCF2119R_3V3:
// PCF2119 controller: Initialise Voltage booster for VLCD. VDD=3V3. VA and VB control contrast.
// Note1: See datasheet, the PCF2119 supports icons and provides separate constrast control for Icons and characters.
// Note2: Vgen is switched off when the contrast voltage VA or VB is set to 0x00.
@@ -912,7 +918,11 @@
// Init special features
_writeCommand(0x20 | _function | 0x01); // Set function, Select Instruction Set = 1
- _writeCommand(0x04); // DISP CONF SET (Instr. Set 1) 0000, 0, 1, P=0, Q=0
+// _writeCommand(0x04); // DISP CONF SET (Instr. Set 1) 0000, 0, 1, P=0, Q=0 (IC at Bottom)
+// _writeCommand(0x05); // Display Conf Set 0000, 0, 1, P=0, Q=1
+// _writeCommand(0x06); // Display Conf Set 0000, 0, 1, P=1, Q=0
+ _writeCommand(0x07); // Display Conf Set 0000, 0, 1, P=1, Q=1 (IC at Top)
+
_writeCommand(0x10); // TEMP CTRL SET (Instr. Set 1) 0001, 0, 0, TC1=0, TC2=0
// _writeCommand(0x42); // HV GEN (Instr. Set 1) 0100, 0, 0, S1=1, S2=0 (2x multiplier)
_writeCommand(0x40 | (LCD_PCF2_S12 & 0x03)); // HV GEN (Instr. Set 1) 0100, 0, 0, S1=1, S2=0 (2x multiplier)
@@ -1204,6 +1214,115 @@
_contrast = LCD_PT63_CONTRAST;
_writeCommand(0x20 | _function | ((~_contrast) >> 4)); // Invert and shift to use 2 MSBs
break; // case PT6314 Controller (VFD)
+
+
+ case HD66712:
+ // Initialise Display configuration
+ switch (_type) {
+ case LCD8x1: //8x1 is a regular 1 line display
+ case LCD12x1:
+ case LCD16x1:
+ case LCD20x1:
+ case LCD24x1:
+// case LCD32x1: // EXT pin is High, extension driver needed
+ _function = 0x02; // Function set 001 DL N RE(0) DH REV (Std Regs)
+ // DL=0 (4 bits bus)
+ // N=0 (1-line mode, N=1 2-line mode)
+ // RE=0 (Dis. Extended Regs, special mode for KS0073)
+ // DH=1 (Disp shift enable, special mode for KS0073)
+ // REV=0 (Reverse normal, special mode for KS0073)
+
+ _function_1 = 0x04; // Function set 001 DL N RE(1) BE LP (Ext Regs)
+ // DL=0 (4 bits bus)
+ // N=0 (1-line mode, N=1 2-line mode)
+ // RE=1 (Ena Extended Regs, special mode for KS0073)
+ // BE=0 (Blink Enable, CG/SEG RAM, special mode for KS0073)
+ // LP=0 (LP=1 Low power mode, LP=0 Normal)
+
+ _function_x = 0x00; // Ext Function set 0000 1 FW BW NW (Ext Regs)
+ // NW=0 (1,2 line), NW=1 (4 Line, special mode for KS0073)
+ break;
+
+// case LCD12x3D: // Special mode for KS0073, KS0078 and PCF21XX
+// case LCD12x3D1: // Special mode for KS0073, KS0078 and PCF21XX
+ case LCD12x4D: // Special mode for KS0073, KS0078, PCF21XX and HD66712
+// case LCD16x3D: // Special mode for KS0073, KS0078
+// case LCD16x4D: // Special mode for KS0073, KS0078
+ case LCD20x4D: // Special mode for KS0073, KS0078 and HD66712
+ _function = 0x02; // Function set 001 DL N RE(0) DH REV (Std Regs)
+ // DL=0 (4 bits bus)
+ // N=0 (dont care for 4 line mode)
+ // RE=0 (Dis. Extended Regs, special mode for KS0073)
+ // DH=1 (Disp shift enable, special mode for KS0073)
+ // REV=0 (Reverse normal, special mode for KS0073)
+
+ _function_1 = 0x04; // Function set 001 DL N RE(1) BE LP (Ext Regs)
+ // DL=0 (4 bits bus)
+ // N=0 (1-line mode), N=1 (2-line mode)
+ // RE=1 (Ena Extended Regs, special mode for KS0073)
+ // BE=0 (Blink Enable, CG/SEG RAM, special mode for KS0073)
+ // LP=0 (LP=1 Low power mode, LP=0 Normal)
+
+ _function_x = 0x01; // Ext Function set 0000 1 FW BW NW (Ext Regs)
+ // NW=0 (1,2 line), NW=1 (4 Line, special mode for KS0073)
+ break;
+
+
+ case LCD16x3G: // Special mode for ST7036
+// case LCD24x3D: // Special mode for KS0078
+// case LCD24x3D1: // Special mode for KS0078
+ case LCD24x4D: // Special mode for KS0078
+ error("Error: LCD Controller type does not support this Display type\n\r");
+ break;
+
+ default:
+ // All other LCD types are initialised as 2 Line displays (including LCD16x1C and LCD40x4)
+ _function = 0x0A; // Function set 001 DL N RE(0) DH REV (Std Regs)
+ // DL=0 (4 bits bus)
+ // N=1 (2-line mode), N=0 (1-line mode)
+ // RE=0 (Dis. Extended Regs, special mode for KS0073)
+ // DH=1 (Disp shift enable, special mode for KS0073)
+ // REV=0 (Reverse normal, special mode for KS0073)
+
+ _function_1 = 0x0C; // Function set 001 DL N RE(1) BE LP (Ext Regs)
+ // DL=0 (4 bits bus)
+ // N=1 (2 line mode), N=0 (1-line mode)
+ // RE=1 (Ena Extended Regs, special mode for KS0073)
+ // BE=0 (Blink Enable, CG/SEG RAM, special mode for KS0073)
+ // LP=0 (LP=1 Low power mode, LP=0 Normal)
+
+ _function_x = 0x00; // Ext Function set 0000 1 FW BW NW (Ext Regs)
+ // NW=0 (1,2 line), NW=1 (4 Line, special mode for KS0073)
+ break;
+ } // switch type
+
+ // init special features
+ _writeCommand(0x20 | _function_1);// Function set 001 DL N RE(1) BE LP (Ext Regs)
+ // DL=0 (4 bits bus), DL=1 (8 bits mode)
+ // N=0 (1 line mode), N=1 (2 line mode)
+ // RE=1 (Ena Extended Regs, special mode for KS0073)
+ // BE=0 (Blink Enable/Disable, CG/SEG RAM, special mode for KS0073)
+ // LP=0 (LP=1 Low power mode, LP=0 Normal)
+
+ _writeCommand(0x08 | _function_x); // Ext Function set 0000 1 FW BW NW (Ext Regs)
+ // FW=0 (5-dot font, special mode for KS0073)
+ // BW=0 (Cur BW invert disable, special mode for KS0073)
+ // NW=0 (1,2 Line), NW=1 (4 line, special mode for KS0073)
+
+ _writeCommand(0x10); // Scroll/Shift set 0001 DS/HS4 DS/HS3 DS/HS2 DS/HS1 (Ext Regs)
+ // Dotscroll/Display shift enable (Special mode for KS0073)
+
+ _writeCommand(0x80); // Scroll Quantity set 1 0 SQ5 SQ4 SQ3 SQ2 SQ1 SQ0 (Ext Regs)
+ // Scroll quantity (Special mode for KS0073)
+
+ _writeCommand(0x20 | _function); // Function set 001 DL N RE(0) DH REV (Std Regs)
+ // DL=0 (4 bits bus), DL=1 (8 bits mode)
+ // N=0 (1 line mode), N=1 (2 line mode)
+ // RE=0 (Dis. Extended Regs, special mode for KS0073)
+ // DH=1 (Disp shift enable/disable, special mode for KS0073)
+ // REV=0 (Reverse/Normal, special mode for KS0073)
+ break; // case HD66712 Controller
+
case ST7066_ACM: // ST7066 4/8 bit, I2C on ACM1602 using a PIC
default:
@@ -1252,12 +1371,13 @@
} // switch Controller specific initialisations
// Controller general initialisations
-// _writeCommand(0x01); // cls, and set cursor to 0
+// _writeCommand(0x01); // Clear Display and set cursor to 0
// wait_ms(10); // The CLS command takes 1.64 ms.
// // Since we are not using the Busy flag, Lets be safe and take 10 ms
- _writeCommand(0x02); // Return Home
- // Cursor Home, DDRAM Address to Origin
+ _writeCommand(0x02); // Cursor Home, DDRAM Address to Origin
+ wait_ms(10); // The Return Home command takes 1.64 ms.
+ // Since we are not using the Busy flag, Lets be safe and take 10 ms
_writeCommand(0x06); // Entry Mode 0000 0 1 I/D S
// Cursor Direction and Display Shift
@@ -1272,12 +1392,15 @@
// _writeCommand(0x0C); // Display Ctrl 0000 1 D C B
// // Display On, Cursor Off, Blink Off
- setCursor(CurOff_BlkOff);
+// setCursor(CurOff_BlkOff);
+ setCursor(CurOn_BlkOff);
setMode(DispOn);
}
/** Clear the screen, Cursor home.
+ * Note: The whole display is initialised to charcode 0x20, which may not be a 'space' on some controllers with a
+ * different fontset such as the PCF2116C or PCF2119R. In this case you should fill the display with 'spaces'.
*/
void TextLCD_Base::cls() {
@@ -1290,7 +1413,7 @@
// Second LCD controller Clearscreen
_writeCommand(0x01); // cls, and set cursor to 0
- wait_ms(10); // The CLS command takes 1.64 ms.
+ wait_ms(20); // The CLS command takes 1.64 ms.
// Since we are not using the Busy flag, Lets be safe and take 10 ms
_ctrl_idx=_LCDCtrl_0; // Select primary controller
@@ -1298,7 +1421,7 @@
// Primary LCD controller Clearscreen
_writeCommand(0x01); // cls, and set cursor to 0
- wait_ms(10); // The CLS command takes 1.64 ms.
+ wait_ms(20); // The CLS command takes 1.64 ms.
// Since we are not using the Busy flag, Lets be safe and take 10 ms
// Restore cursormode on primary LCD controller when needed
@@ -1383,10 +1506,11 @@
if (_font == LCD_C_FT0) return c;
//LCD_C_FT1 for PCF21XXC series
-//Used code from Suga koubou library for PCF2119
+//LCD_C_FT2 for PCF21XXR series
+//Used code from Suga koubou library for PCF2119K and PCF2119R
if (((c >= ' ') && (c <= '?')) || ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'))) {
c |= 0x80;
- } else if (c >= 0xf0 && c <= 0xff) {
+ } else if (c >= 0xF0 && c <= 0xFF) {
c &= 0x0f;
}
return c;
@@ -1510,8 +1634,8 @@
case 3:
return 0x40 + _nr_cols + column;
// Should never get here.
- default:
- return 0x00;
+// default:
+// return 0x00;
}
case LCD_T_B:
@@ -1557,8 +1681,8 @@
case 3:
return 0x60 + column;
// Should never get here.
- default:
- return 0x00;
+// default:
+// return 0x00;
}
case LCD_T_D1:
@@ -1573,8 +1697,8 @@
case 2:
return 0x60 + column;
// Should never get here.
- default:
- return 0x00;
+// default:
+// return 0x00;
}
case LCD_T_E:
@@ -1627,8 +1751,8 @@
else
return (0x40 + _nr_cols + (column - (_nr_cols >> 1)));
// Should never get here.
- default:
- return 0x00;
+// default:
+// return 0x00;
}
case LCD_T_G:
@@ -1641,8 +1765,8 @@
case 2:
return 0x20 + column;
// Should never get here.
- default:
- return 0x00;
+// default:
+// return 0x00;
}
// Should never get here.
@@ -1880,6 +2004,7 @@
_writeCommand(0x80 | addr);
}
+#if(LCD_BLINK == 1)
/** Set UDC Blink and Icon blink
* setUDCBlink method is supported by some compatible devices (eg SSD1803)
*
@@ -1932,6 +2057,7 @@
case PCF2103_3V3 :
case PCF2113_3V3 :
case PCF2119_3V3 :
+ case PCF2119R_3V3 :
// Enable Icon Blink
_writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1
_writeCommand(0x08 | 0x02); // ICON Conf 0000 1, IM=0 (Char mode), IB=1 (Icon blink), 0 (Instr. Set 1)
@@ -1968,8 +2094,9 @@
break; // case SSD1803, US2066
case PCF2103_3V3 :
- case PCF2113_3V3 :
- case PCF2119_3V3 :
+ case PCF2113_3V3 :
+ case PCF2119_3V3 :
+ case PCF2119R_3V3 :
// Disable Icon Blink
_writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1
_writeCommand(0x08); // ICON Conf 0000 1, IM=0 (Char mode), IB=1 (Icon blink), 0 (Instr. Set 1)
@@ -1989,7 +2116,7 @@
} // blinkMode
} // setUDCBlink()
-
+#endif
/** Set Contrast
* setContrast method is supported by some compatible devices (eg ST7032i) that have onboard LCD voltage generation
@@ -2008,7 +2135,8 @@
switch (_ctrl) {
case PCF2113_3V3 :
- case PCF2119_3V3 :
+ case PCF2119_3V3 :
+ case PCF2119R_3V3 :
if (_contrast < 5) _contrast = 0; // See datasheet. Sanity check for PCF2113/PCF2119
if (_contrast > 55) _contrast = 55;
@@ -2060,7 +2188,7 @@
} // end switch
} // end setContrast()
-
+#if(LCD_POWER == 1)
/** Set Power
* setPower method is supported by some compatible devices (eg SSD1803) that have power down modes
*
@@ -2078,7 +2206,8 @@
switch (_ctrl) {
// case PCF2113_3V3 :
-// case PCF2119_3V3 :
+// case PCF2119_3V3 :
+// case PCF2119R_3V3 :
// case ST7032_3V3 :
//@todo
// enable Booster Bon
@@ -2110,7 +2239,8 @@
switch (_ctrl) {
// case PCF2113_3V3 :
-// case PCF2119_3V3 :
+// case PCF2119_3V3 :
+// case PCF2119R_3V3 :
// case ST7032_3V3 :
//@todo
// disable Booster Bon
@@ -2134,8 +2264,9 @@
} // end switch
}
} // end setPower()
-
-
+#endif
+
+#if(LCD_ORIENT == 1)
/** Set Orient
* setOrient method is supported by some compatible devices (eg SSD1803, US2066) that have top/bottom view modes
*
@@ -2151,11 +2282,17 @@
case PCF2103_3V3:
case PCF2116_3V3:
case PCF2116_5V:
- case PCF2119_3V3:
_writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1
_writeCommand(0x05); // Display Conf Set 0000 0, 1, P=0, Q=1 (Instr. Set 1)
_writeCommand(0x20 | _function); // Set function, Select Instr Set = 0
break;
+
+ case PCF2119_3V3:
+ case PCF2119R_3V3:
+ _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1
+ _writeCommand(0x07); // Display Conf Set 0000 0, 1, P=1, Q=1 (Instr. Set 1)
+ _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0
+ break;
case SSD1803_3V3 :
// case SSD1803_5V :
@@ -2193,11 +2330,17 @@
case PCF2103_3V3:
case PCF2116_3V3:
case PCF2116_5V:
- case PCF2119_3V3:
_writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1
_writeCommand(0x06); // Display Conf Set 0000 0, 1, P=1, Q=0 (Instr. Set 1)
_writeCommand(0x20 | _function); // Set function, Select Instr Set = 0
break;
+
+ case PCF2119_3V3:
+ case PCF2119R_3V3 :
+ _writeCommand(0x20 | _function | 0x01); // Set function, Select Instr Set = 1
+ _writeCommand(0x04); // Display Conf Set 0000 0, 1, P=0, Q=0 (Instr. Set 1)
+ _writeCommand(0x20 | _function); // Set function, Select Instr Set = 0
+ break;
case SSD1803_3V3 :
// case SSD1803_5V :
@@ -2237,7 +2380,9 @@
break; // end Bottom
} // end switch orient
} // end setOrient()
-
+#endif
+
+#if(LCD_BIGFONT == 1)
/** Set Big Font
* setBigFont method is supported by some compatible devices (eg SSD1803, US2066)
*
@@ -2353,8 +2498,9 @@
} // end switch lines
} // end setBigFont()
-
-
+#endif
+
+#if(LCD_ICON==1)
/** Set Icons
*
* @param unsigned char idx The Index of the icon pattern (0..15) for KS0073 and similar controllers
@@ -2433,7 +2579,8 @@
case PCF2103_3V3:
case PCF2113_3V3:
- case PCF2119_3V3:
+ case PCF2119_3V3:
+ case PCF2119R_3V3:
// Store UDC/Icon pattern for PCF2103 and PCF2113:
// 3 x 8 rows x 5 bits = 120 bits for Normal pattern (UDC 0..2) and
// 3 x 8 rows x 5 bits = 120 bits for Blink pattern (UDC 4..6)
@@ -2554,7 +2701,8 @@
}
break; // case PCF2103_3V3 Controller
- case PCF2119_3V3:
+ case PCF2119_3V3:
+ case PCF2119R_3V3:
// PCF2119 uses part of the UDC RAM to control Icons
// Select CG RAM
@@ -2582,8 +2730,9 @@
int addr = getAddress(_column, _row);
_writeCommand(0x80 | addr);
} //end clrIcon()
-
-
+#endif
+
+#if(LCD_INVERT == 1)
/** Set Invert
* setInvert method is supported by some compatible devices (eg KS0073) to swap between black and white
*
@@ -2641,6 +2790,7 @@
} // end switch
}
} // end setInvert()
+#endif
//--------- End TextLCD_Base -----------
@@ -2936,8 +3086,9 @@
// Set bit by bit to support any mapping of expander portpins to LCD pins
_lcd_bus |= _LCD_DATA_BITS[value & 0x0F];
}
-
-#else
+#endif
+
+#if(0)
//orig v017
// Test faster _writeByte 0.11s vs 0.27s for a 20x4 fillscreen (PCF8574)
// Place the 4bit data in the databus shadowvalue
@@ -2975,6 +3126,34 @@
}
#endif
+#if(1)
+//orig v017, with optimised codesize
+// Test faster _writeByte 0.11s vs 0.27s for a 20x4 fillscreen (PCF8574)
+// Place the 4bit data in the databus shadowvalue
+// Used for mbed I2C bus expander
+void TextLCD_I2C::_setDataBits(int value) {
+
+ //Clear all databits
+ _lcd_bus &= ~LCD_BUS_I2C_MSK;
+
+ // Set bit by bit to support any mapping of expander portpins to LCD pins
+ if (value & 0x01){
+ _lcd_bus |= LCD_BUS_I2C_D4; // Set Databit
+ }
+
+ if (value & 0x02){
+ _lcd_bus |= LCD_BUS_I2C_D5; // Set Databit
+ }
+
+ if (value & 0x04) {
+ _lcd_bus |= LCD_BUS_I2C_D6; // Set Databit
+ }
+
+ if (value & 0x08) {
+ _lcd_bus |= LCD_BUS_I2C_D7; // Set Databit
+ }
+}
+#endif
// Place the 4bit data on the databus
// Used for mbed pins, I2C bus expander or SPI shifregister