The PIC16F684 This 14 pin device, available (eBay, China) for 50p, 'has it all' when it comes to 'sensors' = but the low pin count makes it rather difficult to 'use it all' :-) The first 'trick' (which saves 2 pins) is to use the internal OSC. This is a max. of 8MHz, so CPU is 2 MIPS and OSC is 125nS. The ADC divider would need to be set to /16 giving a Tad of 2uS (which is faster than using the internal R/C Tad of 4uS) and thus a (10 bit) conversion time (11 Tad) of 22uS = 45kHz. Using the DAC Any of eight different i/o pins can be 'sensed' using the 10 bit DAC. If each switch in a keypad switches in a different (total) resistance, a single pin using the DAC could detect 2^10 = 1024 different keys :-) The max. recommended i/p resistance of 10k (which we should be able to stretch a bit for 'static' switches) and accuracy of the resistors will limit the max. resistance 'chain', however it should be quite possible to detect which key of a 4x4 matrix 16 key keypad is pressed, something that would normally 'require' 8 i/o lines ! The same applies to 'configuration' switch bits. However here multiple switches could be open or closed so each switch must 'add' half the resistance of the previous. So long as all possible switch configurations lead to 'unique' total resistance value, the switch 'bit pattern' can be read (more or less directly) off the MSB's of the DAC ! Accuracy of the resistors in the chain limits the number of 'bits' that can be accurately sensed. A 1% 10k 'top' resistor means the 'bottom' resistor has to contribute a value that is greater than 1% * 10k = 100 ohms so 'halving' would have to stop after 7bits (10, 5, 2.5, 1.25, 625, 312, 156) To improve on this, the contribution of each resistor in the 'ladder' would have to be 'measured' in advance and the actual values programmed (or stored e.g. using the EEPROM) in the PIC. Using the comparators If the DAC is unavailable, the PIC16F684 contains 2 comparators which in one mode (CM '010') can be used to compare the voltage on either one of 2 pairs of i/o pins against an internal (32 step) reference (CVref). By performing compares and switching the internal Vref, it is possible to perform a software controlled 'successive approximation' A-D. Although changing the Vref can take up to 10uS, the comparators can be used to detect up to 32 different voltage levels and thus the state of multiple switches or keuys on a keypad. The same trick can be used to sense the 'bit patturn' voltage set by a bank of up to 4 switches (assuming each switch is a factor 2 resistance different from the last) on a single pin. Digital input as 'comparator' To 'read' a '1', the voltage on an i/o pin has to cross the threshold. If that pin is connected to a R-C network, measuring the time taken to charge up the capacitor, from 'zero' to the 'threshold' voltage, means it's possible to infer the value of R. So we wire a set of the keys/switches to Vcc via a 'chain resistor' network and a common capacitor. When a key is pressed, the capacitor starts to charge up. By measuring the 'time taken to cross the threshold' it's possible to work out which key is pressed (so long as only one key is pressed and the 'sense' time is 'fast' compared to the key press time) or which patturn of switches are closed. The 'sense' pin is used to discharge the capacitor and hold it at 'Lo' thus ensuring a known 'starting' voltage. The timing is started when the 'sense' pin is switched back from output 'Lo' to input mode. The 'chain resistor' network and capacitor values have to be chosen to ensure the 'charge up step time' is long enough to be detected (i.e. multiples of OSC) but short enough for 'human input' (100mS) NB. don't forget that a series resistor will be needed to limit the discharge current at the end of a sense cycle (when the pin is enabled as output '0' again) Trinary logic output In 'digital' mode, the i/o pins actually have 3 states = Hi ('1'), Lo ('0) and 'off' (tristate). This can be used to output data in 'trinary' (as opposed to binary) logic = and the 'state count' multiplies up very quickly. Pins in 'binary' mode define 2^n states, so 4 pins = 2^4 i.e. 16 states. In 'trinary' mode the equation is 3^n, so 4 pins = 3^4 i.e. 81 states, and for 16 staes you only need 3 pins (3^3 actually gives you 27 states, so you could use 2bits in 'trinary' mode (9) plus 1bit in binary) Using a single pin as both input and output The next trick is to use an i/o pin as both an input and an output, although an external diode (or pull-up) may be required to do so. Double up the 'serial transmission' pins Since 3 (or 4) pins will be needed to support 'serial transmission', finding ways to 'double use' these pins is a priority. At the very least, it should be possible to use one of the pins as the 'activity LED' driver line