请都各位大神LED0=!LED0的问题

2019-08-17 06:31发布

首先在外部中断里有这样一个中断服函数,而且是可以正常工作的。
void EXTI0_IRQHandler(void)
{
    delay_ms(10);    //消抖
    if(WK_UP==1)
    {      
        LED0=!LED0;
        LED1=!LED1;   
    }
    EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位
}
和这个LED0相关的定义如下,是一个宏定义
#define LED0 PAout(8)    // PA8  
其它相关宏定义如下:
//确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

那我的问题来了,LED0是一个宏定义,也不是变量。怎么对一个宏定义取反。最后我们类函数宏展开,那也应该是得到GPIOA_ODR第8个位ODR8 的值为0或者为1,我们可以!0或者!1,也可以#define LED0 0然后!LED0,但是LED0=!LED0就说语法上不通了。小弟不明白,就算#define LED0 PAout(8),最后得到的#define LED0 1难道就可LED0=!LED0了,这个从C语法上来说是说不通的。还是我理解有误???请各位大神指点一下小弟。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
宝庆书生
1楼-- · 2019-08-18 04:38
hh312 发表于 2017-6-20 03:45
宏 在代码编译前就被替换掉,等效于“复制”-“粘贴”操作。一个经典的例子就是

#define A 1+1

嗯,我应该是要对指针部分要加强学习,我想了一下应该是指针做左值和右值的问题 。
宝庆书生
2楼-- · 2019-08-18 05:05
本帖最后由 宝庆书生 于 2017-6-20 12:34 编辑

谢谢各位热心的伙伴
宝庆书生
3楼-- · 2019-08-18 07:01
hh312 发表于 2017-6-20 03:45
宏 在代码编译前就被替换掉,等效于“复制”-“粘贴”操作。一个经典的例子就是

#define A 1+1

嗯,非常感谢,我得巩固一下基本功才行。好好学习C先。
宝庆书生
4楼-- · 2019-08-18 10:43
 精彩回答 2  元偷偷看……

一周热门 更多>