⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd菜单.txt

📁 LCD多级菜单C51程序 LCD多级菜单C51程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
void isr_ex0(void)  interrupt 0 using 1
{
 b_KeyInt=1;
 //
 cTemp_ex0=0xff;
 //
 DelayMs(20);
 ReadyForKey();
 cTemp_ex0=XBYTE[Addr_Key];
 //
    cTemp_ex0=cTemp_ex0&0x3f;
    switch(cTemp_ex0)
     {
     case        0x3e://第一行
         NowKey=0x10;
         break;
     case        0x3d://第二行
         NowKey=0x20;
         break;
     case        0x3b://第三行
         NowKey=0x30;
         break;
     case        0x37://第四行
         NowKey=0x40;
         break;
     case        0x2f://第五行
         NowKey=0x50;
         break;
     case        0x1f://第六行
         NowKey=0x60;
         break;
     default:
   NowKey=0x00;
         break;
     }
 //
 KEYROW1=0;
 KEYROW2=1;
 KEYROW3=1;
 cTemp_ex0=XBYTE[Addr_Key];
    //
 cTemp_ex0&=0x3f;
 if(cTemp_ex0!=0x3f)
  {
  NowKey=NowKey|0x01;
  }
 else
  {
  KEYROW1=1;
  KEYROW2=0;
  KEYROW3=1;
  cTemp_ex0=XBYTE[Addr_Key];
     //
   cTemp_ex0&=0x3f;
   if(cTemp_ex0!=0x3f)
    {
    NowKey=NowKey|0x02;
    }
   else
    {
    KEYROW1=1;
    KEYROW2=1;
    KEYROW3=0;
    cTemp_ex0=XBYTE[Addr_Key];
       cTemp_ex0&=0x3f;
    if(cTemp_ex0!=0x3f)
     {
     NowKey=NowKey|0x03;
     }
    else
     {
     BitValue=XBYTE[Addr_Key];
     if(!bPowerOff)
      {
      NowKey=0x71;
      }
     else
      {
      NowKey=0x00;
      }
     }
    }
  }
 //
 do
        {
  DelayMs(100);
        }while(!KEYINT);
 //
  IE0=0;//清外中断0请求
}
//
void isr_t0(void)   interrupt 1 using 2
{
 TL0=TL0data;
 TH0=TH0data;
 iT0_1S+=20;//因为定时器的定时为20Ms一次
 if(iT0_1S>=1000)
  {
  iT0_1S=0;
  b_Arrive1S=1;
  }
}
//
void isr_ex1(void)  interrupt 2 using 1
{
    _nop_();
}
//
void isr_t1(void)   interrupt 3 using 2
{
    _nop_();
}
//
void isr_ser(void)  interrupt 4 using 3
{
if(TI)
 {
 if((TxNum--)>0)
  {
  SBUF=Send232Buffer[TxPos++];
  }
 else
  {
  TxNum=0;
  TxPos=0;
  }
 //
 TI=0;
 }
else
 {
 RI=0;
 RxNow=SBUF;
 Rev232Buffer[RxPos++]=RxNow;
 if(RxPos>=255)
  {
  RxPos=0;
  }
 //
 if(!b_ReceiveOver)
  {
  switch(RxStep)
   {
   case 0://帧头:55 55
    if(RxNow==0x55)
     {
     if(RxPrev==0x55)
      {
      RxStep=1;
      }
     else
      {
      RxPrev=RxNow;
      RxPos=0;
      Rev232Buffer[RxPos++]=RxNow;
      RxStep=0;
      }
     }
    else
     {
     RxStep=0;
     RxPos=0;
     REN=1;
     }
    break;
   case 1://命令帧和数据帧的判断
    if((RxNow&0x80)==0)
     {
     RxStep=3;
     }
    else
     {
     RxPrev=RxNow;
     RxStep=2;
     }
    break;
   case 2://命令帧,第二个命令字(和第一个命令字相同)
    if(RxNow==RxPrev)
     {
     RxStep=7;
     }
    else
     {
     RxStep=0;
     RxPos=0;
     REN=1;
     }
    break;
   case 3://数据帧,帧长度
    RxDataLenght=RxNow;
    RxStep=4;
    break;
   case 4://数据帧,数据段
    RxDataLenght--;
    if(RxDataLenght==0)
     {
     RxStep=5;
     }
    break;
   case 5://数据帧,累加和
    RxStep=6;
    break;
   case 6://数据帧,异或和
    RxStep=8;
    break;
   case 7://命令帧,累加和
    RxStep=8;
    break;
   case 8://帧尾:aa aa
    if(RxNow==0xaa)
     {
     if(RxPrev==0xaa)
      {
      b_ReceiveOver=1;
      REN=0;
      }
     else
      {
      RxPrev=RxNow;
      }
     }
    else
     {
     RxStep=0;
     RxPos=0;
     REN=1;
     }
    break;
   default:
    RxStep=0;
    RxPos=0;
    REN=1;
    break;
   }
  }
 }
}
//
void UartProcess()
{
//
cUartTemp1=0;
cUartTemp2=0;
cUartTemp3=0;
cUartFunSn=0xff;
//
cUartTemp1=Rev232Buffer[0];
cUartTemp2=Rev232Buffer[1];
if((cUartTemp1==0x55)&(cUartTemp2==0x55))
 {
 cUartTemp1=Rev232Buffer[2];
 cUartTemp1&=0x80;
 if(cUartTemp1!=0)
  {//命令帧
  cUartTemp1=Rev232Buffer[2];
  cUartTemp2=Rev232Buffer[3];
  if(cUartTemp1==cUartTemp2)
   {
   cUartTemp3=cUartTemp1+cUartTemp2;
   cUartTemp1=Rev232Buffer[4];
   if(cUartTemp1==cUartTemp3)
    {
    cUartTemp1=Rev232Buffer[5];
    cUartTemp2=Rev232Buffer[6];
    if((cUartTemp1==0xaa)&&(cUartTemp2=0xaa))
     {
     cUartFunSn=Rev232Buffer[2];
     }
    }
   }
  }
 else
  {//数据帧
  cUartAddSum=Rev232Buffer[2]+Rev232Buffer[3];
  cUartXorSum=Rev232Buffer[2]^Rev232Buffer[3];
  cUartDataLenght=Rev232Buffer[3];
  for(i_uart=4;i_uart<(cUartDataLenght+4);i_uart++)
   {
   cUartTemp1=Rev232Buffer[i_uart];
   cUartAddSum+=cUartTemp1;
   cUartXorSum^=cUartTemp1;
   }
  cUartTemp1=Rev232Buffer[cUartDataLenght+4];
  cUartDataLenght++;
  cUartTemp2=Rev232Buffer[cUartDataLenght+4];
  cUartDataLenght++;
  if((cUartTemp1==cUartAddSum)&&(cUartTemp2==cUartXorSum))
   {
   cUartTemp1=Rev232Buffer[cUartDataLenght+4];
   cUartDataLenght++;
   cUartTemp2=Rev232Buffer[cUartDataLenght+4];
   cUartDataLenght++;
   if((cUartTemp1==0xaa)&&(cUartTemp2==0xaa))
    {
    cUartFunSn=Rev232Buffer[6];
    }
   }
  }
 }
switch(cUartFunSn)
 {
 case 0xa5:
 case 0xa6://我要伪装成座机0xa7
  IAmZj();
  break;
 case 0xac:
 case 0xad:
 case 0xae:
  IAmOk();
  break;
 case 5:
  iFlashAddrH=Rev232Buffer[7];
  iFlashAddrM=Rev232Buffer[8];
  iFlashAddrL=Rev232Buffer[9];
  iFlashRdWrNum=Rev232Buffer[10];
  //
  i_uart=iFlashAddrM;
  i_uart=(i_uart<<8)&0xff00;
  FlashSectorRd(i_uart,Addr_FlashReadBuffer1);
  //
  i_uart=iFlashAddrM+1;
  i_uart=(i_uart<<8)&0xff00;
  FlashSectorRd(i_uart,Addr_FlashReadBuffer2);
  //
  Make05Answer();
  //
  break;
 case 6:
  iFlashAddrH=Rev232Buffer[7];
  iFlashAddrM=Rev232Buffer[8];
  iFlashAddrL=Rev232Buffer[9];
  iFlashRdWrNum=Rev232Buffer[10];
  //
  i_uart=iFlashAddrM;
  i_uart=(i_uart<<8)&0xff00;
  FlashSectorRd(i_uart,Addr_FlashWriteBuffer1);
  //
  i_uart=iFlashAddrM+1;
  i_uart=(i_uart<<8)&0xff00;
  FlashSectorRd(i_uart,Addr_FlashWriteBuffer2);
  //
  cUartTemp1=iFlashRdWrNum;
  iUartTemp1=iFlashAddrL;
  cUartTemp2=0;
  while(cUartTemp1>0)
   {
   XBYTE[Addr_FlashWriteBuffer1+iUartTemp1]=Rev232Buffer[11+cUartTemp2];
   cUartTemp1--;
   iUartTemp1++;
   cUartTemp2++;
   }
  //
  i_uart=iFlashAddrM;
  i_uart=(i_uart<<8)&0xff00;
  FlashSectorWr(Addr_FlashWriteBuffer1,i_uart);
  //
  i_uart=iFlashAddrM+1;
  i_uart=(i_uart<<8)&0xff00;
  FlashSectorWr(Addr_FlashWriteBuffer2,i_uart);
  //
  Make06Answer();
  break;
 case 7:
  ReadTime();
  Make07Answer();
  break;
 case 8:
  //               5     7  8  9  10 11 12
  //55 55 03 09 00 CF 08 03 11 11 19 39 15 6F FB AA AA
  clock[0]=0xa2;//I2C address
  clock[1]=0x02;//address
  clock[8]=Rev232Buffer[7];//year
  clock[7]=Rev232Buffer[8];//month
  clock[5]=Rev232Buffer[9];//date
  clock[4]=Rev232Buffer[10];//hours
  clock[3]=Rev232Buffer[11];//minutes
  clock[2]=Rev232Buffer[12];//seconds
  set_time();
        Make08Answer();
  break;
 default:
  IAmUnKnow();
  RxStep=0;
  RxPos=0;
  break;
 }
}
//
void IAmZj()
{
 Send232Buffer[0]=0x55;
 Send232Buffer[1]=0x55;
 Send232Buffer[2]=0xa7;
 Send232Buffer[3]=0xa7;
 Send232Buffer[4]=0x4e;
 Send232Buffer[5]=0xaa;
 Send232Buffer[6]=0xaa;
 TxPos=0;
 TxNum=7;
 TI=1;
}
void IAmOk()
{
 Send232Buffer[0]=0x55;
 Send232Buffer[1]=0x55;
 Send232Buffer[2]=0x80;
 Send232Buffer[3]=0x80;
 Send232Buffer[4]=0x00;
 Send232Buffer[5]=0xaa;
 Send232Buffer[6]=0xaa;
 TxPos=0;
 TxNum=7;
 TI=1;
}
void IAmUnKnow()
{
 Send232Buffer[0]=0x55;
 Send232Buffer[1]=0x55;
 Send232Buffer[2]=0x84;
 Send232Buffer[3]=0x84;
 Send232Buffer[4]=0x08;
 Send232Buffer[5]=0xaa;
 Send232Buffer[6]=0xaa;
 TxPos=0;
 TxNum=7;
 TI=1;
}
//
void FlashSectorWr(unsigned int SourceXRamAddr,unsigned int TargetFlashAddr)
{
//
cPageAddr=(unsigned char)((TargetFlashAddr>>14)&0x0003);
iSectorAddr=(TargetFlashAddr&0x3f00)|0x8000;
iRamToFlashAddr=SourceXRamAddr&0xff00;
//解锁
XBYTE[Addr_XFlashSector]=0x01;
XBYTE[0x9555]=0xaa;
XBYTE[Addr_XFlashSector]=0x00;
XBYTE[0xaaaa]=0x55;
XBYTE[Addr_XFlashSector]=0x01;
XBYTE[0x9555]=0xa0;
//
XBYTE[Addr_XFlashSector]=cPageAddr;
for(i_FlashWr=iSectorAddr;i_FlashWr<=(iSectorAddr+0xff);i_FlashWr++)
 {
 c1_FlashWr=XBYTE[iRamToFlashAddr++];
 XBYTE[i_FlashWr]=c1_FlashWr;
 }
DelayMs(10);
}
void FlashSectorRd(unsigned int SourceFlashAddr,unsigned int TargetXRamAddr)
{
//
cPageAddr=(unsigned char)((SourceFlashAddr>>14)&0x0003);
iSectorAddr=(SourceFlashAddr&0x3f00)|0x8000;
iFlashToRamAddr=TargetXRamAddr&0xff00;
//
XBYTE[Addr_XFlashSector]=cPageAddr;
for(i_FlashRd=iSectorAddr;i_FlashRd<=(iSectorAddr+0xff);i_FlashRd++)
 {
 c1_FlashRd=XBYTE[i_FlashRd];
 XBYTE[iFlashToRamAddr++]=c1_FlashRd;
 }
}//
//
void Make05Answer()
{
 i_Make05Answer=iFlashAddrL;
 cUartTemp2=0;
 Send232Buffer[cUartTemp2++]=0x55;
 Send232Buffer[cUartTemp2++]=0x55;
 Send232Buffer[cUartTemp2++]=0x03;
 Send232Buffer[cUartTemp2++]=4+iFlashRdWrNum;
 Send232Buffer[cUartTemp2++]=0x00;
 Send232Buffer[cUartTemp2++]=Rev232Buffer[5];//*********
 Send232Buffer[cUartTemp2++]=0x05;
 Send232Buffer[cUartTemp2++]=iFlashRdWrNum;
 cUartTemp1=iFlashRdWrNum;
 while((cUartTemp1--)!=0)
  {
  Send232Buffer[cUartTemp2++]=XBYTE[Addr_FlashReadBuffer1+i_Make05Answer];
  i_Make05Answer++;
  }
 cAdd_Make05Answer=Send232Buffer[2];
 cXor_Make05Answer=Send232Buffer[2];
 for(i_Make05Answer=3;i_Make05Answer<cUartTemp2;i_Make05Answer++)
  {
  cAdd_Make05Answer=cAdd_Make05Answer+Send232Buffer[i_Make05Answer];
  cXor_Make05Answer=cXor_Make05Answer^Send232Buffer[i_Make05Answer];
  }
 Send232Buffer[cUartTemp2++]=cAdd_Make05Answer;
 Send232Buffer[cUartTemp2++]=cXor_Make05Answer;
 Send232Buffer[cUartTemp2++]=0xaa;
 Send232Buffer[cUartTemp2++]=0xaa;
 TxPos=0;
 TxNum=cUartTemp2;
 TI=1;
}
void Make06Answer()
{//55 55 03 04 00 CE 06 00 DB CF AA AA
 cUartTemp2=0;
 Send232Buffer[cUartTemp2++]=0x55;
 Send232Buffer[cUartTemp2++]=0x55;
 Send232Buffer[cUartTemp2++]=0x03;
 Send232Buffer[cUartTemp2++]=0x04;
 Send232Buffer[cUartTemp2++]=0x00;
 Send232Buffer[cUartTemp2++]=Rev232Buffer[5];//*********
 Send232Buffer[cUartTemp2++]=0x06;
 Send232Buffer[cUartTemp2++]=0x00;
 cAdd_Make05Answer=Send232Buffer[2];
 cXor_Make05Answer=Send232Buffer[2];
 for(i_Make05Answer=3;i_Make05Answer<=7;i_Make05Answer++)
  {
  cAdd_Make05Answer=cAdd_Make05Answer+Send232Buffer[i_Make05Answer];
  cXor_Make05Answer=cXor_Make05Answer^Send232Buffer[i_Make05Answer];
  }
 Send232Buffer[cUartTemp2++]=cAdd_Make05Answer;
 Send232Buffer[cUartTemp2++]=cXor_Make05Answer;
 Send232Buffer[cUartTemp2++]=0xaa;
 Send232Buffer[cUartTemp2++]=0xaa;
 TxPos=0;
 TxNum=cUartTemp2;
 TI=1;
}
//
unsigned char ReadTime()
{
 for(i_RdTime=0;i_RdTime<9;i_RdTime++)
  clock[i_RdTime]=0;
 I2Cstart();
 I2Csend(0xA2);
 if(I2Csuback()==0)return 0;
 I2Csend(0x02);
 if(I2Csuback()==0)return 0;
 I2Cstart();
 I2Csend(0xA3);
 if(I2Csuback()==0)return 0;
 clock[0]=I2Cread()&0x7f;//seconds
 I2Cmastack();
 clock[1]=I2Cread()&0x7f;//min
 I2Cmastack();
 clock[2]=I2Cread()&0x3f;//hours
 I2Cmastack();
 clock[3]=I2Cread()&0x3f;//day
 I2Cmastack();
 clock[7]=I2Cread()&0x07;//week
 I2Cmastack();
 clock[4]=I2Cread()&0x1f;//mouth
 I2Cmastack();
 clock[5]=I2Cread()&0x7f;//year
 I2Cnoack();
 I2Cstop();
 clock[6]=0x20;
 cClock_Year=clock[5];
 cClock_Month=clock[4];
 cClock_Day=clock[3];
 cClock_Hour=clock[2];
 cClock_Minute=clock[1];
 cClock_Second=clock[0];
 return 1;
   //

}//
//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -