Skip to content
Snippets Groups Projects
ultralcd_common_HD44780.h 5.88 KiB
Newer Older
  • Learn to ignore specific revisions
  • /**
     * Marlin 3D Printer Firmware
     * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
     *
     * Based on Sprinter and grbl.
     * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
     *
     * This program is free software: you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     *
     */
    
    Scott Lahteine's avatar
    Scott Lahteine committed
    #pragma once
    
    
    /**
     * Implementation of the LCD display routines for a Hitachi HD44780 display.
     * These are the most common LCD character displays.
     */
    
    
    Scott Lahteine's avatar
    Scott Lahteine committed
    #include "../../inc/MarlinConfig.h"
    
    Scott Lahteine's avatar
    Scott Lahteine committed
      #include "../../libs/duration_t.h"
    
    #endif
    
    #if ENABLED(AUTO_BED_LEVELING_UBL)
    
    Scott Lahteine's avatar
    Scott Lahteine committed
      #include "../../feature/bedlevel/ubl/ubl.h"
    
    
      #if ENABLED(ULTIPANEL)
        #define ULTRA_X_PIXELS_PER_CHAR    5
        #define ULTRA_Y_PIXELS_PER_CHAR    8
        #define ULTRA_COLUMNS_FOR_MESH_MAP 7
        #define ULTRA_ROWS_FOR_MESH_MAP    4
    
        #define N_USER_CHARS    8
    
        #define TOP_LEFT      _BV(0)
        #define TOP_RIGHT     _BV(1)
        #define LOWER_LEFT    _BV(2)
        #define LOWER_RIGHT   _BV(3)
      #endif
    #endif
    
    ////////////////////////////////////
    // Setup button and encode mappings for each panel (into 'buttons' variable
    //
    // This is just to map common functions (across different panels) onto the same
    // macro name. The mapping is independent of whether the button is directly connected or
    // via a shift/i2c register.
    
    #if ENABLED(ULTIPANEL)
    
    
      extern volatile uint8_t buttons;
    
    
      //
      // Setup other button mappings of each panel
      //
      #if ENABLED(LCD_I2C_VIKI)
        #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C)
    
        // button and encoder bit positions within 'buttons'
    
        #define B_LE (BUTTON_LEFT   << B_I2C_BTN_OFFSET)    // The remaining normalized buttons are all read via I2C
        #define B_UP (BUTTON_UP     << B_I2C_BTN_OFFSET)
        #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET)
        #define B_DW (BUTTON_DOWN   << B_I2C_BTN_OFFSET)
        #define B_RI (BUTTON_RIGHT  << B_I2C_BTN_OFFSET)
    
    
        #undef LCD_CLICKED
        #if BUTTON_EXISTS(ENC)
          // the pause/stop/restart button is connected to BTN_ENC when used
          #define B_ST (EN_C)                            // Map the pause/stop/resume button into its normalized functional name
    
          #define LCD_CLICKED (buttons & (B_MI|B_RI|B_ST)) // pause/stop button also acts as click until we implement proper pause/stop.
    
          #define LCD_CLICKED (buttons & (B_MI|B_RI))
    
        #endif
    
        // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update
        #define LCD_HAS_SLOW_BUTTONS
    
      #elif ENABLED(LCD_I2C_PANELOLU2)
    
        #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin
    
          #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C)
    
    
          #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later
    
    
          #undef LCD_CLICKED
          #define LCD_CLICKED (buttons & B_MI)
    
          // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update
          #define LCD_HAS_SLOW_BUTTONS
    
        #endif
    
      #elif DISABLED(NEWPANEL) // old style ULTIPANEL
        // Shift register bits correspond to buttons:
        #define BL_LE 7   // Left
        #define BL_UP 6   // Up
        #define BL_MI 5   // Middle
        #define BL_DW 4   // Down
        #define BL_RI 3   // Right
        #define BL_ST 2   // Red Button
        #define B_LE (_BV(BL_LE))
        #define B_UP (_BV(BL_UP))
        #define B_MI (_BV(BL_MI))
        #define B_DW (_BV(BL_DW))
        #define B_RI (_BV(BL_RI))
        #define B_ST (_BV(BL_ST))
        #define LCD_CLICKED (buttons & (B_MI|B_ST))
      #endif
    
    #endif // ULTIPANEL
    
    ////////////////////////////////////
    // Create LCD class instance and chipset-specific information
    #if ENABLED(LCD_I2C_TYPE_PCF8575)
    
    Scott Lahteine's avatar
    Scott Lahteine committed
      // NOTE: These are register-mapped 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 <Wire.h>
      #include <LCD.h>
      #include <LiquidCrystal_I2C.h>
      #define LCD_CLASS LiquidCrystal_I2C
    
    #elif ENABLED(LCD_I2C_TYPE_MCP23017)
    
    Scott Lahteine's avatar
    Scott Lahteine committed
      // For the LED indicators (which may be mapped to different events 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 <Wire.h>
      #include <LiquidTWI2.h>
      #define LCD_CLASS LiquidTWI2
    
    #elif ENABLED(LCD_I2C_TYPE_MCP23008)
      #include <Wire.h>
      #include <LiquidTWI2.h>
      #define LCD_CLASS LiquidTWI2
    
    #elif ENABLED(LCD_I2C_TYPE_PCA8574)
      #include <LiquidCrystal_I2C.h>
      #define LCD_CLASS LiquidCrystal_I2C
    
    // 2 wire Non-latching LCD SR from:
    // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection
    #elif ENABLED(SR_LCD_2W_NL)
      extern "C" void __cxa_pure_virtual() { while (1); }
      #include <LCD.h>
      #include <LiquidCrystal_SR.h>
      #define LCD_CLASS LiquidCrystal_SR
    
    #elif ENABLED(LCM1602)
      #include <Wire.h>
      #include <LCD.h>
      #include <LiquidCrystal_I2C.h>
      #define LCD_CLASS LiquidCrystal_I2C
    
    #else
      // Standard directly connected LCD implementations
      #include <LiquidCrystal.h>
      #define LCD_CLASS LiquidCrystal
    
    #endif
    
    
    Scott Lahteine's avatar
    Scott Lahteine committed
    #include "../fontutils.h"
    #include "../lcdprint.h"
    
    
    #if ENABLED(LCD_PROGRESS_BAR)
      #define LCD_STR_PROGRESS  "\x03\x04\x05"
    #endif