|
前几天我看见有人在帖子上发表了一片,关于AVR单片机IO的新定义,可以利用一下程序进行初始化:
#ifndef __always_inline__
#define __always_inline__ #Pragma("inline=forced") inline
#endif
#define AVR_GPIO_ASSIGN(name, port, bit) \
__always_inline__ static void GPIO_##name##_Set(void) {PORT##port |= (1 << bit);}\
__always_inline__ static void GPIO_##name##_Clr(void) {PORT##port &= ~(1 << bit);}\
__always_inline__ static void GPIO_##name##_Toggle(void) {PORT##port ^= (1 << bit);}\
__always_inline__ static uchar GPIO_##name##_Read(void) {return (PIN##port & (1 << bit)) != 0;}\
__always_inline__ static uchar GPIO_##name##_DdrRead(void) {return (DDR##port & (1 << bit)) != 0;}\
__always_inline__ static void GPIO_##name##_MakeOut(uint8 x) {(x)?(PORT##port |= (1 << bit)):(PORT##port &= ~(1 << bit)); DDR##port |= (1 << bit);}\
__always_inline__ static void GPIO_##name##_MakeIn(uint8 x) {DDR##port &= ~(1 << bit); (x)?(PORT##port |= (1 << bit)):(PORT##port &= ~(1 << bit));}\
__always_inline__ static void GPIO_##name##_MakePullup(void) {GPIO_##name##_MakeIn(1);}
#endif
这样的话,在函数中,如果调用
AVR_GPIO_ASSIGN(LED_1,B,0); //LED_1-------PORTB0
AVR_GPIO_ASSIGN(LED_2,B,1); //LED_2-------PORTB1
AVR_GPIO_ASSIGN(KEY,B,2); //KEY---------PORTB2
那么宏定义里面的数据就可以进行处理了。但是在ICC AVR上报错了。
可以教我怎么做吗 傻孩子,给点力了。
还有就是,现在我用宏定义较多,经常会忘记那些已经宏定义过了。在网上看到可以利用
#pragma message ("text")的语句来提示你是否进行了宏定义提示。
但是在ICC AVR上编译出现没有这个语法的用。所以,
有人可以帮我解释一下吗? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|