diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 2cc80dd30c..492a32361b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -336,44 +336,39 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th #define NEWPANEL #endif -// I2C PANELS +//I2C PANELS //#define LCD_I2C_SAINSMART_YWROBOT #ifdef LCD_I2C_SAINSMART_YWROBOT // This uses the LiquidCrystal_I2C library ( https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home ) // Make sure it is placed in the Arduino libraries directory. #define LCD_I2C_TYPE_PCF8575 - #define LCD_I2C - #define ULTIPANEL - #define NEWPANEL #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander + #define NEWPANEL + #define ULTIPANEL #endif -// PANELOLU2 LCD with status LEDs, separate encoder and click inputs +//PANELOLU2 LCD with status LEDs, separate encoder and click inputs //#define LCD_I2C_PANELOLU2 #ifdef LCD_I2C_PANELOLU2 // This uses the LiquidTWI2 library ( https://github.com/lincomatic/LiquidTWI2 ). // Make sure it is placed in the Arduino libraries directory. #define LCD_I2C_TYPE_MCP23017 - #define LCD_I2C - #define ULTIPANEL + #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander + #define LCD_USE_I2C_BUZZER //comment out to disable buzzer on LCD #define NEWPANEL - #define LCD_I2C_ADDRESS 0x20 - #define LCD_HAS_I2C_BUZZ //comment out to disable buzzer on LCD - #define LCD_HAS_STATUS_INDICATORS + #define ULTIPANEL #endif -// VIKI LCD with status LEDs, integrated click & L/R/U/P buttons, separate encoder inputs +//VIKI LCD with status LEDs, integrated click & L/R/U/P buttons, separate encoder inputs //#define LCD_I2C_VIKI #ifdef LCD_I2C_VIKI // This uses the LiquidTWI2 library (https://github.com/lincomatic/LiquidTWI2). // Make sure it is placed in the Arduino libraries directory. - #define LCD_I2C_TYPE_MCP23017 - #define LCD_I2C - #define ULTIPANEL + #define LCD_I2C_TYPE_MCP23017 + #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander #define NEWPANEL - #define LCD_I2C_ADDRESS 0x20 - #define LCD_HAS_STATUS_INDICATORS + #define ULTIPANEL #endif #ifdef ULTIPANEL diff --git a/Marlin/Marlin.pde b/Marlin/Marlin.pde index 082bb0694f..a3ebf4756d 100644 --- a/Marlin/Marlin.pde +++ b/Marlin/Marlin.pde @@ -34,21 +34,14 @@ #include "pins.h" #ifdef ULTRA_LCD - #ifdef LCD_I2C + #if defined(LCD_I2C_TYPE_PCF8575) #include - #if defined(LCD_I2C_TYPE_PCF8575) - #include - #elif defined(LCD_I2C_TYPE_MCP23017) - #ifdef LCD_I2C_PANELOLU2 - #include - #ifndef PANELOLU2 - #error You must uncomment #define PANELOLU2 in LiquidTWI2.h for LiquidTWI2.cpp to compile correctly - #endif - #else - #include - #endif - #else - #error Unknown I2C LCD type + #include + #elif defined(LCD_I2C_TYPE_MCP23017) || defined(LCD_I2C_TYPE_MCP23008) + #include + #include + #if defined(LCD_I2C_PANELOLU2) && !defined(PANELOLU2) + #error You must uncomment "#define PANELOLU2" in LiquidTWI2.h for LiquidTWI2.cpp to compile correctly #endif #else #include diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index 8e223ed00f..ed259196d7 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -705,7 +705,9 @@ void lcd_init() lcd_oldcardstatus = IS_SD_INSERTED; #endif//(SDCARDDETECT > -1) lcd_buttons_update(); +#ifdef ULTIPANEL encoderDiff = 0; +#endif } void lcd_update() @@ -714,8 +716,8 @@ void lcd_update() lcd_buttons_update(); - #ifdef LCD_HAS_EXTRA_BUTTONS - buttons |= lcd_read_extra_buttons(); // buttons which take too long to read in interrupt context + #ifdef LCD_HAS_SLOW_BUTTONS + buttons |= lcd_implementation_read_slow_buttons(); // buttons which take too long to read in interrupt context #endif #if (SDCARDDETECT > -1) @@ -751,8 +753,12 @@ void lcd_update() if (LCD_CLICKED) timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; #endif//ULTIPANEL - (*currentMenu)(); + +#ifdef LCD_HAS_STATUS_INDICATORS + lcd_implementation_update_indicators(); +#endif + #ifdef ULTIPANEL if(timeoutToStatus < millis() && currentMenu != lcd_status_screen) { @@ -860,12 +866,12 @@ void lcd_buttons_update() } lastEncoderBits = enc; } -#endif//ULTIPANEL bool lcd_clicked() { return LCD_CLICKED; } +#endif//ULTIPANEL /********************************/ /** Float conversion utilities **/ diff --git a/Marlin/ultralcd_implementation_hitachi_HD44780.h b/Marlin/ultralcd_implementation_hitachi_HD44780.h index 651b1484cf..a606f642dd 100644 --- a/Marlin/ultralcd_implementation_hitachi_HD44780.h +++ b/Marlin/ultralcd_implementation_hitachi_HD44780.h @@ -6,72 +6,35 @@ * When selecting the rusian language, a slightly different LCD implementation is used to handle UTF8 characters. **/ -// Declare LCD class to use -#if defined(LCD_I2C_TYPE_PCF8575) - // note: these are virtual pins on the PCF8575 controller not Arduino pins - #define LCD_I2C_PIN_BL 3 - #define LCD_I2C_PIN_EN 2 - #define LCD_I2C_PIN_RW 1 - #define LCD_I2C_PIN_RS 0 - #define LCD_I2C_PIN_D4 4 - #define LCD_I2C_PIN_D5 5 - #define LCD_I2C_PIN_D6 6 - #define LCD_I2C_PIN_D7 7 - - #include - #include - #include - #define LCD_CLASS LiquidCrystal_I2C - LCD_CLASS lcd(LCD_I2C_ADDRESS,LCD_I2C_PIN_EN,LCD_I2C_PIN_RW,LCD_I2C_PIN_RS,LCD_I2C_PIN_D4,LCD_I2C_PIN_D5,LCD_I2C_PIN_D6,LCD_I2C_PIN_D7); -#elif defined(LCD_I2C_TYPE_MCP23017) - //for the LED indicators (which maybe mapped to different things in lcd_implementation_update_indicators()) - #define LED_A 0x04 //100 - #define LED_B 0x02 //010 - #define LED_C 0x01 //001 - - #include - #include - #define LCD_CLASS LiquidTWI2 - LCD_CLASS lcd(LCD_I2C_ADDRESS); //An alternative I2C master address can be used in place of "0" -#elif defined(LCD_I2C_TYPE_MCP23008) - #include - #include - #define LCD_CLASS LiquidTWI2 - LCD_CLASS lcd(LCD_I2C_ADDRESS); //An alternative I2C master address can be used in place of "0" -#else - #if LANGUAGE_CHOICE == 6 - #include "LiquidCrystalRus.h" - #define LCD_CLASS LiquidCrystalRus - #else - #include - #define LCD_CLASS LiquidCrystal - #endif - LCD_CLASS lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7 -#endif - extern volatile uint8_t buttons; //the last checked buttons in a bit array. -// provide default button bitmask and encoder definitions (note this is not pin or motherboard specific) -#ifdef LCD_I2C_VIKI - //encoder rotation values - #define encrot0 0 - #define encrot1 2 - #define encrot2 3 - #define encrot3 1 - - #define BLEN_C 2 - #define BLEN_B 1 - #define BLEN_A 0 - - #define EN_C (1< + #include + #include + #define LCD_CLASS LiquidCrystal_I2C + LCD_CLASS lcd(LCD_I2C_ADDRESS,LCD_I2C_PIN_EN,LCD_I2C_PIN_RW,LCD_I2C_PIN_RS,LCD_I2C_PIN_D4,LCD_I2C_PIN_D5,LCD_I2C_PIN_D6,LCD_I2C_PIN_D7); + +#elif defined(LCD_I2C_TYPE_MCP23017) + //for the LED indicators (which maybe mapped to different things in lcd_implementation_update_indicators()) + #define LED_A 0x04 //100 + #define LED_B 0x02 //010 + #define LED_C 0x01 //001 + + #define LCD_HAS_STATUS_INDICATORS + + #include + #include + #define LCD_CLASS LiquidTWI2 + LCD_CLASS lcd(LCD_I2C_ADDRESS); + +#elif defined(LCD_I2C_TYPE_MCP23008) + #include + #include + #define LCD_CLASS LiquidTWI2 + LCD_CLASS lcd(LCD_I2C_ADDRESS); + +#else + // Standard directly connected LCD implementations + #if LANGUAGE_CHOICE == 6 + #include "LiquidCrystalRus.h" + #define LCD_CLASS LiquidCrystalRus + #else + #include + #define LCD_CLASS LiquidCrystal + #endif + LCD_CLASS lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7 #endif /* Custom characters defined in the first 8 characters of the LCD */ @@ -247,13 +245,16 @@ static void lcd_implementation_init() lcd.setBacklightPin(LCD_I2C_PIN_BL,POSITIVE); lcd.setBacklight(HIGH); #endif + #elif defined(LCD_I2C_TYPE_MCP23017) lcd.setMCPType(LTI_TYPE_MCP23017); lcd.begin(LCD_WIDTH, LCD_HEIGHT); lcd.setBacklight(0); //set all the LEDs off to begin with + #elif defined(LCD_I2C_TYPE_MCP23008) lcd.setMCPType(LTI_TYPE_MCP23008); lcd.begin(LCD_WIDTH, LCD_HEIGHT); + #else lcd.begin(LCD_WIDTH, LCD_HEIGHT); #endif @@ -439,9 +440,6 @@ static void lcd_implementation_status_screen() //Status message line on the last line lcd.setCursor(0, LCD_HEIGHT - 1); lcd.print(lcd_status_message); -#ifdef LCD_HAS_STATUS_INDICATORS - lcd_implementation_update_indicators(); -#endif } static void lcd_implementation_drawmenu_generic(uint8_t row, const char* pstr, char pre_char, char post_char) { @@ -630,7 +628,7 @@ static void lcd_implementation_drawmenu_sddirectory(uint8_t row, const char* pst static void lcd_implementation_quick_feedback() { -#ifdef LCD_HAS_I2C_BUZZ +#ifdef LCD_USE_I2C_BUZZER lcd.buzz(300,4000); #elif defined(BEEPER) && BEEPER > -1 SET_OUTPUT(BEEPER); @@ -665,12 +663,12 @@ static void lcd_implementation_update_indicators() } #endif -#ifdef LCD_HAS_EXTRA_BUTTONS -static uint8_t lcd_read_extra_buttons() +#ifdef LCD_HAS_SLOW_BUTTONS +static uint8_t lcd_implementation_read_slow_buttons() { #ifdef LCD_I2C_TYPE_MCP23017 - // the I2C button bit positions are shifted by three bits from the native LiquidTWI2 position - // this is potentially too slow to call inside interrupt context + // Reading these buttons this is likely to be too slow to call inside interrupt context + // so they are called during normal lcd_update return lcd.readButtons() << B_I2C_BTN_OFFSET; #endif }