谁能看看这个程序

2019-07-16 05:29发布

/*******************************************************************************
标题:                  EEPROM读写试验(按钮输入)                                                           *
********************************************************************************
                                                                                                                                                           *
此例程学员更进一步地熟悉并掌握(存储芯片AT2402)的操作,有保存和读取操作            *                          
了解掌握I2C总线接口的工作原理及一般编程方法。                                                                   *
                                                                               *                  
跳线操作:P0(JP10)连 数码管(JP12)                                                                                   *
          P1(JP8 )连 独立按键(JP5)                                                                                   *
                                                                                                                                                           *
具体操作:        第1个按钮保存      第2个按钮读取                                                               *
            第3个按钮减减      第4个按钮加数                                                               *
                                                                                                                                                           *                            
希望学员认真体会消化此例程,试着用别的资源来操作EEPROM!                                                   *                                                          
********************************************************************************/

#include<Function.h>
#include<reg52.h>

#define  AT24C02 0xa0  //AT24C02 地址

//else IO
sbit    LS138A=P2^2;          //译码器端
sbit    LS138B=P2^3;
sbit    LS138C=P2^4;

sbit    K1 = P1^0;         //保存
sbit    K2 = P1^1;         //读取
sbit    K3 = P1^2;         //+数据
sbit    K4 = P1^3;   //-数据

void delay(unsigned int i);


//此表为 LED 的字模, 共阴数码管 0-9  -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

unsigned char Count1;
unsigned long D[16], LedOut[5],LedNumVal;
unsigned int idata USEC;

  
void  system_ini()
{   
    TMOD|= 0x11;
    TH1 = 0xfe; //11.0592
        TL1 = 0x33;
        TR1  = 1;
    IE =0x8A;

}

main()
{         unsigned char i;
        unsigned char pDat[8];

   system_ini();
   while(1)
   {
                 //========================IIC 读取
        if(K2 == 0)           //第二个按钮读取数据
        {
          IRcvStr(AT24C02, 0 , &pDat[0], 8);
          for (i=0; i<4; i++)
          {
                D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;
                Count1 = D[14];
           }             
         }

           //========================IIC 保存
           if(K1 == 0)    //第一个按钮保存数据
           {
              D[14]= Count1;
                 for (i=0; i<4; i++)
             {
                   pDat[i*2+0]=D[14+i];
                   pDat[i*2+1]=D[14+i]>>8;
                 }
             ISendStr(AT24C02, 0 , &pDat[0], 8);
       }


          /********以下将2402中保存的数据送到LED数码管显示*************/
        LedNumVal=Count1;
          LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
      LedOut[1]=Disp_Tab[LedNumVal%1000/100];
      LedOut[2]=Disp_Tab[LedNumVal%100/10]|0x80;
      LedOut[3]=Disp_Tab[LedNumVal%10];
            
    for(i=0; i<4; i++)
          {               
               
            P0 =  LedOut[i];
                  
                switch(i)                                          
         {            
                        case 0:LS138A=0; LS138B=0; LS138C=0; break;         
            case 1:LS138A=1; LS138B=0; LS138C=0; break;                    
            case 2:LS138A=0; LS138B=1; LS138C=0; break;
            case 3:LS138A=1; LS138B=1; LS138C=0; break;
                        case 4:LS138A=0; LS138B=0; LS138C=1; break;
         }
                 
                delay(100);
          }

          //  LS138A=1; LS138B=1; LS138C=1;   

   }
}


void delay(unsigned int i)
{
    char j;
    for(i; i > 0; i--)
        for(j = 200; j > 0; j--);
}


/*************************************
[ t1 (0.5ms)中断] 中断中做 PWM 输出
  ------------1000/(0.02ms*250)=200Hz
*************************************/
void T1zd(void) interrupt 3   //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断
{
         TH1 = 0xfe; //12M       
         TL1 = 0x33;
   if(USEC++==200)
   {        USEC=0;
         
    if (K3) Count1++;     //改变数据
    if (K4&Count1!=0) Count1--;
  
    }  

}
、、////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*******************************************************************************
标题:                  EEPROM读写试验(按钮输入)                                                           *
********************************************************************************
                                                                                                                                                           *
此例程学员更进一步地熟悉并掌握(存储芯片AT2402)的操作,有保存和读取操作            *                          
了解掌握I2C总线接口的工作原理及一般编程方法。                                                                   *
                                                                               *                  
