pincontrol.h 859 B

12345678910111213141516171819202122232425262728293031323334353637
  1. #pragma once
  2. // Some helpers for controlling gpio pins
  3. #include <avr/io.h>
  4. enum {
  5. PinDirectionInput = 0,
  6. PinDirectionOutput = 1,
  7. PinLevelHigh = 1,
  8. PinLevelLow = 0,
  9. };
  10. // ex: pinMode(B0, PinDirectionOutput);
  11. static inline void pinMode(uint8_t pin, int mode) {
  12. uint8_t bv = _BV(pin & 0xf);
  13. if (mode == PinDirectionOutput) {
  14. _SFR_IO8((pin >> 4) + 1) |= bv;
  15. } else {
  16. _SFR_IO8((pin >> 4) + 1) &= ~bv;
  17. _SFR_IO8((pin >> 4) + 2) &= ~bv;
  18. }
  19. }
  20. // ex: digitalWrite(B0, PinLevelHigh);
  21. static inline void digitalWrite(uint8_t pin, int mode) {
  22. uint8_t bv = _BV(pin & 0xf);
  23. if (mode == PinLevelHigh) {
  24. _SFR_IO8((pin >> 4) + 2) |= bv;
  25. } else {
  26. _SFR_IO8((pin >> 4) + 2) &= ~bv;
  27. }
  28. }
  29. // Return true if the pin is HIGH
  30. // digitalRead(B0)
  31. static inline bool digitalRead(uint8_t pin) {
  32. return _SFR_IO8(pin >> 4) & _BV(pin & 0xf);
  33. }