c51中为什么不能在主函数中改变.c文件中的变量

模块文件

int a=0
void abc(void)
{
    while(a)
    {
         ...
    }
}

主函数

if(command==0x0f)
{
    a=~a
    if(a)
    {
        abc()
    }
}

command是接收的红外遥控的指令
变量a是模块文件中的变量在.h文件中用extern声明了
在第一次接收到红外后能正常到模块文件中,再次按下遥控器没有反应,是不是卡在了abc函数中的循环里了?我原本想到达按下遥控器变量a取反为1,运行函数abc 再次按下遥控器变量a取反为0那么abc函数中的while循环判断就不成立了
为什么红外遥控不能再次改变变量a的值从而影响函数中的循环?

你这代码问题很多
1.单片机是单线程的,进入死循环之后,a的值就再也不会变了,除非给a赋值是在中断程序里
2.应该写a=!a,或者a=1-a,~a是按位取反,0会变-1,1会变-2

除了上面说的,还有一点很多人没有注意到的, 在中断里改变的全局变量,定义和声明的时候都要加上volatile

while(1)无限循环,while(0)是一次都不执行。