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

📄 fpgadram.bak

📁 最先进的信号机程序,经过很多重要场合测试通过
💻 BAK
字号:
#include <absacc.h>
#include <reg51.h>
unsigned int xdata start_addr;
unsigned int xdata end_addr;
unsigned int xdata address;
unsigned int xdata data_address=0xa080;    //双口RAM数据存放地址计数器

unsigned int re_flagaddr;
unsigned int tr_flagaddr;
unsigned int tr_startaddr;     //发送数据开始地址
unsigned int tr_endaddr;   //
unsigned int detail_answer(/*unsigned char *ptr,*/unsigned int len,unsigned char detail)
{
  data_address=XBYTE[0XA021]<<8+XBYTE[0XA022]+1;
  address=data_address;
  data_address=data_address+len;            //应答数据长度1字节
  if(data_address>0xa07f0)data_address=data_address-0xa7f0+0xa080;
  while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){};    //等待FGPA修改头尾
  XBYTE[0xa023]=0x01;                              //CPU修改头尾
  XBYTE[0xa024]=0X00;
  data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;

  address=data_address;
  data_address=data_address+len;            //应答数据长度1字节
  if(data_address>0xa07f0)data_address=data_address-0x7f0+0x80;
  data_address--;
  XBYTE[0XA021]=data_address>>8;          //
  XBYTE[0XA022]=data_address;
  XBYTE[0XA023]=0X00;                      //CPU修改头尾结束
  XBYTE[0XA024]=0X00;
  XBYTE[tr_flagaddr+1]=address>>8;        //发送数据的首地址
  XBYTE[tr_flagaddr+2]=address;

  XBYTE[tr_flagaddr+3]=data_address>>8;   //发送数据的尾地址
  XBYTE[tr_flagaddr+4]=data_address;
  address=address+0xa000;                                                              //发送应答数据
  XBYTE[address]=detail;
  XBYTE[tr_flagaddr]=0x01;
  return 1;
}

unsigned char answer_fpga(unsigned char flag)
{
  unsigned char i;


 //相应的接收标志写成0x87
     XBYTE[re_flagaddr]=0x87;
      for(i=0;i<6;i++){
           tr_flagaddr=0XA030+5*i;
           if(XBYTE[tr_flagaddr]==0x87)break;
                      }
           switch(flag){ //FPG对CPU进行设置
              case 0x92:break;
              case 0x93:detail_answer(1,0xd3);break;
              case 0x94:detail_answer(1,0xd4);break;
              case 0x95:detail_answer(1,0xd5);break;
              case 0x96:detail_answer(1,0xd6);break;
              case 0x97:detail_answer(1,0xd7);break;
              case 0x98:detail_answer(1,0xd8);break;
              case 0x99:detail_answer(1,0xd9);break;
              case 0x9a:detail_answer(1,0xda);break;
              case 0x9c:detail_answer(1,0xdc);break;
              case 0x9d:break;
              case 0x9e:break;
              case 0x9f:break;

              default:break;
                  }

    return 1;
     }

