Merge branch 'MightyGH_LCD' into mightyboard-rev-G-H-PR

This commit is contained in:
Axel Sepulveda 2025-11-19 01:32:40 -03:00
commit 88f36ed2a2
13 changed files with 691 additions and 35 deletions

View file

@ -3003,7 +3003,9 @@
// https://github.com/mikeshub/SailfishLCD
// Uses the code directly from Sailfish
//
//#define FF_INTERFACEBOARD
// #define FF_INTERFACEBOARD
// #define MIGHTYBOARD_LCD
//
// TFT GLCD Panel with Marlin UI

View file

@ -45,7 +45,7 @@
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14)
#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14, MIGHTYBOARD_REVG)
#define AVR_ATmega2560_FAMILY_PLUS_70 1
#endif

View file

@ -25,7 +25,7 @@
* Structures for 2560 family boards that use more than 70 pins
*/
#if MB(BQ_ZUM_MEGA_3D, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14)
#if MB(BQ_ZUM_MEGA_3D, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14, MIGHTYBOARD_REVG)
#undef NUM_DIGITAL_PINS
#define NUM_DIGITAL_PINS 85
#elif MB(MIGHTYBOARD_REVE)

View file

@ -540,10 +540,55 @@
#define IS_ULTIPANEL 1
#endif
#if ANY(IS_ULTIPANEL, ULTRA_LCD)
#if ENABLED(MIGHTYBOARD_INTERFACE)
#define MIGHTYBOARD_LCD
// #define IS_ULTIPANEL 1
// #define HAS_WIRED_LCD 1
#define LCD_WIDTH 20
#define LCD_HEIGHT 4
#endif
#if ANY(IS_ULTIPANEL, ULTRA_LCD, MIGHTYBOARD_LCD)
#define HAS_WIRED_LCD 1
#endif
// // Compile-time diagnostic warnings for MightyBoard builds
// #if ENABLED(MIGHTYBOARD_LCD)
// #warning "MightyBoard build: MIGHTYBOARD_LCD is ENABLED"
// #if ENABLED(IS_ULTIPANEL)
// #warning "MightyBoard build: IS_ULTIPANEL is defined"
// #else
// #warning "MightyBoard build: IS_ULTIPANEL is NOT defined"
// #endif
// #if ENABLED(HAS_WIRED_LCD)
// #warning "MightyBoard build: HAS_WIRED_LCD is defined"
// #else
// #warning "MightyBoard build: HAS_WIRED_LCD is NOT defined"
// #endif
// #if ENABLED(HAS_MARLINUI_HD44780)
// #warning "MightyBoard build: HAS_MARLINUI_HD44780 is defined"
// #else
// #warning "MightyBoard build: HAS_MARLINUI_HD44780 is NOT defined"
// #endif
// #if ENABLED(HAS_MARLINUI_MENU)
// #warning "MightyBoard build: HAS_MARLINUI_MENU is defined"
// #else
// #warning "MightyBoard build: HAS_MARLINUI_MENU is NOT defined"
// #endif
// #if ENABLED(HAS_SHIFT_ENCODER)
// #warning "MightyBoard build: HAS_SHIFT_ENCODER is defined"
// #else
// #warning "MightyBoard build: HAS_SHIFT_ENCODER is NOT defined"
// #endif
// #if ENABLED(HAS_DIGITAL_BUTTONS)
// #warning "HAS_DIGITAL_BUTTONS enabled"
// #else
// #warning "MightyBoard build: HAS_DIGITAL_BUTTONS is NOT defined"
// #endif
// #endif
#if ANY(IS_ULTIPANEL, REPRAPWORLD_KEYPAD)
#define IS_NEWPANEL 1
#endif

View file

