Connect an analog joystick to an Arduino. Read two analog values (x- and y-position) and a switch using a method witch does not hog the processor during the whole ADConversion.
The capacitor reduces digital noise on the analog readings.

Code
static const byte ADC_CHANNEL_JOYSTICK_X = 0;
static const byte ADC_CHANNEL_JOYSTICK_Y = 1;
static const byte ADC_CHANNEL_MAX = 2;
byte adc_channel = 0;
bool joystick_button = 0; // 1 or 0
uint16_t joystick_x = 0; // 0~1023
uint16_t joystick_y = 0; // 0~1023
void setup() {
Serial.begin(115200); // Remove
pinMode(A0, INPUT); // Analog pin A0
pinMode(A1, INPUT); // Analog pin A1
pinMode(2, INPUT_PULLUP); // Digital pin 2
// Setup adc
ADCSRA |= 1 << ADEN; // Enable ADC, with no interrupt!
ADCSRA |= ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)); // Main clock / 128
ADMUX = adc_channel; // Channel
ADMUX |= 1 << REFS0; // Aref pin -> 100nF -> gnd
ADCSRA |= 1 << ADSC; // Start first conversion
}
void loop() {
byte changed = 0;
// Analog
if ((ADCSRA & (1 << ADSC)) == 0) { // ADC done
changed += read_analog();
}
// Digital
changed += read_digital();
// Tmp
if(changed > 0) {
Serial.print("x: ");
Serial.println(joystick_x);
Serial.print("y: ");
Serial.println(joystick_y);
Serial.print("button: ");
Serial.println(joystick_button);
Serial.println();
}
delay(100); // Remove
}
byte read_digital() {
byte state = 0;
byte val = !(bool)(PIND & 0b00000100); // PORT IN D, pin nr 2
if(val != joystick_button) {
state = 1;
joystick_button = val;
}
return state;
}
byte read_analog()
{
byte state = 0;
uint16_t val = ADC; // ADC is the full 10-bit, two-register, value from the last ADConversion
switch(adc_channel) {
case ADC_CHANNEL_JOYSTICK_X:
if(joystick_x != val) {
state = 1;
joystick_x = val;
}
break;
case ADC_CHANNEL_JOYSTICK_Y:
if(joystick_y != val) {
state = 1;
joystick_y = val;
}
break;
}
adc_channel++;
if(adc_channel >= ADC_CHANNEL_MAX) adc_channel = 0;
ADMUX = adc_channel; // Channel
ADMUX |= 1 << REFS0; // Aref pin -> 100nF -> gnd
ADCSRA |= 1 << ADSC; // Start next conversion
return state;
}