如何用宏实现AVR的端口IO可移植性,下面给出一个网上的一个思路:
#define MCP2515_CS B,4
#define MCP2515_INT B,2
#define RESET(x) //!< Einzelnes Bit eines bestimmten Ports setzen
#define SET(x) //!< Bit löschen
#define TOGGLE(x) //!< Bit umschalten
#define SET_OUTPUT(x) //!< Einzeles Bit ein Port als Ausgang schalten
#define SET_INPUT(x) //!< Bit als Eingang schalten
#define SET_PULLUP(x) //!< aktiviert den Pullup eines Pins (nur falls dieser als Eingang geschaltet ist)
#define SET_INPUT_WITH_PULLUP(x) //!< Set den Pin als Eingang mit akiviertem Pullup
#define IS_SET(x) //!< Zustand eines Eingangs abfragen
#else /* !DOXYGEN */
/* Warum hier zum Teil so seltsame Konstrukte notwendig sind wird zum Beispiel
* in http://www.mikrocontroller.net/forum/read-1-324854.html#324980 erklärt.
*/
#define PORT(x) _port2(x)
#define DDR(x) _ddr2(x)
#define PIN(x) _pin2(x)
#define REG(x) _reg(x)
#define PIN_NUM(x) _pin_num(x)
#define RESET(x) RESET2(x)
#define SET(x) SET2(x)
#define TOGGLE(x) TOGGLE2(x)
#define SET_OUTPUT(x) SET_OUTPUT2(x)
#define SET_INPUT(x) SET_INPUT2(x)
#define SET_PULLUP(x) SET2(x)
#define IS_SET(x) IS_SET2(x)
#define SET_INPUT_WITH_PULLUP(x) SET_INPUT_WITH_PULLUP2(x)
#define _port2(x) PORT ## x
#define _ddr2(x) DDR ## x
#define _pin2(x) PIN ## x
#define _reg(x,y) x
#define _pin_num(x,y) y
#define RESET2(x,y) PORT(x) &= ~(1<<y)
#define SET2(x,y) PORT(x) |= (1<<y)
#define TOGGLE2(x,y) PORT(x) ^= (1<<y)
#define SET_OUTPUT2(x,y) DDR(x) |= (1<<y)
#define SET_INPUT2(x,y) DDR(x) &= ~(1<<y)
#define SET_INPUT_WITH_PULLUP2(x,y) SET_INPUT2(x,y);SET2(x,y)
#define IS_SET2(x,y) ((PIN(x) & (1<<y)) != 0)