@ -0,0 +1,342 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2020 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 <https://www.gnu.org/licenses/>.
*
*/
#include "MightyboardLCDSerial.h"
#include "../../inc/MarlinConfigPre.h"
#include "../../core/serial.h"
#if HAS_MARLINUI_HD44780 && ENABLED(MIGHTYBOARD_LCD)
#include <util/delay.h>
/**
* Constructor: store pin assignments
*/
MightyboardLCDSerial::MightyboardLCDSerial(uint8_t strobe, uint8_t data, uint8_t clk, uint8_t pwrPin)
: _strobe_pin(strobe), _data_pin(data), _clk_pin(clk), _pwr_pin(pwrPin),
_displayfunction(LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS),
_displaycontrol(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF),
_displaymode(LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT),
_xcursor(0), _ycursor(0) {}
/**
* Initialize LCD display with 4-bit mode
* Follows HD44780 initialization sequence from datasheet
*/
void MightyboardLCDSerial::begin(uint8_t cols, uint8_t rows, uint8_t charsize) {
pinMode(_strobe_pin, OUTPUT);
pinMode(_data_pin, OUTPUT);
pinMode(_clk_pin, OUTPUT);
// Power on LCD if power pin is defined
if (_pwr_pin != 255) {
pinMode(_pwr_pin, OUTPUT);
digitalWrite(_pwr_pin, LOW); // Power on (active low)
}
_cols = cols;
_rows = rows;
// Diagnostic output showing LCD configuration
#ifdef MIGHTYBOARD_RUNTIME_DEBUG
SERIAL_ECHOLN("MightyboardLCDSerial::begin() - LCD Configuration:");
SERIAL_ECHO(" Dimensions: ");
SERIAL_ECHO(_cols);
SERIAL_ECHO(" x ");
SERIAL_ECHOLN(_rows);
#ifdef LCD_WIDTH
SERIAL_ECHO(" Expected from config: ");
SERIAL_ECHO(LCD_WIDTH);
SERIAL_ECHO(" x ");
SERIAL_ECHOLN(LCD_HEIGHT);
#endif
SERIAL_ECHO(" Charsize: ");
if (charsize == LCD_5x8DOTS)
SERIAL_ECHOLN("5x8 dots");
else if (charsize == LCD_5x10DOTS)
SERIAL_ECHOLN("5x10 dots");
else
SERIAL_ECHOLN("unknown");
#endif
if (rows > 1) {
_displayfunction |= LCD_2LINE;
}
if ((charsize != LCD_5x8DOTS) && (rows == 1)) {
_displayfunction |= LCD_5x10DOTS;
}
// Power-up delay as per HD44780 datasheet (> 40ms required)
delay(50);
// Initialization sequence for 4-bit mode
// This is a simplified sequence that works reliably
sendCommand(0x33); // Initialize, 8-bit mode attempt 1
sendCommand(0x32); // Set 4-bit mode
sendCommand(0x28); // Function Set: 4-bit, 2-line, 5x8 dots
sendCommand(0x0C); // Display ON, cursor OFF, blink OFF
sendCommand(0x06); // Entry Mode Set: increment, no shift
sendCommand(0x01); // Clear display
delay(5);
}
/**
* Clear the display and return cursor to home
*/
void MightyboardLCDSerial::clear() {
sendCommand(LCD_CLEARDISPLAY);
delay(2); // Clear takes ~1.52ms
}
/**
* Return cursor to home (0, 0)
*/
void MightyboardLCDSerial::home() {
sendCommand(LCD_RETURNHOME);
delay(2);
_xcursor = 0;
_ycursor = 0;
}
/**
* Turn display off (keeps data in DDRAM)
*/
void MightyboardLCDSerial::noDisplay() {
_displaycontrol &= ~LCD_DISPLAYON;
sendCommand(LCD_DISPLAYCONTROL | _displaycontrol);
}
/**
* Turn display on
*/
void MightyboardLCDSerial::display() {
_displaycontrol |= LCD_DISPLAYON;
sendCommand(LCD_DISPLAYCONTROL | _displaycontrol);
}
/**
* Turn off the blinking cursor
*/
void MightyboardLCDSerial::noBlink() {
_displaycontrol &= ~LCD_BLINKON;
sendCommand(LCD_DISPLAYCONTROL | _displaycontrol);
}
/**
* Turn on the blinking cursor
*/
void MightyboardLCDSerial::blink() {
_displaycontrol |= LCD_BLINKON;
sendCommand(LCD_DISPLAYCONTROL | _displaycontrol);
}
/**
* Turn off the underline cursor
*/
void MightyboardLCDSerial::noCursor() {
_displaycontrol &= ~LCD_CURSORON;
sendCommand(LCD_DISPLAYCONTROL | _displaycontrol);
}
/**
* Turn on the underline cursor
*/
void MightyboardLCDSerial::cursor() {
_displaycontrol |= LCD_CURSORON;
sendCommand(LCD_DISPLAYCONTROL | _displaycontrol);
}
/**
* Scroll display contents left (cursor follows)
*/
void MightyboardLCDSerial::scrollDisplayLeft() {
sendCommand(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT);
}
/**
* Scroll display contents right (cursor follows)
*/
void MightyboardLCDSerial::scrollDisplayRight() {
sendCommand(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT);
}
/**
* Set text direction left-to-right
*/
void MightyboardLCDSerial::leftToRight() {
_displaymode |= LCD_ENTRYLEFT;
sendCommand(LCD_ENTRYMODESET | _displaymode);
}
/**
* Set text direction right-to-left
*/
void MightyboardLCDSerial::rightToLeft() {
_displaymode &= ~LCD_ENTRYLEFT;
sendCommand(LCD_ENTRYMODESET | _displaymode);
}
/**
* Enable autoscroll (characters printed shift display left)
*/
void MightyboardLCDSerial::autoscroll() {
_displaymode |= LCD_ENTRYSHIFTINCREMENT;
sendCommand(LCD_ENTRYMODESET | _displaymode);
}
/**
* Disable autoscroll
*/
void MightyboardLCDSerial::noAutoscroll() {
_displaymode &= ~LCD_ENTRYSHIFTINCREMENT;
sendCommand(LCD_ENTRYMODESET | _displaymode);
}
/**
* Load a custom character into CGRAM
* @param location CGRAM address (0-7)
* @param charmap 8-byte array defining the character
*/
void MightyboardLCDSerial::createChar(uint8_t location, uint8_t charmap[]) {
location &= 0x7; // Only 8 locations available
sendCommand(LCD_SETCGRAMADDR | (location << 3));
for (int8_t i = 0; i < 8; i++) {
sendData(charmap[i]);
}
}
/**
* Set cursor position
* @param col Column (0 to cols-1)
* @param row Row (0 to rows-1)
*/
void MightyboardLCDSerial::setCursor(uint8_t col, uint8_t row) {
static const uint8_t row_offsets[] = {0x00, 0x40, 0x14, 0x54};
if (row >= _rows) row = _rows - 1;
_xcursor = col;
_ycursor = row;
sendCommand(LCD_SETDDRAMADDR | (col + row_offsets[row]));
}
/**
* Write a character to the LCD at current cursor position
* Automatically advances cursor and wraps to next line if needed
*/
size_t MightyboardLCDSerial::write(uint8_t value) {
sendData(value);
_xcursor++;
if (_xcursor >= _cols) {
_xcursor = 0;
_ycursor++;
if (_ycursor >= _rows) _ycursor = 0;
setCursor(_xcursor, _ycursor);
}
return 1;
}
/**
* Send a raw command byte to LCD
*/
void MightyboardLCDSerial::command(uint8_t value) {
send(value, false);
}
/**
* Low-level: send 8-bit value as two 4-bit nibbles
* @param value Byte to send
* @param mode false = command, true = data
*/
void MightyboardLCDSerial::send(uint8_t value, bool mode) {
write4bits(value >> 4, mode);
write4bits(value & 0x0F, mode);
}
/**
* Send command (RS = 0)
*/
inline void MightyboardLCDSerial::sendCommand(uint8_t value) {
send(value, false);
}
/**
* Send data (RS = 1)
*/
inline void MightyboardLCDSerial::sendData(uint8_t value) {
send(value, true);
}
/**
* Write 4-bit nibble to display
* @param value Lower 4 bits are used
* @param dataMode false = command (RS=0), true = data (RS=1)
*/
void MightyboardLCDSerial::write4bits(uint8_t value, bool dataMode) {
// Shift data to upper 4 bits (D7-D4 in HD44780)
uint8_t bits = value << 4;
// Set RS bit (bit 1) based on mode
// On Mightyboard: RS = 0b0010
if (dataMode)
bits |= 0b0010; // RS = 1 for data
// Pulse enable to latch the nibble
pulseEnable(bits);
}
/**
* Pulse the Enable line to latch data
* On Mightyboard hardware: Enable = bit 3 (0b01000)
* @param value Pre-set data bits (D7-D0 in shift register)
*/
void MightyboardLCDSerial::pulseEnable(uint8_t value) {
_delay_us(1);
value |= 0b01000; // Set enable HIGH
writeSerial(value);
_delay_us(1);
value &= 0b11110111; // Set enable LOW
writeSerial(value);
_delay_us(50); // Wait for command execution
}
/**
* Shift out 8 bits serially via shift register
* Sends MSB first (bit 7 down to bit 0)
* @param value Byte to shift out
*/
void MightyboardLCDSerial::writeSerial(uint8_t value) {
// Shift out each bit, MSB first
for (int8_t i = 7; i >= 0; i--) {
digitalWrite(_clk_pin, LOW);
bool data = (value >> i) & 0x01;
digitalWrite(_data_pin, data);
digitalWrite(_clk_pin, HIGH);
_delay_us(1); // Clock pulse width
}
// Pulse strobe to latch data into display shift register
digitalWrite(_strobe_pin, HIGH);
_delay_us(1);
digitalWrite(_strobe_pin, LOW);
}
#endif // HAS_MARLINUI_HD44780 && ENABLED(MIGHTYBOARD_LCD)

