AVR 端口宏定义技巧

如何用宏实现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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值