跳线操作:P0(JP10)连 数码管(JP12)                                                                                   *
          P1(JP8 )连 独立按键(JP5)                                                                                   *
                                                                                                                                                           *
具体操作:        第1个按钮保存      第2个按钮读取                                                               *
            第3个按钮减减      第4个按钮加数                                                               *
                                                                                                                                                           *                            
希望学员认真体会消化此例程,试着用别的资源来操作EEPROM!                                                   *                                                          
********************************************************************************/

#include<Function.h>
#include<reg52.h>

#define  AT24C02 0xa0  //AT24C02 地址

//else IO
sbit    LS138A=P2^2;          //译码器端
sbit    LS138B=P2^3;
sbit    LS138C=P2^4;

sbit    K1 = P1^0;         //保存
sbit    K2 = P1^1;         //读取
sbit    K3 = P1^2;         //+数据
sbit    K4 = P1^3;   //-数据

void delay(unsigned int i);


//此表为 LED 的字模, 共阴数码管 0-9  -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

unsigned char Count1;
unsigned long D[16], LedOut[5],LedNumVal;
unsigned int idata USEC;

  
void  system_ini()
{   
    TMOD|= 0x11;
    TH1 = 0xfe; //11.0592
        TL1 = 0x33;
        TR1  = 1;
    IE =0x8A;

}

main()
{         unsigned char i;
        unsigned char pDat[8];

   system_ini();
   while(1)
   {
                 //========================IIC 读取
        if(K2 == 0)           //第二个按钮读取数据
        {
          IRcvStr(AT24C02, 0 , &pDat[0], 8);
          for (i=0; i<4; i++)
          {
                D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;
                Count1 = D[14];
           }             
         }

           //========================IIC 保存
           if(K1 == 0)    //第一个按钮保存数据
           {
              D[14]= Count1;
                 for (i=0; i<4; i++)
             {
                   pDat[i*2+0]=D[14+i];
                   pDat[i*2+1]=D[14+i]>>8;
                 }
             ISendStr(AT24C02, 0 , &pDat[0], 8);
       }


          /********以下将2402中保存的数据送到LED数码管显示*************/
        LedNumVal=Count1;
          LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
      LedOut[1]=Disp_Tab[LedNumVal%1000/100];
      LedOut[2]=Disp_Tab[LedNumVal%100/10]|0x80;
      LedOut[3]=Disp_Tab[LedNumVal%10];
            
    for(i=0; i<4; i++)
          {               
               
            P0 =  LedOut[i];
                  
                switch(i)                                          
         {            
                        case 0:LS138A=0; LS138B=0; LS138C=0; break;         
            case 1:LS138A=1; LS138B=0; LS138C=0; break;                    
            case 2:LS138A=0; LS138B=1; LS138C=0; break;
            case 3:LS138A=1; LS138B=1; LS138C=0; break;
                        case 4:LS138A=0; LS138B=0; LS138C=1; break;
         }
                 
                delay(100);
          }

          //  LS138A=1; LS138B=1; LS138C=1;   

   }
}


void delay(unsigned int i)
{
    char j;
    for(i; i > 0; i--)
        for(j = 200; j > 0; j--);
}


/*************************************
[ t1 (0.5ms)中断] 中断中做 PWM 输出
  ------------1000/(0.02ms*250)=200Hz
*************************************/
void T1zd(void) interrupt 3   //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断
{
         TH1 = 0xfe; //12M       
         TL1 = 0x33;
   if(USEC++==200)
   {        USEC=0;
         
    if (K3) Count1++;     //改变数据
    if (K4&Count1!=0) Count1--;
  
    }  

}
///////////////////////////////////////////////////////////////////

while(1)
   {
                 //========================IIC 读取
        if(K2 == 0)           //第二个按钮读取数据
        {
          IRcvStr(AT24C02, 0 , &pDat[0], 8);
          for (i=0; i<4; i++)
          {
                D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;
                Count1 = D[14];
           }             
         }

           //========================IIC 保存
           if(K1 == 0)    //第一个按钮保存数据
           {
              D[14]= Count1;
                 for (i=0; i<4; i++)
             {
                   pDat[i*2+0]=D[14+i];
                   pDat[i*2+1]=D[14+i]>>8;
                 }
             ISendStr(AT24C02, 0 , &pDat[0], 8);
       }

这部分有人能解释一下么   ?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。