unsigned char fpga_dram_data(unsigned char flag)
{

  unsigned int i,j;
  unsigned char a;
  switch(flag){
     case 0x92:break;
     case 0x93://设置时间   数据由双口RAM读到VNRAM中
               address++;
               if(address>0xa7f0)address=0xa080;
               a=XBYTE[address];
               XBYTE[0XC009]=a;  //year

               address++;
               if(address>0xa7f0)address=0xa080;
               XBYTE[0XC008]=XBYTE[address];  //month
               address++;
               if(address>0xa7f0)address=0xa080;
               a=XBYTE[address];
               XBYTE[0XC007]=a;  //date

               address++;
               if(address>0xa7f0)address=0xa080;
               a=XBYTE[address];
               XBYTE[0XC004]=a;  //hour
               address++;
               if(address>0xa7f0)address=0xa080;
               a=XBYTE[address];
               XBYTE[0XC002]=a;  //min
               address++;
               if(address>0xa7f0)address=0xa080;
               a=XBYTE[address];
               XBYTE[0XC000]=a;  //sec

               address++;
               if(address>0xa7f0)address=0xa080;
               a=XBYTE[address];
               XBYTE[0XC006]=XBYTE[address];  //day
               data_address=address;
               //应答
               answer_fpga(0x93);
               break;
     case 0x94:if(XBYTE[address+1]==0){
                   for(i=0;i<289;i++)XBYTE[0X5000+i]=XBYTE[address+1+i];
                                       }else{
                       for(i=0;i<289;i++)XBYTE[0X5121+i]=XBYTE[address+1+i];
                                             }
               answer_fpga(0x94);
               break;
     case 0x95:j=XBYTE[address+1]*98;   //阶段表
               for(i=0;i<98;i++){
                   XBYTE[0X5242+i+j]=XBYTE[address+i];
                                 }
               answer_fpga(0x95);
               break;
     case 0x96:j=XBYTE[address+1]*40;
               for(i=0;i<40;i++){
                   XBYTE[0X5e82+i+j]=XBYTE[address+i];
                                 }
               answer_fpga(0x96);
               break;
     case 0x97:
               break;
     case 0x98:j=XBYTE[address+1]*73;
               for(i=0;i<73;i++){
                   XBYTE[0X6382+i+j]=XBYTE[address+i];
                                 }
               answer_fpga(0x98);
               break;
     case 0x99:address++;
               for(i=0;i<60;i++){
                   XBYTE[0X6ce2+i]=XBYTE[address+i];
                                 }
               answer_fpga(0x99);
               break;
     case 0x9a:break;
     case 0x9b:break;
     case 0x9c:break;
     case 0x9d:break;
     case 0x82:XBYTE[re_flagaddr]=0x87;
               data_address=XBYTE[0XA021]<<8+XBYTE[0XA022]+1;
               address=data_address;
               data_address=data_address+14;            //应答数据长度11字节
               if(data_address>0xa07f0)data_address=data_address-0xa7f0+0xa080;
               while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){};    //等待FGPA修改头尾
               XBYTE[0xa023]=0x01;                                 //CPU修改头尾
               XBYTE[0xa024]=0X00;
               data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;
               address=data_address;
               data_address=data_address+14;            //应答数据长度1字节
               if(data_address>0xa07f0)data_address=data_address-0x7f0+0x80;
               data_address--;
               XBYTE[0XA021]=data_address>>8;          //
               XBYTE[0XA022]=data_address;
               XBYTE[0XA023]=0X00;                      //CPU修改头尾结束
               XBYTE[0XA024]=0X00;
               XBYTE[tr_flagaddr+1]=address>>8;        //发送数据的首地址
               XBYTE[tr_flagaddr+2]=address;
               XBYTE[tr_flagaddr+3]=data_address>>8;   //发送数据的尾地址
               XBYTE[tr_flagaddr+4]=data_address;
               address=address+0xa000;
               XBYTE[address]=0xc2;address++;          //发送应答数据
               XBYTE[address]=0x10;address++;          //最大输出通道数
               XBYTE[address]=0x20;address++;
               XBYTE[address]=0x20;address++;
               XBYTE[address]=0x20;address++;
               XBYTE[address]=0x20;address++;
               XBYTE[address]=0x18;address++;
               XBYTE[address]=XBYTE[0X72E2];address++;       //开机时间小时
               XBYTE[address]=XBYTE[0X72E3];address++;       //开机时间分钟
               XBYTE[address]=XBYTE[0X72E4];address++;       //关机时间小时
               XBYTE[address]=XBYTE[0X72E5];address++;       //关机时间分钟
               XBYTE[address]=XBYTE[0X72E6];address++;       //关机后状态
               XBYTE[address]=XBYTE[0X8000];address++;       //路口编号高位地址
               XBYTE[address]=XBYTE[0X8001];address++;       //路口编号地位地址
               XBYTE[tr_flagaddr]=0x01;
               break;
     case 0x83:XBYTE[re_flagaddr]=0x87;
               data_address=XBYTE[0XA021]<<8+XBYTE[0XA022]+1;
               address=data_address;
               data_address=data_address+7;            //应答数据长度1字节
               if(data_address>0xa07f0)data_address=data_address-0xa7f0+0xa080;
               while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){};    //等待FGPA修改头尾
               XBYTE[0xa023]=0x01;                              //CPU修改头尾
               XBYTE[0xa024]=0X00;
               data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;
               address=data_address;
               data_address=data_address+7;            //应答数据长度1字节
               if(data_address>0xa07f0)data_address=data_address-0x7f0+0x80;
               data_address--;
               XBYTE[0XA021]=data_address>>8;          //
               XBYTE[0XA022]=data_address;
               XBYTE[0XA023]=0X00;                      //CPU修改头尾结束
               XBYTE[0XA024]=0X00;
               XBYTE[tr_flagaddr+1]=address>>8;        //发送数据的首地址
               XBYTE[tr_flagaddr+2]=address;
               XBYTE[tr_flagaddr+3]=data_address>>8;   //发送数据的尾地址
               XBYTE[tr_flagaddr+4]=data_address;
               address=address+0xa000;
               XBYTE[address]=0xc3;address++;                                                           //发送应答数据
               XBYTE[address]=XBYTE[0XC009];address++;
               XBYTE[address]=XBYTE[0XC008];address++;
               XBYTE[address]=XBYTE[0XC007];address++;
               XBYTE[address]=XBYTE[0XC004];address++;
               XBYTE[address]=XBYTE[0XC002];address++;
               XBYTE[address]=XBYTE[0XC000];address++;
               XBYTE[address]=XBYTE[0XC006];address++;
               XBYTE[tr_flagaddr]=0x01;
               break;
     case 0x84:answer_fpga(0x84);break;
     case 0x85:answer_fpga(0x85);break;
     case 0x86:answer_fpga(0x86);break;
     case 0x87:answer_fpga(0x87);break;
     case 0x88:answer_fpga(0x88);break;
     case 0x89:answer_fpga(0x89);break;
     case 0x8a:answer_fpga(0x8a);break;
     case 0x8b:answer_fpga(0x8b);break;
     case 0x8c:answer_fpga(0x8c);break;
     case 0x8d:answer_fpga(0x8d);break;
     case 0x8e:answer_fpga(0x8e);break;
     default:break;
               }
    return 1;
}
//address代表标志地址 address+1

deal_fpgadram()
{
 unsigned char i;
 unsigned char flag;
 unsigned char xdata flagg;

 for(i=0;i<6;i++){
   re_flagaddr=0XA050+i*5;
   flag=XBYTE[re_flagaddr];
   if(flag>0&&flag<5){
      start_addr=XBYTE[re_flagaddr+1];
      start_addr=(start_addr<<8);
      start_addr=start_addr+XBYTE[re_flagaddr+2];
     // start_addr=start_addr+0xa000;
    //  start_addr=(XBYTE[re_flagaddr+1]<<8)+XBYTE[re_flagaddr+2];
         //开始地址
   //   end_addr  =(XBYTE[re_flagaddr+3]<<8)+XBYTE[re_flagaddr+4];          //结束地址
      end_addr=XBYTE[re_flagaddr+3];
      end_addr=end_addr<<8;
      end_addr=end_addr+ XBYTE[re_flagaddr+4];
    //  end_addr=end_addr+0xa000;
      address=start_addr+0xa000;
      data_address=start_addr;
      flagg=XBYTE[start_addr+0xa000];
      fpga_dram_data(flagg);       //接收fpga送来的数据
      return ;
                      }
                  }


}

⌨️ 快捷键说明

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