Found in the scrap boxes a few 2x16 text LCDs and many KM555TM2 (
74LS74).
The HD44780 controller of the LCD will need at least 4 data bits, an RS and an Enable pin, so a total of 6 microcontroller pins. This is also the minimum number of DO pins the LiquidCrystal library (from Arduino) will use.
LCD pinout
The number of DO pins can be reduced to only a CLK and a DATA pin, if a shift register is used. Even so, an Enable would still be needed if we are to obey the HD44780 requirements for data hold timing. The nice part is shift registers here are shifting on the raising edge of CLK. That makes possible a trick where two shift registers can be independently controlled with the same 2 pins, by swapping the DATA and CLK for the second shift register.
2-wire to 6-wire shift registers schematic with 74LS74 D-type flip-flops
First, the RS bit and the 4 data bits D7..D4 are pushed in a 5 bits shift register implemented with 5 D-type flip-flps (FF) from the 74LS74 chips. Then, the 6th FF is used to pulse the Enable pin of the HD44780 controller, while the other 5 bits are kept without shifting. It is possible to do so if DATA line is used as a clock for the 6th FF.
The existing 'LiquidCristal' Arduino library was modified to use only two Arduino pins instead of six, so to keep backward compatibility with already existing Arduino code and examples that are using the current LiquidCrystal library. The modified files were renamed to 'TwoWireHD44780_LCD'. Tested on Ubuntu 22.04, with Arduino IDE 2.0.3 AppImage and an Arduino Nano board.
Breadboard circuit and TwoWireHD44780_LCD library test
The modified library can be packed as a standalone Arduino lib, if the original LiquidCrystal.h and LiquidCrystal.cpp are replaced by 'TwoWireHD44780_LCD.h' and 'TwoWireHD44780_LCD.cpp'. The easy way is to copy the TwoWireHD44780_LCD header and C++ files in the same directory with the main ino sketch, as they are in the attached code example.