为何变量是static的时候可以正常,而去掉static就不行了
时间:10-02
整理:3721RD
点击:
这是一个红外线遥控的实验程序,为什么红色的部分变量是static的时候可以正常,而去掉static就不行了?希望高手指点
#include<reg52.h>
sbit LATCH1=P2^6;//定义锁存使能端口 段锁存
sbit LATCH2=P2^7;
typedef unsigned char uchar;
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar irtime; //记录两个下降沿之间的时间
uchar shijian[33]; //存储33个比特序列
uchar zijie[4]; //存储处理后的四个字节数据
bit receok,prook;
void t1init() //定时器0初始化
{
TMOD=0x20;//定时器0工作方式2,TH0是重装值,TL0是初值
TH1=0x00; //重载值
TL1=0x00; //初始化值
ET1=1; //开中断
TR1=1;
EA=1;
}
void t1(void) interrupt 3 using 3//启动定时器中断
{
irtime++;
}
void int0init() //外部中断0初始化
{
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1; //使能外部中断
EA = 1;
}
void int0(void) interrupt 0 //外部中断0
{
static uchar i;
static bit startflag; //启动标志
if(startflag)
{
if(irtime>=33&&irtime<63)
{
i=0;
}
shijian=irtime;
irtime=0;
i++;
if(i==33)
{
receok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}
}
void chuli() //处理接收到的数据
{
uchar i,j,k;
uchar value,temp;
k=1;
for(i=0;i<4;i++)
{
for(j=1;j<=8;j++)
{
temp=shijian[k];
if(temp>7)
{
value=value|0x80;
}
if(j<8)
{
value=value>>1;
}
k++;
}
zijie=value;
value=0;
}
prook=1;
}
void display(void)//红外键值散转程序
{
switch(zijie[2])//判断第三个数码值
{
case 0x0c:P0=dofly_DuanMa[1];break;//1 显示相应的按键值
case 0x18:P0=dofly_DuanMa[2];break;//2
case 0x5e:P0=dofly_DuanMa[3];break;//3
case 0x08:P0=dofly_DuanMa[4];break;//4
case 0x1c:P0=dofly_DuanMa[5];break;//5
case 0x5a:P0=dofly_DuanMa[6];break;//6
case 0x42:P0=dofly_DuanMa[7];break;//7
case 0x52:P0=dofly_DuanMa[8];break;//8
case 0x4a:P0=dofly_DuanMa[9];break;//9
default:break;
}
prook=0;//处理完成标志
}
void main()
{
int0init();
t1init();
P0=0xfe; //取位码 第一位数码管选通,即二进制1111 1110
LATCH2=1; //位锁存
LATCH2=0;
while(1)
{
if(receok)
{
chuli();
receok=0;
}
if(prook)
{
display();
}
}
}
#include<reg52.h>
sbit LATCH1=P2^6;//定义锁存使能端口 段锁存
sbit LATCH2=P2^7;
typedef unsigned char uchar;
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar irtime; //记录两个下降沿之间的时间
uchar shijian[33]; //存储33个比特序列
uchar zijie[4]; //存储处理后的四个字节数据
bit receok,prook;
void t1init() //定时器0初始化
{
TMOD=0x20;//定时器0工作方式2,TH0是重装值,TL0是初值
TH1=0x00; //重载值
TL1=0x00; //初始化值
ET1=1; //开中断
TR1=1;
EA=1;
}
void t1(void) interrupt 3 using 3//启动定时器中断
{
irtime++;
}
void int0init() //外部中断0初始化
{
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1; //使能外部中断
EA = 1;
}
void int0(void) interrupt 0 //外部中断0
{
static uchar i;
static bit startflag; //启动标志
if(startflag)
{
if(irtime>=33&&irtime<63)
{
i=0;
}
shijian=irtime;
irtime=0;
i++;
if(i==33)
{
receok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}
}
void chuli() //处理接收到的数据
{
uchar i,j,k;
uchar value,temp;
k=1;
for(i=0;i<4;i++)
{
for(j=1;j<=8;j++)
{
temp=shijian[k];
if(temp>7)
{
value=value|0x80;
}
if(j<8)
{
value=value>>1;
}
k++;
}
zijie=value;
value=0;
}
prook=1;
}
void display(void)//红外键值散转程序
{
switch(zijie[2])//判断第三个数码值
{
case 0x0c:P0=dofly_DuanMa[1];break;//1 显示相应的按键值
case 0x18:P0=dofly_DuanMa[2];break;//2
case 0x5e:P0=dofly_DuanMa[3];break;//3
case 0x08:P0=dofly_DuanMa[4];break;//4
case 0x1c:P0=dofly_DuanMa[5];break;//5
case 0x5a:P0=dofly_DuanMa[6];break;//6
case 0x42:P0=dofly_DuanMa[7];break;//7
case 0x52:P0=dofly_DuanMa[8];break;//8
case 0x4a:P0=dofly_DuanMa[9];break;//9
default:break;
}
prook=0;//处理完成标志
}
void main()
{
int0init();
t1init();
P0=0xfe; //取位码 第一位数码管选通,即二进制1111 1110
LATCH2=1; //位锁存
LATCH2=0;
while(1)
{
if(receok)
{
chuli();
receok=0;
}
if(prook)
{
display();
}
}
}