View file

@ -0,0 +1,142 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2020 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 <https://www.gnu.org/licenses/>.
*
*/
#pragma once
/**
* MightyboardLCDSerial
* Optimized 3-wire shift-register LCD driver for Mightyboard OEM displays
* Provides HD44780 compatible interface with minimal CPU overhead
*/
#include <Arduino.h>
class MightyboardLCDSerial : public Print {
public:
/**
* Constructor: initialize pin assignments
* @param strobe Strobe/latch pin (LATCH_PIN / SR_STROBE_PIN)
* @param data Data pin (MOSI_PIN / SR_DATA_PIN)
* @param clk Clock pin (SCLK_PIN / SR_CLK_PIN)
* @param pwrPin Power control pin (LCD_PWR_PIN)
*/
MightyboardLCDSerial(uint8_t strobe, uint8_t data, uint8_t clk, uint8_t pwrPin = 255);
/**
* Initialize display with given dimensions
* @param cols Number of columns (typically 20)
* @param rows Number of rows (typically 4)
*/
void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS);
// Basic display control
void clear();
void home();
void noDisplay();
void display();
void noBlink();
void blink();
void noCursor();
void cursor();
// Cursor movement
void setCursor(uint8_t col, uint8_t row);
void scrollDisplayLeft();
void scrollDisplayRight();
void leftToRight();
void rightToLeft();
void autoscroll();
void noAutoscroll();
// Custom characters
void createChar(uint8_t location, uint8_t charmap[]);
// Text output
virtual size_t write(uint8_t value);
using Print::write;
// Low-level command
void command(uint8_t value);
private:
uint8_t _strobe_pin;
uint8_t _data_pin;
uint8_t _clk_pin;
uint8_t _pwr_pin;
uint8_t _cols;
uint8_t _rows;
uint8_t _displayfunction;
uint8_t _displaycontrol;
uint8_t _displaymode;
uint8_t _xcursor;
uint8_t _ycursor;
// Low-level communication
void send(uint8_t value, bool mode);
void sendCommand(uint8_t value);
void sendData(uint8_t value);
void write4bits(uint8_t value, bool dataMode);
void pulseEnable(uint8_t value);
void writeSerial(uint8_t value);
// HD44780 command constants
static const uint8_t LCD_CLEARDISPLAY = 0x01;
static const uint8_t LCD_RETURNHOME = 0x02;
static const uint8_t LCD_ENTRYMODESET = 0x04;
static const uint8_t LCD_DISPLAYCONTROL = 0x08;
static const uint8_t LCD_CURSORSHIFT = 0x10;
static const uint8_t LCD_FUNCTIONSET = 0x20;
static const uint8_t LCD_SETCGRAMADDR = 0x40;
static const uint8_t LCD_SETDDRAMADDR = 0x80;
// Entry mode flags
static const uint8_t LCD_ENTRYRIGHT = 0x00;
static const uint8_t LCD_ENTRYLEFT = 0x02;
static const uint8_t LCD_ENTRYSHIFTINCREMENT = 0x01;
static const uint8_t LCD_ENTRYSHIFTDECREMENT = 0x00;
// Display control flags
static const uint8_t LCD_DISPLAYON = 0x04;
static const uint8_t LCD_DISPLAYOFF = 0x00;
static const uint8_t LCD_CURSORON = 0x02;
static const uint8_t LCD_CURSOROFF = 0x00;
static const uint8_t LCD_BLINKON = 0x01;
static const uint8_t LCD_BLINKOFF = 0x00;
// Display shift flags
static const uint8_t LCD_DISPLAYMOVE = 0x08;
static const uint8_t LCD_CURSORMOVE = 0x00;
static const uint8_t LCD_MOVERIGHT = 0x04;
static const uint8_t LCD_MOVELEFT = 0x00;
// Function set flags
static const uint8_t LCD_8BITMODE = 0x10;
static const uint8_t LCD_4BITMODE = 0x00;
static const uint8_t LCD_2LINE = 0x08;
static const uint8_t LCD_1LINE = 0x00;
static const uint8_t LCD_5x10DOTS = 0x04;
static const uint8_t LCD_5x8DOTS = 0x00;
};
// Alias for compatibility with Marlin's LCD_CLASS macro
using MightyboardLCD = MightyboardLCDSerial;

