I'm in the planning stage of making a display board. The plan is to have a series of 14-segment displays for text and numerical output. The finished product will be somewhere between 4x4 or 6x6 digits. Just FYI, each pair of digits will be on a custom 10cm x 10cm pcb, daisy-chained together (ie, each digit will be about 5cm wide x 8cm high consisting of strategically placed LEDs on said pcb with "dividers" to make the 14 segments).
The rows will be daisy chained together, with shift registers controlling each digit. My question is how to interconnect the rows of digits (see diagram). Modularity is important - adding rows or columns should not be too hard. I was wondering if there was such a thing as an I2C bus switch. That way, each row could have a different I2C address, reducing the number of wires down to the MCU. I have not come across such a device yet. Or maybe there's another way I have not thought of.
Looking forward to any suggestions you may have. I'm OK with smd devices.
Yes you can use an analogue multiplexer to switch the clock and data lines to generate more I2C busses allowing a device with the same address to operate on the same bus.
Well, you are going to need buffers - but 74HC14s will perform that function for a reasonable fan-out. Note that inverting buffers are just fine as you can pre-invert the control lines for the whole apparatus.
What you need is not an analog multiplexer (which would introduce a 60 Ohm series resistance as well as requiring a pull-up to hold the non-selected outputs) but a gate - just a NAND or NOR - controlling the individual latch lines only - the clock and data do not matter unless the latch is selected.
This gate can be controlled by an I2C spill-out such as a PCF8574 and for some degree of wiring simplicity, you can omit the gate and drive the latch itself from the PCF8574 so you only need to distribute SDA, SCL, Data and Clock. So you select your row by I2C, shift out the data and latch it again using the I2C.
Alternately, you could just use another shift register in each row with the latch for that row enabled by one of the eight shift register outputs. Ripple the selected row latch bit into the registers, latch that (column) to enable the row latch line, ripple in all the data plus the clear for the previously selected row latch (which may also enable the next row) and latch it to actually latch all the row data.
Paul__B:
This gate can be controlled by an I2C spill-out such as a PCF8574 and for some degree of wiring simplicity, you can omit the gate and drive the latch itself from the PCF8574 so you only need to distribute SDA, SCL, Data and Clock. So you select your row by I2C, shift out the data and latch it again using the I2C.
I like that idea. It is what I was hoping for (each row I2C addressable), but I just could not see the simplicity. I will just use jumpers for setting the address for each row.
Here's the revised block diagram:
There are definitely limits to how many such displays you can connect to a single bus: things such as stray capacitance of the clock and data lines will become a problem if you have too many connected, especially if lines get long as well. There are also technical limits on how many of such displays can be handled such as data upload rates and processor memory.
A possibly cheaper/easier option would be to use a single PCF8574 (for 8 outputs), and bring the LE line of each module to your main board as well. Or a PCF8575, then you can connect 16 such modules to a single Arduino. It's also likely to be easier to detect whether there's something on an output or not instead of having to do an I2C scan.