初级会员
积分 97
金钱 97
注册时间 2018-2-12
在线时间 23 小时
5 金钱
起初是用P3.2的下降沿来反转P1的电平,发现无效。
然后调试一番后发现,中断函数中确实能访问到全局变量,但是改动只在中断服务的函数内有效,中断结束后一旦返回主函数,全局变量的数值又变回了中断发生前的值。
然后查了一些资料,发现是因为编译器优化导致中断服务函数访问到的全局变量是内存中的实际变量在寄存器中的一个副本,中断服务如果想在中断中改变全局变量的值并且使其影响到主函数,要在变量定义时使用 volatile 关键字来声明这是一个随时可能变化的函数,是编译器不对该变量做优化而保证每次使用该变量时都从实际内存地址中重新读取该变量。
然而我在修改代码后,运行结果仍然没有什么区别,中断服务中改变的全局变量仍然无法影响到主函数。
以下是代码:
//////////////////////////////////////////////////////////
#include<REG52.H>
#include<INTRINS.H>
volatile unsigned char status=0;
void isr_int0(void);//中断服务函数
void delay(void);//中断中的防抖延时
int main(void)
{
P1=0x00;
EX0=1;
IT0=1;
EA=1;
while(1)
{
if(status) P1=0x00;
else P1=0xFF;
}
}
void isr_int0(void) interrupt 0
{
status=!status;
delay();
}
void delay(void)
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 103;
k = 147;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//////////////////////////////////////////////////////////
跪求大神
我来回答