Advertisement
Guest User

Untitled

a guest
Dec 8th, 2009
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1.  
  2. #ifndef PIN_TRAITS_H
  3. #define PIN_TRAITS_H
  4.  
  5. #include <stdint.h>
  6.  
  7. #define __digital_high(L, N) PORT ## L |= _BV(N);
  8. #define __digital_low(L, N) PORT ## L &= ~_BV(N);
  9.  
  10. template <uint8_t Pin> class pin_traits;
  11.  
  12. #define PIN_TRAITS_GENERATOR(L, N, P)       \
  13. template <> class pin_traits<P>             \
  14. {                                           \
  15.   public:                                   \
  16.   static void digital_write(boolean state)  \
  17.   {                                         \
  18.     if (state == HIGH)                      \
  19.       __digital_high(L, N)                  \
  20.     else                                    \
  21.       __digital_low(L, N)                   \
  22.   }                                         \
  23. };
  24.  
  25. // Digital pins 0 - 7 are part of the D group
  26. PIN_TRAITS_GENERATOR(D, 0, 0)
  27. PIN_TRAITS_GENERATOR(D, 1, 1)
  28. PIN_TRAITS_GENERATOR(D, 2, 2)
  29. PIN_TRAITS_GENERATOR(D, 3, 3)
  30. PIN_TRAITS_GENERATOR(D, 4, 4)
  31. PIN_TRAITS_GENERATOR(D, 5, 5)
  32. PIN_TRAITS_GENERATOR(D, 6, 6)
  33. PIN_TRAITS_GENERATOR(D, 7, 7)
  34.  
  35. // Digital pins 8 - 13 are part of the B group
  36. PIN_TRAITS_GENERATOR(B, 0, 8)
  37. PIN_TRAITS_GENERATOR(B, 1, 9)
  38. PIN_TRAITS_GENERATOR(B, 2, 10)
  39. PIN_TRAITS_GENERATOR(B, 3, 11)
  40. PIN_TRAITS_GENERATOR(B, 4, 12)
  41. PIN_TRAITS_GENERATOR(B, 5, 13)
  42.  
  43. #undef PIN_TRAITS_GENERATOR
  44.  
  45. #endif /* PIN_TRAITS_H */
  46.  
  47. template <uint8_t N>
  48. inline void digital_write(boolean state)
  49. {
  50.   pin_traits<N>::digital_write(state);
  51. }
  52.  
  53. void setup()
  54. {
  55.   pinMode(12, OUTPUT);
  56. }
  57.  
  58. void loop()
  59. {
  60.   digital_write<12>(HIGH);
  61.   delay(500);
  62.   digital_write<12>(LOW);
  63.   delay(500);
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement