keil c51中如何在中断中改变全局变量的值?
我定义了一个全局变量speed,希望每次计数器中断后该值能增加1,然后我要将增加后的speed用在主函数中,作为另一个函数的实参传递,可是我发现主函数中的这个speed却...
我定义了一个全局变量speed,希望每次计数器中断后该值能增加1,然后我要将增加后的speed用在主函数中,作为另一个函数的实参传递,可是我发现主函数中的这个speed却在中断后不会改变。
void INTERRUPT_T0(void) interrupt 1
{
TH0=0xff;
TL0=0xff;
f(!KEY)
{
delay1ms(10);
if(!KEY)
{
speed++;
if(speed==6)
speed=0;
}
while(!KEY);
}
} 展开
void INTERRUPT_T0(void) interrupt 1
{
TH0=0xff;
TL0=0xff;
f(!KEY)
{
delay1ms(10);
if(!KEY)
{
speed++;
if(speed==6)
speed=0;
}
while(!KEY);
}
} 展开
展开全部
常规来说这是肯定会变化的 这个问题你首先检查一下是否进入中断 中断中speed的值是否发生变化 主函数中有没有语句对speed这个变量产生影响 逻辑是否正确
更多追问追答
追问
主程序中是这样的:
void main(void)
{
while(1)
display(0,speed);
}
其中display(0,speed);是一个数码管显示函数,speed是数码管段码值数组的索引,本想每次中断后显示数字加1(0-5变化),可是调试发现一直处于0的状态。
追答
你定时器都没初始化么 怎么进定时器中断 还有进中断扫描按键 除非你一直把键按着
展开全部
你在定时器里边还要检测键盘,这个恐怕思路是有问题的,但是硬来得花也是行。我猜想你的意思可能是,定时时间到,并且键按下就speed+1,那么你的while()的位置恐怕不对,或者前面的do没有显示出来???你就在中断函数里使劲循环,检测到后speed+1, 再break就OK了。具体实现就不写了,因为不知道你是要检测键盘按下还是没有按下。。。。。
追问
while()后面有“;”所以不会一直循环。至于在计数器中断检测按键,我以前做过,其实你想按键的时间检测很短,根据封装的初值,原本是按下按键后才会溢出,发生中断,但是这样写就相当于已经按下了里面在继续检测,时间也就是几十毫秒的问题,我就是通过这样来做计数器中断时的按键去抖的。我是想问:在中断中改变了speed,那么main()中的speed会不会被改变?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2017-12-17
展开全部
是的 我也纠结过这个问题。
在定时器中断中, 读取全局好像问题不大, 但是写入会出现不可预料的结果。
而且,即使加上 volatile 也没有效果。
奇诡的是, 在串口中断中, 全局变量读写都很好。
在定时器中断中, 读取全局好像问题不大, 但是写入会出现不可预料的结果。
而且,即使加上 volatile 也没有效果。
奇诡的是, 在串口中断中, 全局变量读写都很好。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对不起,这个我真不知道
追问
?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询