View file

@ -67,19 +67,19 @@
//
#if ENABLED(LCD_I2C_TYPE_PCF8575)
#warning "LCD_CLASS: LiquidCrystal_I2C (PCF8575)"
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 ANY(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008)
#warning "LCD_CLASS: LiquidTWI2 (MCP23017/MCP23008)"
LCD_CLASS lcd(LCD_I2C_ADDRESS OPTARG(DETECT_I2C_LCD_DEVICE, 1));
#elif ENABLED(LCD_I2C_TYPE_PCA8574)
#warning "LCD_CLASS: LiquidCrystal_I2C (PCA8574)"
LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_WIDTH, LCD_HEIGHT);
#elif ENABLED(SR_LCD_2W_NL)
#warning "LCD_CLASS: LiquidCrystal_SR (2-Wire)"
// 2 wire Non-latching LCD SR from:
// https://github.com/fmalpartida/New-LiquidCrystal/wiki/schematics#user-content-ShiftRegister_connection
@ -89,8 +89,20 @@
#endif
);
#elif ENABLED(SR_LCD_3W_NL)
#elif ENABLED(MIGHTYBOARD_LCD)
#warning "LCD_CLASS: MightyboardLCDSerial (MIGHTYBOARD_LCD)"
// 3-wire shift-register LCD for Mightyboard
// Optimized in-tree implementation
#if PIN_EXISTS(LCD_PWR)
#warning "MIGHTYBOARD: LCD_PWR_PIN defined - power control enabled"
LCD_CLASS lcd(SR_STROBE_PIN, SR_DATA_PIN, SR_CLK_PIN, LCD_PWR_PIN);
#else
#warning "MIGHTYBOARD: LCD_PWR_PIN not defined - power control disabled"
LCD_CLASS lcd(SR_STROBE_PIN, SR_DATA_PIN, SR_CLK_PIN);
#endif
#elif ENABLED(SR_LCD_3W_NL)
#warning "LCD_CLASS: LiquidCrystalSerial (Sailfish SR_LCD_3W_NL)"
// NewLiquidCrystal was not working
// https://github.com/mikeshub/SailfishLCD
// uses the code directly from Sailfish
@ -98,7 +110,7 @@
LCD_CLASS lcd(SR_STROBE_PIN, SR_DATA_PIN, SR_CLK_PIN);
#elif ENABLED(LCM1602)
#warning "LCD_CLASS: LiquidCrystal_I2C (LCM1602)"
LCD_CLASS lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#elif ENABLED(YHCB2004)
@ -119,10 +131,11 @@
#error "YHCB2004 display requires YHCB2004_SS_PIN, YHCB2004_SCK_PIN, YHCB2004_MOSI_PIN, and YHCB2004_MISO_PIN."
#endif
#warning "LCD_CLASS: LiquidCrystal_AIP31068_SPI (YHCB2004)"
LCD_CLASS lcd(YHCB2004_SS_PIN, 20, 4, YHCB2004_SCK_PIN, YHCB2004_MOSI_PIN, YHCB2004_MISO_PIN); // SS, cols, rows, SCK, MOSI, MISO
#else
#warning "LCD_CLASS: LiquidCrystal (Standard Direct)"
// Standard direct-connected LCD implementations
LCD_CLASS lcd(LCD_PINS_RS, LCD_PINS_EN, LCD_PINS_D4, LCD_PINS_D5, LCD_PINS_D6, LCD_PINS_D7);
@ -378,6 +391,8 @@ void MarlinUI::set_custom_characters(const HD44780CharSet screen_charset/*=CHARS
void MarlinUI::init_lcd() {
SERIAL_ECHOLN("DEBUG_LCD: about to call lcd.begin()");
#if ENABLED(LCD_I2C_TYPE_PCF8575)
lcd.begin(LCD_WIDTH, LCD_HEIGHT);
#ifdef LCD_I2C_PIN_BL
@ -402,6 +417,8 @@ void MarlinUI::init_lcd() {
lcd.begin(LCD_WIDTH, LCD_HEIGHT);
#endif
SERIAL_ECHOLN("DEBUG_LCD: lcd.begin returned");
set_custom_characters(on_status_screen() ? CHARSET_INFO : CHARSET_MENU);
lcd.clear();

View file

@ -89,6 +89,15 @@
#include <LiquidCrystal_SR.h>
#define LCD_CLASS LiquidCrystal_SR
#elif ENABLED(MIGHTYBOARD_LCD)
// 3-wire shift-register LCD for Mightyboard
// Optimized in-tree implementation
// Pin mapping: SR_STROBE_PIN, SR_DATA_PIN, SR_CLK_PIN
#include "MightyboardLCDSerial.h"
#define LCD_CLASS MightyboardLCDSerial
#elif ENABLED(SR_LCD_3W_NL)
// NewLiquidCrystal didn't work, so this uses

View file

@ -304,6 +304,11 @@ void MarlinUI::init_lcd() {
u8g.init(U8G_PARAM);
did_init_u8g = true;
}
SERIAL_ECHOLN("init LCD");
#if PIN_EXISTS(LCD_PWR_PIN)
SERIAL_ECHOLN("Pwr pin low");
digitalWrite(LCD_PWR_PIN, LOW);
#endif
#if PIN_EXISTS(LCD_BACKLIGHT)
OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away
@ -339,6 +344,7 @@ void MarlinUI::init_lcd() {
#if PIN_EXISTS(LCD_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT)
WRITE(LCD_BACKLIGHT_PIN, HIGH);
SERIAL_ECHOLN("Backlight high");
#endif
TERN_(HAS_LCD_CONTRAST, refresh_contrast());

View file

@ -273,7 +273,11 @@ void MarlinUI::init() {
SET_INPUT_PULLUP(BTN_EN2);
#endif
#if BUTTON_EXISTS(ENC)
SET_INPUT_PULLUP(BTN_ENC);
#if ENABLED(MIGHTYBOARD_DISABLE_ENC_PULLUP)
SET_INPUT(BTN_ENC);
#else
SET_INPUT_PULLUP(BTN_ENC);
#endif
#endif
#if BUTTON_EXISTS(ENC_EN)
SET_INPUT_PULLUP(BTN_ENC_EN);
@ -282,18 +286,68 @@ void MarlinUI::init() {
SET_INPUT_PULLUP(BTN_BACK);
#endif
#if BUTTON_EXISTS(UP)
SET_INPUT(BTN_UP);
#if ENABLED(MIGHTYBOARD_BUTTON_PULLUPS)
SET_INPUT_PULLUP(BTN_UP);
#else
SET_INPUT(BTN_UP);
#endif
#endif
#if BUTTON_EXISTS(DOWN)
SET_INPUT(BTN_DOWN);
#if ENABLED(MIGHTYBOARD_BUTTON_PULLUPS)
SET_INPUT_PULLUP(BTN_DOWN);
#else
SET_INPUT(BTN_DOWN);
#endif
#endif
#if BUTTON_EXISTS(LFT)
SET_INPUT(BTN_LEFT);
#if ENABLED(MIGHTYBOARD_BUTTON_PULLUPS)
SET_INPUT_PULLUP(BTN_LEFT);
#else
SET_INPUT(BTN_LEFT);
#endif
#endif
#if BUTTON_EXISTS(RT)
SET_INPUT(BTN_RIGHT);
#if ENABLED(MIGHTYBOARD_BUTTON_PULLUPS)
SET_INPUT_PULLUP(BTN_RIGHT);
#else
SET_INPUT(BTN_RIGHT);
#endif
#endif
// // Compile-time warnings to confirm whether this directional-button init block
// // is compiled for the current board. These will appear in the compiler output
// // only when ANY_BUTTON(UP, DOWN, LFT, RT) evaluates true for the current build.
// #if ENABLED(MIGHTYBOARD_RUNTIME_DEBUG) && ANY_BUTTON(UP, DOWN, LFT, RT)
// #warning "Marlin: Compiling directional button init (UP/DOWN/LEFT/RIGHT)"
// #endif
// // Optional runtime trace for MightyBoard UI/button flow.
// // Enable by uncommenting `#define MIGHTYBOARD_RUNTIME_DEBUG` in the board pins file.
// #if ENABLED(MIGHTYBOARD_RUNTIME_DEBUG)
// SERIAL_ECHOLN("MarlinUI::init() - MIGHTYBOARD_RUNTIME_DEBUG active");
// #if ENABLED(MIGHTYBOARD_BUTTON_PULLUPS)
// SERIAL_ECHOLN("MIGHTYBOARD_BUTTON_PULLUPS: ENABLED");
// #else
// SERIAL_ECHOLN("MIGHTYBOARD_BUTTON_PULLUPS: DISABLED");
// #endif
// SERIAL_ECHO_MSG("LCD dimensions: ", LCD_WIDTH, " x ", LCD_HEIGHT);
// SERIAL_ECHOLN("");
// // Report encoder/click compile-time presence and pin numbers (if defined)
// #if BUTTON_EXISTS(ENC)
// SERIAL_ECHOLN("BUTTON_EXISTS(ENC): defined");
// SERIAL_ECHO_MSG("BTN_ENC pin: ", BTN_ENC);
// SERIAL_ECHOLN("");
// #else
// SERIAL_ECHOLN("BUTTON_EXISTS(ENC): NOT defined");
// #endif
// #ifdef BTN_CLICK
// SERIAL_ECHO_MSG("BTN_CLICK pin: ", BTN_CLICK);
// SERIAL_ECHOLN("");
// #endif
// #endif
#if HAS_SHIFT_ENCODER
#if ENABLED(SR_LCD_2W_NL) // Non latching 2 wire shift register
@ -1326,6 +1380,18 @@ void MarlinUI::init() {
void MarlinUI::update_buttons() {
const millis_t now = millis();
// #if ENABLED(MIGHTYBOARD_RUNTIME_DEBUG)
// // Debug: print raw pin reads for encoder/click to diagnose BTN_ENC alias
// #if BUTTON_EXISTS(ENC)
// SERIAL_ECHO_MSG("DBG: READ(BTN_ENC) = ", READ(BTN_ENC));
// SERIAL_ECHOLN("");
// #endif
// #ifdef BTN_CLICK
// SERIAL_ECHO_MSG("DBG: READ(BTN_CLICK) = ", READ(BTN_CLICK));
// SERIAL_ECHOLN("");
// #endif
// #endif
#if HAS_MARLINUI_ENCODER
const int8_t delta = get_encoder_delta(now);
@ -1358,18 +1424,34 @@ void MarlinUI::init() {
if (BUTTON_PRESSED(UP)) {
encoderDiff = pulses * (ENCODER_STEPS_PER_MENU_ITEM);
next_button_update_ms = now + 300;
// #if ENABLED(MIGHTYBOARD_RUNTIME_DEBUG)
// SERIAL_ECHO_MSG("update_buttons(): UP -> encoderDiff=", encoderDiff);
// SERIAL_ECHOLN("");
// #endif
}
else if (BUTTON_PRESSED(DOWN)) {
encoderDiff = pulses * -(ENCODER_STEPS_PER_MENU_ITEM);
next_button_update_ms = now + 300;
// #if ENABLED(MIGHTYBOARD_RUNTIME_DEBUG)
// SERIAL_ECHO_MSG("update_buttons(): DOWN -> encoderDiff=", encoderDiff);
// SERIAL_ECHOLN("");
// #endif
}
else if (BUTTON_PRESSED(LEFT)) {
encoderDiff = -pulses;
next_button_update_ms = now + 300;
// #if ENABLED(MIGHTYBOARD_RUNTIME_DEBUG)
// SERIAL_ECHO_MSG("update_buttons(): LEFT -> encoderDiff=", encoderDiff);
// SERIAL_ECHOLN("");
// #endif
}
else if (BUTTON_PRESSED(RIGHT)) {
encoderDiff = pulses;
next_button_update_ms = now + 300;
// #if ENABLED(MIGHTYBOARD_RUNTIME_DEBUG)
// SERIAL_ECHO_MSG("update_buttons(): RIGHT -> encoderDiff=", encoderDiff);
// SERIAL_ECHOLN("");
// #endif
}
#endif // UP || DOWN || LEFT || RIGHT

View file

@ -26,6 +26,7 @@
* Schematic: not avalable (as rev G and H are not open source)
* Pins based on the work of https://github.com/Sgail7/Replicator-Revival-Project/
* Pin number according to Mega extended mega2560ext: .\buildroot\share\PlatformIO\variants\MARLIN_MEGA_EXTENDED\pins_arduino.h
* Corrected pins based on Marlin\src\libs\softspi.h
* Use env:MightyBoard2560 or env:MightyBoard1280 in platformio.ini
*/
@ -40,7 +41,7 @@
//
#define X_STOP_PIN 30 // C7
#define Y_STOP_PIN 31 // C6
#define Z_MIN_PIN 32 // C5
#define Z_STOP_PIN 32 // C5
//
// Steppers
@ -76,7 +77,7 @@
#define DIGIPOTS_I2C_SDA_Y 43 // L6
#define DIGIPOTS_I2C_SDA_Z 46 // L3
#define DIGIPOTS_I2C_SDA_E0 26 // A4
#define DIGIPOTS_I2C_SDA_E1 77 // J7
#define DIGIPOTS_I2C_SDA_E1 74 // J7
#ifndef DIGIPOT_I2C_ADDRESS_A
#define DIGIPOT_I2C_ADDRESS_A 0x2F // unshifted slave address (5E <- 2F << 1)
@ -138,7 +139,7 @@
//
#if HAS_WIRED_LCD
#warning "HAS_WIRED_LCD is defined."
#if IS_RRD_FG_SC
#define LCD_PINS_RS 33 // C4: LCD-STROBE
@ -160,27 +161,30 @@
#define STAT_LED_BLUE_PIN SERVO1_PIN // C0 (1280-EX2, DEBUG3)
#else
#warning "Using SR pins."
// Replicator 2 and 2X uses a HD44780 SPI display, pins: mosi, sclk, miso (not used), missing: latch, click, power
#define SPI_SOFT_MOSI_PIN 37 // C0
#define SPI_SOFT_SCLK_PIN 36 // C1
#define SPI_SOFT_MISO_PIN 33 // C4
#define SR_DATA_PIN 37 // C0
#define SR_CLK_PIN 36 // C1
#define SR_STROBE_PIN 34 // C3
#define BTN_LATCH_PIN 34 // C3
#define BTN_CLICK_PIN 39 // G2
#define SR_DETECT_PIN 33 // C4
#define BTN_UP_PIN 76 // J5
#define BTN_DOWN_PIN 75 // J4
#define BTN_LEFT_PIN 77 // J6/J13
#define BUTTON_LED_PIN 35 // C2 To be implemented...
#define LCD_POWER_PIN 29 // A7
#define BTN_CENTER 39 // G2
#define BTN_UP 76 // J5
#define BTN_DOWN 75 // J4
#define BTN_LEFT 77 // J6
#define BTN_RIGHT 73 // J3
#define LCD_LED1_PIN 35 // C2
// Leave Old pins defined for now
#define SR_DATA_PIN 37 // C0 *
#define SR_CLK_PIN 36 // C1 *
#define SR_STROBE_PIN 33 // C4 *
// Map the CLICK button to the encoder 'click' so Marlin treats it as SELECT
#ifndef BTN_ENC
#define BTN_ENC BTN_CENTER
#endif
#define LCD_PWR_PIN 29 // A7
// Disable encoder
#undef BTN_EN1
#undef BTN_EN2
@ -190,3 +194,5 @@
#endif
#endif // HAS_WIRED_LCD

View file

@ -954,6 +954,10 @@
#if PIN_EXISTS(LCD_BACKLIGHT)
REPORT_NAME_DIGITAL(__LINE__, LCD_BACKLIGHT_PIN)
#endif
#if PIN_EXISTS(LCD_PWR)
REPORT_NAME_DIGITAL(__LINE__, LCD_PWR_PIN)
#endif
//
// LED Lights

View file

@ -54,7 +54,8 @@ extra_scripts =
pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py
pre:buildroot/share/PlatformIO/scripts/preflight-checks.py
post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py
lib_deps =
lib_deps =
https://github.com/mikeshub/SailfishLCD.git
default_src_filter = +<src/*> -<src/config> -<src/tests>
; LCDs and Controllers
-<src/lcd/HD44780> -<src/lcd/dogm> -<src/lcd/TFTGLCD> -<src/lcd/tft> -<src/lcd/tft_io>