#include #include extern const char shift_table[]; #define pin_dir_port_(pin) ((volatile uint8_t * const)(((pin) >= 8 ) ? P2DIR_ : P1DIR_)) #define pin_in_port_(pin) ((volatile uint8_t * const)(((pin) >= 8) ? P2IN_ : P1IN_)) #define pin_out_port_(pin) ((volatile uint8_t * const)(((pin) >= 8) ? P2OUT_ : P1OUT_)) #define pin_bit_mask_(pin) (shift_table[(pin) & 0x07]) template class Pin { protected: volatile uint8_t * const dir_port; volatile uint8_t * const in_port; volatile uint8_t * const out_port; const char pin_mask; public: Pin() : dir_port(pin_dir_port_(pin)), in_port(pin_in_port_(pin)), out_port(pin_out_port_(pin)), pin_mask(pin_bit_mask_(pin)) { } }; template class Output : protected Pin { public: Output() { *pin_dir_port_(pin) |= pin_bit_mask_(pin); } void on(); void off(); }; template inline void Output::on() { *pin_out_port_(pin) |= pin_bit_mask_(pin); } template inline void Output::off() { *pin_out_port_(pin) &= (uint8_t)~pin_bit_mask_(pin); } class Time { public: static void sleep(int ms); }; void Time::sleep(int ms) { for (; ms >= 0; ms--) __delay_cycles(1000); }