📄 fpgadram.c
字号:
#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 + -