The micro can do the muxing. Hunt around in this thread and you find a place where I explained the idea of the code that does it. You still need at least 8 port bits to do the 16 switches.
If you are willing to use douple pole switches, you can do a bit better:
1 means connected to the switch 0 means not connectedsw connections no R0-C0 R1-C0 R2-C0 R0-C1 R1-C1 R2-C1
1 0 0 0 0 1 1 2 0 0 0 1 0 1 3 0 0 1 0 0 1 4 0 1 0 0 0 1 5 1 0 0 0 0 1 6 0 0 0 1 1 0 7 0 0 1 0 1 0 8 0 1 0 0 1 0 9 1 0 0 0 1 0 10 0 0 1 1 0 0 11 0 1 0 1 0 0 12 1 0 0 1 0 0 13 0 1 1 0 0 0 14 1 0 1 0 0 0 15 1 1 0 0 0 0This give 15 switches on only 5 port bits.