As with any embedded project, there is a trade-off that has to be made between how much of the I/O gets used for the project and how much gets used for display and control(Human Device Interface or HDI). This is especially true of Arduinos and their clones.
There are boards that have more than the normal number of I/O pins but as we all know the complexity of any system will grow to exceed its capabilities. By limiting HDI features to the fewest number of connections as possible one forestalls this inevitable problem.
Therefore, I have chose to create a standard HDI for my projects consisting of an I2C based display like the ones from Newhaven Displays, (http://www.newhavendisplay.com/index.php?main_page=index&cPath=253&zenid=c31r6gbbpv5sa9avs57tdp6an2) , and the Phillips PCF8574AP (http://www.nxp.com/documents/data_sheet/PCF8574.pdf)
I have already posted on FEZZER the device driver for the Newhaven displays (http://www.fezzer.com/project/222/update-to-the-newhaven-display-serial-lcd-display/) and one for the Sparkfun MPR121 Capacitive Keypad (http://www.fezzer.com/project/245/sparkfun-mpr121-capacitive-keypad-driver/). I will be shortly posting a driver for a 4x4 Keypad decoder with interrupt service.
The PCF8574 takes advantage of a modified version of the I2C Execute Expansion( also on FEZZER posted by Bec A Fuel, I added “thread safe” to my version.) Thus it can co-exist with other I2C devices on the same bus. My resulting HDI also uses the I2C extension to ensure that my display is also save to use on the same bus.