本來主程序時讓數碼管1 3 5 7亮1s 然后全部數碼管熄滅0.5s 做循環,每次循環按照數組里設置的字符變化(n n 5 2 0 1 3 1 4)。
外部中斷0是讓第一個LED亮。
模擬調試結果:
把P3^2(INT0)拉低(接地),即執行中斷程序時,約1-2s 后,首先數碼管1 3 5 7 會從之前的顯示變為顯示'8',然后持續1-2s,最后只剩第8個數碼管顯示'8',其余的數碼管都熄滅。
取消P3^2接地(結束中斷),主程序有時正常,有時在第8個數碼管跑一個循環后正常。
從試驗板的運行結果看,好像是在執行中斷程序的時候使得段鎖存器和位鎖存器的值有所變化。請大蝦幫忙找下問題在哪里。
程序代碼:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lodu=P2^6;
sbit lowi=P2^7;
sbit q1=P1^4;
uint a;
uchar code table[]={0x37,0x37,0x6d,0x5b,0x3f,0x06,0x4f,0x06,0x66};
void delay(uint);
void main()
{
while(1)
{
EA=1;//開總中斷
EX0=1;//開外部中斷0
for(a=0;a<9;a++)
{
q1=1;//LED 電源打開
lowi=1;//位鎖存器直通
P0=0xaa;//給位鎖存器賦值(片選1 3 5 7 數碼管)
lowi=0;//位鎖存器鎖存
lodu=1;//段鎖存器直通
P0=table[a];//給段鎖存器賦值,
lodu=0;//段鎖存器鎖存
delay(380);//延時1s
lodu=1;//段鎖存器直通
P0=0x00;//給段鎖存器賦值
lodu=0;//段鎖存器鎖存
delay(170);//延時0.5s
};
}
}
void delay(uint z)//延時程序
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=200;y>0;y--)
{
};
};
}
void exter0()interrupt 0//中斷子程序
{
q1=0;
P0=0x7f;
}
|