程序为定时器的基本操作,
所有的c程序都是从main开始执行的,你的程序从main进入后,执行
“
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TMOD=0x01;
ET0=0x01;
EA=1;
TR0=1;
”
这些初始化定时器0
然后反复执行while语句。
While(1)
{
If(i>7) i=0;
}
等待定时器到达产生中断
Void Timer0IRQ(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
P2=1<i++;
}
定时器的 中断
就是 没到时间,i加一
然后将第p2口第i个引脚置位高电平,其他的为低电平
如果p2口连接发光二极管的话,就是循环点亮
到第八个时,再返回第一个。
基本上是这个吧步骤。
因为 i是全局变脸,所以中断时i=8时,主程序中直接把i置为0了,就是While(1)
{
If(i>7) i=0;
}
这句。
中断时,while语句是不执行的,
但是中断返回后,就会执行while语句,
所以i不会大于8 的。
先在中断中i加到8,
然后中断返回时,主程序中。立刻把i归零。
你觉得中断中,P2会为0x00吗?即i=9??
i的累加是在中断中实现的,中断的是时候,i才累加。
设i=7进入中断,此时,P2=1<<7,即P2=0x80。之后i再加1,即i=8。中断结束,返回主函数while内,If(i>7) i=0;,此时,i=0.
……
不用我多解释了吧?
在main中断时while还在执行吗?对于这个问题,我想你没用汇编编过……
while是个死循环,一直在判断if这条语句,中断到来的时候,立即进去中断,while不执行了,等中断响应完毕,又立即回到while中去。
你可以看看汇编是怎么push和pop的,看完你就明白了。