/** * pinMode * * Config pin mode * * @param pin pin number * @param mode pin mode */ void pinMode(uint8_t pin, uint8_t mode) { uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile uint8_t *dir = portDirRegister(port); volatile uint8_t *ren = portRenRegister(port); volatile uint8_t *out = portOutputRegister(port); volatile uint8_t *sel = portSelRegister(port); *sel &= ~bit; // Unselect alternate function switch(mode) { case INPUT: *dir &= ~bit; break; case INPUT_PULLUP: *dir &= ~bit; *out |= bit; *ren |= bit; break; case INPUT_PULLDOWN: *dir &= ~bit; *out &= ~bit; *ren |= bit; break; case OUTPUT: *dir |= bit; break; default: break; } }
void pinMode(uint8_t pin, uint8_t mode) { uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile uint16_t *dir; volatile uint16_t *ren; volatile uint16_t *out; if (port == NOT_A_PORT) return; dir = portDirRegister(port); ren = portRenRegister(port); out = portOutputRegister(port); if (mode == INPUT) { *dir &= ~bit; } else if (mode == INPUT_PULLUP) { *dir &= ~bit; *out |= bit; *ren |= bit; } else if (mode == INPUT_PULLDOWN) { *dir &= ~bit; *out &= ~bit; *ren |= bit; } else { *dir |= bit; } }
TouchPin::TouchPin(uint8_t pin, int16_t threshold ){ // select given pin as a capacitive touch pin _bit = digitalPinToBitMask(pin); _port = digitalPinToPort(pin); volatile uint16_t *reg = portSelRegister(_port); *reg &= ~_bit; //reset portselect bit reg = portSel2Register(_port); *reg &= ~_bit; //reset portselect2 bit reg = portDirRegister(_port); *reg &= ~_bit; //set port as input reg = portRenRegister(_port); *reg |= _bit; //enable pullup register when port is input _threshold = threshold; }