打印

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

[复制链接]
4099|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

粉丝