So last night I spent a little time soldering up some of the boards I had made, and writing some nasty code to run them, and did this.
The buttons and LEDs are all individually readable / writeable. Pressing a button turns an LED off / on. Not the LED for the button itself, since the position of the buttons and LEDs don't directly correlate, and for simplicity, I'm treating them like they do for now. Some other LED. By random chance, pressing the "Spin Up" button, turns the correct LED on and off.
This is the circuit board I am using to drive the LEDs and switches. One for each, the only difference is that when being used switches, all the diode spots would be occupied. With the LEDs I solder jumper wires across the diode position. I did design it with the intention that you could just bridge the jumper pads you can see in the middle, but they are a little too far apart.
The purpose of these boards is to save me a TON of point to point wiring. Normally, when you drive an LED or switch, you have one wire going to power or ground, and the other going to an input / output pin. Since I am using a matrix (two actually) to cut down on the number of pins required, each switch or pin is wired to two input / out pins. It's also connected to up to 15 other LEDs or switches.
That makes for a lot of long strands that are hard to debug, and difficult to change and move things around without a lot of work. So all that inter-connectivity happens on the board. I hook 9 input / output pins up to the header on the left, and 16 LEDs or switches around the edges. Adding another board only uses 1 more input / output pins, since 8 of the pins are shared between boards.
So having this board allows me to go back to the simplicity of having each LED or button connect to a single point. And using pin headers and dupont connectors, allows for ease of connection / disconnection. So I can move things around to my hearts content.... as long as I am prepared to wait several hours while a new panel prints.
There is another board I have had made that handles the connections between boards (I'm waiting on the right pin headers before I solder one of those up). It takes 16 input / output pins, and breaks them out into connections for 8 of the original boards. To connect the boards I will be using ribbon cables with 10 pin IDC connectors, which are easy to make to any length required.
I had great fun making this all work. Turns out that while I had been quite careful about polarity when wiring up the LEDs, I had not be so careful about the orientation of the header I added. I had to go through the test all the LEDs to find the ones where the headers were backwards.
After that, getting the buttons to work was particularly fun. I couldn't get them to read at all, but with manual probing of the board I could see a response. It took me a long time, much longer than it should have, to realize that I had failed to add the diodes to the board. Without the diodes, the switches may as well not even be connected. After soldering on the diodes, things got much better.
One small problem remains. Holding down a button connected to the forward matrix, prevents the backwards matrix from being read. Which is very strange, since the diodes are there to prevent clashes like that. Especially since it's not ghosting the keys (giving a false positive read), it's just blocking the read somehow. I'm going to have to think about that for a little while.
So at the moment, turning the ignition key to the on position, makes half the other buttons stop working. Fun times.