sassafrassquatch:
I do like your idea of the voltage divider... seems like that would simplify a lot of my input logic.
The idea is to have a analog read circuit with a bunch of switches and resistors. Each switch has a resistor in parallel with its contacts. Once you close the switch, that resistance is removed. Every resistor should have a different resistance, and with the right analog setup you should be able to read multiple switches being used singularly or even in parallel (think of it like bits being toggled in a byte).
You need to have enough 'difference' for the resistance read so that the 10 bit ADC in the Atmel can reliably pick it up (i.e. you have 1023 steps to play with unless you go to decimation - and I'd stick to being able to pick up the differences with a 10-bit ADC). I'd start off with 10k pull-up resistor, then work out resistances on the other side of the voltage divider to give you the resolution you need while also being readily available (i.e. 100, 220, 470, 1k, 2.2k, 4.7k, 10k, 22k, 47k, 100k, etc.) Note how I staggered the values to allow no overlap even if all 'lower' values have been inactivated / activated.
I'd work it out ahead of time in Excel, especially if you need to allow for multiple keys being pushed at once. But even with this prep-work, I'd field measure the resistances put out by the various combinations and then use Progmem arrays to store the data in a flash (not SRAM) array. Give yourself some latitude re: measurements (i.e. a lower boundary and a upper boundary for each value) and your analog input may also benefit from a small cap (0.1uF) to GND to steady things a bit and remove EMI spikes.