@grumpy_mike: I did not mean "should" in the sense of general advocacy. In fact I prefer active low to take advantage of the internal pull ups. I meant "should" as in works with his specific sketch.
For the general reader, here is an active low, debounced, mono-stable emulates bi-stable, 3 button routine. It should be polled. For simplicity in the debounce logic, it only registers one button at a time (easy to fix if you need different behavior):
// Define button handling details
BUTTON0_PIN = 2, // The Arduino digital pins that the button is connected to.
BUTTON1_PIN = 8,
BUTTON2_PIN = 9,
byte buttonState=0; // Button state ends up in here (1 = on, 0 = off)
val = digitalRead(BUTTON0_PIN);
val |= digitalRead(BUTTON1_PIN) << 1;
val |= digitalRead(BUTTON2_PIN) << 2;
// Bistable logic
val = (~val) & 7; // buttons are active-low (pressed = 0)
if ((!val)&&(debounce)) // After it is let go, we wait
if (val && !debounce) // Ok pressed and not debouncing
buttonState ^= val;
debounce = 20; // How long to debounce. The exact time depends on how often you call this routine; 20 is good if you call it every millisec or so.
ButtonOn(1); // You implement to do what you want when the switch is "on".
else ButtonOff(1); // You implement to do what you want when the switch is "off".