(C51)中断程序中改变全局变量是否有效

[复制链接]
4926|3
 楼主| mrzhangzf 发表于 2009-1-1 15:47 | 显示全部楼层 |阅读模式

外部中断子程序:
INT0_ISR:
   push a
   push x
   lcall _get_data_interrupt
   pop x
   pop a
   RETI
外部中断子程序调用的函数:

void get_data_interrupt()
{
    GET_DATA_INT_DISABLE;
    P0DATA|=(0x01<<5);
    TEST=1;
    GET_DATA_INT_ENABLE;
    GET_DATA_INT_CLR_FLAG;
    return;
}
主函数:
volatile BYTE  TEST;
void main()
{
    M8C_EnableGInt;
    GET_DATA_INT_ENABLE;
    P0DATA|=(0x01<<5);
    while(1)
{
    if (TEST ==1)
        {
            P0DATA&=~(0x01<<5);
            TEST=0;
        }
}
}
这段程序的目的是:进入中断后把P0.5电平拉高,TEST=1;主程序中判断TEST是否为1,如果为1,把P0.5电平拉低,TEST=0;
问题是:中断后运行结果P0.5电平一直是高的,我可以肯定的是TEST的值在中断函数中确实是被改变为1. 不过回到主函数中这个改变无效了。If中的不会被执行到。
如果我把IF语句去掉,while(1)中只有P0DATA&=~(0x01<<5);这样运行的结果是:进中断的话P0.5输出高电平,出中断后被拉低。说明程序是可以进入中断并且可以退出中断的。
airwill 发表于 2009-1-1 17:22 | 显示全部楼层

看看编译后的汇编代码吧

按理, 位变量处理, 是不会被优化掉的
ayb_ice 发表于 2009-1-1 19:08 | 显示全部楼层

光PUSH就够了吗?

 楼主| mrzhangzf 发表于 2009-1-2 15:17 | 显示全部楼层

什么意思

您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

13

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部