terom@8: #ifndef QMSK_SWITCH_H terom@8: #define QMSK_SWITCH_H terom@8: terom@8: #include "stdlib.h" terom@8: terom@8: extern byte switch_mask; terom@8: terom@8: /* terom@8: * Setup switch input triggering on SWITCH_DDR/PORT/PIN using SWITCH_PCMSK/PCIE/PCIF interrupts. terom@8: */ terom@8: void switch_init (void) terom@8: { terom@8: switch_mask = SWITCH_MASK; terom@8: terom@8: // input mode terom@8: byte bit = 1; terom@8: terom@8: for (byte i = 0; i < 8; i++) { terom@8: if (SWITCH_MASK & bit) { terom@8: cbi(SWITCH_DDR, i); terom@8: terom@8: // pull-up terom@8: sbi(SWITCH_PORT, i); terom@8: } terom@8: terom@8: bit <<= 1; terom@8: } terom@8: terom@8: // interrupt mask for port terom@8: *SWITCH_PCMSK = SWITCH_MASK; terom@8: terom@8: // enable interrupts terom@8: sbi(&PCICR, SWITCH_PCIE); terom@8: } terom@8: terom@8: /* terom@8: * Update switch state if changed. terom@8: * terom@8: * Returns 1 if changed, 0 if no changes. terom@8: * terom@8: * TODO: debouncing terom@8: */ terom@8: byte switch_read (byte *sp); terom@8: terom@8: #endif