0x00 問題程式碼
void int0_isr(void) interrupt 0
{
num++;
if (num%2 == 1)
{
uint k;
for(k=0;k<3;k++)
{
P1=0x0f;
delay(500);
P1=0xf0;
delay(500);
}
}
else if (num%2 == 0)
{
uint m;
uint n;
temp=0xfe;
P1=temp; //IO口無法直接參與運算,先賦值給字串再用cror進行二進位制移位運算
for (n=0;n<2;n++)
{
for (m=0;m<7;m++)
{
delay(300);
temp = _crol_(temp,1);
P1=temp;
}
for (m=0;m<7;m++)
{
delay(300);
temp = _cror_(temp,1);
P1=temp;
}
}
}
}
void int1_isr (void) interrupt 2
{
P1=0xff;
delay(3000);
}
0x01 問題剖析
手動分配using 0,using 1導致無法退出中斷
手動分配using 1,using 2正常退出並返回主函式
自動分配正常退出並返回主函式
以下純屬猜測,畢竟跟使用哪組暫存器沒啥關係
程式碼中使用電平中斷(可能也和使用全域性變數有關係?)
在沒有清中斷標誌位的情況下,開啟中斷後,會產生多箇中斷訊號
每個中斷程式都在把他們清零,相互影響,導致很難達到計數終點,程式難以終止
又發現一個問題:using 0,using 1是手動分配中斷使用哪組暫存器
但預設情況下系統自動分配暫存器也是using 0,using 1,正常退出中斷
using 0使用第0組暫存器(RS1=0,RS0=0),實際地址R0(00H) - R7(07H)
using 1使用第1組暫存器(RS1=0,RS0=1),實際地址R0(08H) - R7(0FH)