diff --git a/Conf.cpp b/Conf.cpp index 4e877f9..a4e94d6 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -130,6 +130,7 @@ m_tftSerialBrightness(50U), m_hd44780Rows(2U), m_hd44780Columns(16U), m_hd44780Pins(), +m_hd44780i2cAddress, m_hd44780PWM(false), m_hd44780PWMPin(), m_hd44780PWMBright(), @@ -438,6 +439,8 @@ bool CConf::read() m_hd44780Rows = (unsigned int)::atoi(value); else if (::strcmp(key, "Columns") == 0) m_hd44780Columns = (unsigned int)::atoi(value); + else if (::strcmp(key, "I2CAddress") == 0) + m_hd44780i2cAddress = value; else if (::strcmp(key, "PWM") == 0) m_hd44780PWM = ::atoi(value) == 1; else if (::strcmp(key, "PWMPin") == 0) @@ -889,6 +892,11 @@ std::vector CConf::getHD44780Pins() const return m_hd44780Pins; } +std::string CConf::getHD44780i2cAddress() const +{ + return m_hd44780i2cAddress; +} + bool CConf::getHD44780PWM() const { return m_hd44780PWM; diff --git a/Conf.h b/Conf.h index 16eb6fd..35111a2 100644 --- a/Conf.h +++ b/Conf.h @@ -137,6 +137,7 @@ public: unsigned int getHD44780Rows() const; unsigned int getHD44780Columns() const; std::vector getHD44780Pins() const; + std::string getHD44780i2cAddress() const; bool getHD44780PWM() const; unsigned int getHD44780PWMPin() const; unsigned int getHD44780PWMBright() const; @@ -252,6 +253,7 @@ private: unsigned int m_hd44780Rows; unsigned int m_hd44780Columns; std::vector m_hd44780Pins; + std::string m_hd44780i2cAddress; bool m_hd44780PWM; unsigned int m_hd44780PWMPin; unsigned int m_hd44780PWMBright; diff --git a/HD44780.cpp b/HD44780.cpp index c900b33..751a84a 100644 --- a/HD44780.cpp +++ b/HD44780.cpp @@ -36,7 +36,7 @@ char m_buffer2[128U]; char m_buffer3[128U]; char m_buffer4[128U]; -CHD44780::CHD44780(unsigned int rows, unsigned int cols, const std::string& callsign, unsigned int dmrid, const std::vector& pins, bool pwm, unsigned int pwmPin, unsigned int pwmBright, unsigned int pwmDim, bool displayClock, bool utc, bool duplex) : +CHD44780::CHD44780(unsigned int rows, unsigned int cols, const std::string& callsign, unsigned int dmrid, const std::vector& pins, const std::string& i2cAddress, bool pwm, unsigned int pwmPin, unsigned int pwmBright, unsigned int pwmDim, bool displayClock, bool utc, bool duplex) : CDisplay(), m_rows(rows), m_cols(cols), @@ -48,6 +48,7 @@ m_d0(pins.at(2U)), m_d1(pins.at(3U)), m_d2(pins.at(4U)), m_d3(pins.at(5U)), +m_i2cAddress(i2cAddress), m_pwm(pwm), m_pwmPin(pwmPin), m_pwmBright(pwmBright), @@ -239,7 +240,7 @@ bool CHD44780::open() void CHD44780::adafruitLCDSetup() { // The other control pins are initialised with lcdInit() - ::mcp23017Setup(AF_BASE, MCP23017); + ::mcp23017Setup(AF_BASE, m_i2caddress); // Backlight LEDs ::pinMode(AF_RED, OUTPUT); @@ -311,7 +312,7 @@ void CHD44780::adafruitLCDColour(ADAFRUIT_COLOUR colour) void CHD44780::pcf8574LCDSetup() { // Initalize PFC8574 - ::pcf8574Setup(AF_BASE, PCF8574); + ::pcf8574Setup(AF_BASE, m_i2cAddress); // Turn on backlight ::pinMode (AF_BL, OUTPUT); diff --git a/HD44780.h b/HD44780.h index ab8b3ae..d7fb13a 100644 --- a/HD44780.h +++ b/HD44780.h @@ -67,7 +67,7 @@ enum ADAFRUIT_COLOUR { #define AF_ON LOW #define AF_OFF HIGH -#define MCP23017 0x20 +// #define MCP23017 0x20 #endif // Define for HD44780 connected via a PCF8574 GPIO extender @@ -83,13 +83,13 @@ enum ADAFRUIT_COLOUR { #define AF_D2 (AF_BASE + 6) #define AF_D3 (AF_BASE + 7) -#define PCF8574 0x27 +// #define PCF8574 0x27 #endif class CHD44780 : public CDisplay { public: - CHD44780(unsigned int rows, unsigned int cols, const std::string& callsign, unsigned int dmrid, const std::vector& pins, bool pwm, unsigned int pwmPin, unsigned int pwmBright, unsigned int pwmDim, bool displayClock, bool utc, bool duplex); + CHD44780(unsigned int rows, unsigned int cols, const std::string& callsign, unsigned int dmrid, const std::vector& pins, const std::string& i2cAddress, bool pwm, unsigned int pwmPin, unsigned int pwmBright, unsigned int pwmDim, bool displayClock, bool utc, bool duplex); virtual ~CHD44780(); virtual bool open(); @@ -123,6 +123,7 @@ private: unsigned int m_d1; unsigned int m_d2; unsigned int m_d3; + std::string m_i2cAddress; bool m_pwm; unsigned int m_pwmPin; unsigned int m_pwmBright; diff --git a/MMDVM.ini b/MMDVM.ini index 7492b7d..bb235a4 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -107,15 +107,20 @@ Brightness=50 [HD44780] Rows=2 Columns=16 + +# For basic HD44780 displays (4-bit connection) # rs, strb, d0, d1, d2, d3 -# For basic HD44780 displays Pins=11,10,0,1,2,3 +# Device address for I2C +I2CAddress=0x20 + # PWM backlight PWM=0 PWMPin=21 PWMBright=100 PWMDim=16 + DisplayClock=1 UTC=0 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 1d2d114..c2fd081 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -875,6 +875,7 @@ void CMMDVMHost::createDisplay() unsigned int rows = m_conf.getHD44780Rows(); unsigned int columns = m_conf.getHD44780Columns(); std::vector pins = m_conf.getHD44780Pins(); + std::string i2cAddress = m_conf.getHD44780i2cAddress(); bool pwm = m_conf.getHD44780PWM(); unsigned int pwmPin = m_conf.getHD44780PWMPin(); unsigned int pwmBright = m_conf.getHD44780PWMBright(); @@ -898,7 +899,7 @@ void CMMDVMHost::createDisplay() if (displayClock) LogInfo(" Display UTC: %s", utc ? "yes" : "no"); - m_display = new CHD44780(rows, columns, m_callsign, dmrid, pins, pwm, pwmPin, pwmBright, pwmDim, displayClock, utc, m_duplex); + m_display = new CHD44780(rows, columns, m_callsign, dmrid, pins, i2cAddress, pwm, pwmPin, pwmBright, pwmDim, displayClock, utc, m_duplex); } #endif #if defined(OLED) diff --git a/README.HD44780 b/README.HD44780 new file mode 100644 index 0000000..5364e28 --- /dev/null +++ b/README.HD44780 @@ -0,0 +1,46 @@ + - HD44780 LCD SUPPORT - + +Support for the HD44780 LCD is via the wiringPi library available at +http://wiringpi.com/download-and-install/ which must be installed in all cases. + +The HD44780 in 4-bit mode is probably the most common connection method and +wiring details can be found at http://wiringpi.com/dev-lib/lcd-library/ + +To compile MMDVMHost with support for the HD44780 use the following commands. + +# cp Makefile.Pi.HD44780 Makefile +# make clean +# make + +Other HD44780 variations exist that connect via I2C. Support is also via +wiringPi, but to compile for each I2C device requires a different Makefile +depending on the IC attached to the LCD. + + - ADAFRUIT RGB LCD SHIELD - + +The Adafruit RGB LCD Shield is available from https://www.adafruit.com/product/714 +I2C is via the MCP23017 IC and is enabled with Makefile.Pi.Adafruit. The +I2C device address in MMDVM.ini should be set to 0x20. + + - PCF8574 IC - + +HD44780 LCDs connected via a PCF8574 Remote 8-Bit I/O Expander are available on +eBay for very little money! This IC uses Makefile.Pi.PCF8574 and the I2C +device address should be set to 0x27. + + - BEWARE - + + The I2C device address can be manually configured on some devices! + + - CHECK YOUR ACTUAL DEVICE ADDRESS - + +More information on configuring and using I2C on the RPi including how to probe +the I2C bus for device addresses can be found at +https://learn.sparkfun.com/tutorials/raspberry-pi-spi-and-i2c-tutorial#i2c-on-pi + + - PWM BACKLIGHT CONTROL - + +Whilst connected in 4-bit mode or via the PCF8574 IC, the LED backlight can be +wired for control via PWM. Connect the backlight +ve pin to any spare GPIO pin +and configure MMDVM.ini as appropriate. By default, wiringPi pin 21 is +configured.