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

📄 fpgadram.c

📁 ASC 信号机控制程序,国内最先进的信号机控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <absacc.h>
#include <reg51.h>
extern bit re_control;
unsigned int xdata start_addr;
unsigned int xdata end_addr;
unsigned int xdata address;
unsigned int xdata data_address=0xa080;    //双口RAM数据存放地址计数器
unsigned char xdata iiiii,flagi;
unsigned char xdata KB=0;
unsigned char xdata sch_step[16];
unsigned int re_flagaddr;
unsigned int xdata tr_flagaddr=0xa030;
unsigned int tr_startaddr;     //发送数据开始地址
unsigned int tr_endaddr;   //
unsigned char c080=0x81;
sbit FarContrlLed=P1^1;
extern unsigned char xdata machine_flag;   //主机或从机标志     1:主机  0:从机
extern  unsigned char step_time;
extern  unsigned char now_step_key;
extern  unsigned char step_counter;              //阶段号
extern  unsigned char xdata force_flag;

unsigned int detail_answer(/*unsigned char *ptr,*/unsigned int len,unsigned char detail)
{
  unsigned char i;

  while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){};    //等待FGPA修改头尾
  XBYTE[0xa023]=0x01;                              //CPU修改头尾
  XBYTE[0xa024]=0X00;
  data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;    //CPU程序可以应用的首地址,偏移地址
  data_address=(data_address&0x7ff);


  address=data_address;                     //首地址偏移量
  data_address=data_address+len;            //应答数据长度1字节
  if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
  data_address--;
  XBYTE[0XA021]=data_address>>8;          //尾地址偏移量
  XBYTE[0XA022]=data_address;
  XBYTE[0XA023]=0X00;                      //CPU修改头尾结束
  XBYTE[0XA024]=0X00;
  tr_flagaddr=0xa030;
  for(i=0;i<6;i++){
      tr_flagaddr=tr_flagaddr+i*5;
      if(XBYTE[tr_flagaddr]==0x87)break;
                   }
  if(i==6)return 1 ;
  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;                 //发送应答数据   绝对地址
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=detail;
  XBYTE[tr_flagaddr]=0x01;
  return 1;
}

unsigned char answer_fpga(unsigned char flag) using 1
{
  unsigned char i,a;


 //相应的接收标志写成0x87
     XBYTE[re_flagaddr]=0x87;

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

    return 1;
     }

unsigned char fpga_dram_data(unsigned char flag)  using 1
{

  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;          //实际地址
               XBYTE[re_flagaddr]=0x87;      //读取操作完成
               //应答
               a=answer_fpga(0x93);
               break;
     case 0x94:KB++;
               address++;
               if(address>0xa7f0)address=0xa080;
               if(XBYTE[address]==0){
                   for(i=0;i<289;i++){
                                      XBYTE[0X5000+i]=XBYTE[address];
                                      address++;
                                      if(address>0xa7f0)address=0xa080;
                                      }
                                       }else{
                       for(i=0;i<289;i++){
                                         XBYTE[0X5121+i]=XBYTE[address];
                                         address++;
                                         if(address>0xa7f0)address=0xa080;
                                          }
                                             }
               XBYTE[re_flagaddr]=0x87;      //读取操作完成
               a=answer_fpga(0x94);
                break;
     case 0x95:address++;
               if(address>0xa7f0)address=0xa080;
               j=(XBYTE[address]-1)*98;   //阶段表
               for(i=0;i<98;i++){
                   XBYTE[0X5242+i+j]=XBYTE[address];
                   address++;
                   if(address>0xa7f0)address=0xa080;
                                 }
               XBYTE[re_flagaddr]=0x87;      //读取操作完成
               a=answer_fpga(0x95);
               break;
     case 0x96:address++;
               if(address>0xa7f0)address=0xa080;
               j=(XBYTE[address]-1)*41;      //方案
               for(i=0;i<41;i++){
                   XBYTE[0X5e82+i+j]=XBYTE[address];
                   address++;
                   if(address>0xa7f0)address=0xa080;
                                 }
               XBYTE[re_flagaddr]=0x87;      //读取操作完成
               a=answer_fpga(0x96);
               break;
     case 0x97:
               break;
     case 0x98:address++;
               if(address>0xa7f0)address=0xa080;
               j=(XBYTE[address]-1)*74;        // 计划
               for(i=0;i<74;i++){
                   XBYTE[0X63a2+i+j]=XBYTE[address];
                   address++;
                   if(address>0xa7f0)address=0xa080;
                            }
               XBYTE[re_flagaddr]=0x87;      //读取操作完成
               a=answer_fpga(0x98);
               break;
     case 0x99:address++;
               if(address>0xa7f0)address=0xa080;
               for(i=0;i<60;i++){
                   XBYTE[0X6ce2+i]=XBYTE[address];
                   address++;
                   if(address>0xa7f0)address=0xa080;
                                 }
               XBYTE[re_flagaddr]=0x87;      //读取操作完成

⌨️ 快捷键说明

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