void processAddressButtons() { boolean curAddrUp = 0; boolean curAddrDown = 0; boolean curAddrFast = 0; // Get the active high current button state if (digitalRead(ADDR_UP_BUTTON) == LOW) { curAddrUp = 1; } if (digitalRead(ADDR_DOWN_BUTTON) == LOW) { curAddrDown = 1; } if (digitalRead(ADDR_FAST_BUTTON) == LOW) { curAddrFast = 1; } // Process AddrUp AddrUpPressed = curAddrUp & prevAddrUp & ~AddrUpDown; AddrUpDown = curAddrUp & prevAddrUp; prevAddrUp = curAddrUp; // Process AddrDown AddrDownPressed = curAddrDown & prevAddrDown & ~AddrDownDown; AddrDownDown = curAddrDown & prevAddrDown; prevAddrDown = curAddrDown; // Process AddrFast (we don't need the "just pressed" detection here) AddrFastDown = curAddrFast & prevAddrFast; prevAddrFast = curAddrFast; // Pressing both AddrUp and AddrDown resets us to 1 if (AddrUpDown & AddrDownDown) { dmxaddress = 1+3; } else { // Process AddrUp (either bump it once or every time we execute this routine for fast mode) if (AddrUpPressed || (AddrUpDown & AddrFastDown)) { // AddrUp just pressed IncAddr(); } // Process AddrDown else if (AddrDownPressed || (AddrDownDown & AddrFastDown)) { // AddrDown just pressed DecAddr(); } } } // Inc/Dec Addr routines limit and account for the +3 offset in our dmxaddress variable void IncAddr() { if (dmxaddress < 512+3-7) { dmxaddress++; } } void DecAddr() { if (dmxaddress > 1+3) { dmxaddress--; } }