本来主程序时让数码管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;
}
|