微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 为何变量是static的时候可以正常,而去掉static就不行了

为何变量是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();
    }
   }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top