📄 setbid.c
字号:
#include <absacc.h>
#include <reg51.h>
#define eeprom_addr 0x8050;
extern unsigned char receive_flag;
extern unsigned char xdata checkdata[512];
extern unsigned int check_temp;
extern unsigned int xdata tr_flagaddr;
extern unsigned char xdata second_flag;
sbit WatchDog = P1^3; //看门狗
unsigned char lin;
unsigned char add_transparence=0;
unsigned int add_transparence_valid=0;
unsigned int add_final_number;
unsigned char xdata data_final_number;
unsigned int xdata datanumber=0;
unsigned char xdata tempdata;
unsigned char xdata add_bit;
unsigned char xdata answer_data[310];
unsigned char xdata data_final[310];
unsigned char xdata h_address;
unsigned char xdata l_address;
extern unsigned char xdata RX_BUF[512];
extern unsigned int xdata head;
extern unsigned int xdata tail;
extern unsigned int re_flagaddr;
extern unsigned int xdata data_address;
extern unsigned char xdata checkdata[512];
extern unsigned int xdata address;
extern unsigned short cal_crc(unsigned char *ptr,unsigned int len) ;
//发送数据到fpga
unsigned char tran_fpag(unsigned char flag,unsigned int len)//标志和长度
{
unsigned int i;
unsigned char j;
for(i=0;i<6;i++){
tr_flagaddr=0XA030+5*i;
if(XBYTE[tr_flagaddr]==0x87)break;
}
///////////////////////////////////////////////////////
// data_address=XBYTE[0XA021]<<8+XBYTE[0XA022]+1; //当前数据区的尾地址
// address=data_address; //当前数据区的尾地址偏移量
// data_address=data_address+len; //应答数据长度1字节
// if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){}; //等待FGPA修改头尾
XBYTE[0xa023]=0x01; //CPU修改头尾
XBYTE[0xa024]=0X00;
data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;
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;
for(i=0;i<6;i++){
tr_flagaddr=0XA030+5*i;
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;
// XBYTE[tr_flagaddr]=0x01;
address=address+0xa000; //发送应答数据
if(address>0xa7f0)address=0xa080;
///////////////////////////////////////////////////
switch(flag){
case 0x94:if(checkdata[5]==0){
XBYTE[address]=0x94;
address++; // 标识
if(address>0xa7f0)address=0xa080;
for(i=0;i<289;i++){
XBYTE[address]=XBYTE[0X5000+i];
address++;
if(address>0xa7f0)address=0xa080;
}
}else{
XBYTE[address]=0x94;
address++;
if(address>0xa7f0)address=0xa080;
for(i=0;i<289;i++){
XBYTE[address]=XBYTE[0X5121+i];
address++;
if(address>0xa7f0)data_address=0xa080;
}
XBYTE[tr_flagaddr]=0x01;
break;
case 0x95: j=checkdata[5];
j=(j-1)*98;
XBYTE[address]=0x95; // 标识
address++;
if(address>0xa7f0)address=0xa080;
for(i=0;i<98;i++){
XBYTE[address]=XBYTE[0X5242+i+j];
address++;
if(address>0xa7f0)address=0xa080;
}
XBYTE[tr_flagaddr]=0x01;
break;
case 0x96: j=checkdata[5];
j=(j-1)*41;
XBYTE[address]=0x96; // 标识
address++;
if(address>0xa7f0)address=0xa080;
for(i=0;i<41;i++){
XBYTE[address]=XBYTE[0X5e82+i+j];
address++;
if(address>0xa7f0)address=0xa080;
}
XBYTE[tr_flagaddr]=0x01;
break;
case 0x97: break;
case 0x98:j=checkdata[5];
j=(j-1)*74;
XBYTE[address]=0x96; // 标识
address++;if(address>0xa7f0)address=0xa080;
for(i=0;i<41;i++){
XBYTE[address]=XBYTE[0X63a2+i+j];
address++;
if(address>0xa7f0)address=0xa080;
}
XBYTE[tr_flagaddr]=0x01;
break;
case 0x99: XBYTE[address]=0x99; // 标识
address++;
if(address>0xa7f0)address=0xa080;
for(i=0;i<60;i++){
XBYTE[address]=XBYTE[0X6ce2+i];
address++;
if(address>0xa7f0)address=0xa080;
}
XBYTE[tr_flagaddr]=0x01;
break;
case 0x9a: break;
case 0x9b: break;
case 0x9c:break;
default:break;
}
}
return 0;
}
//透明性检验
void add_transparences()
{
switch(add_transparence)
{
case 0 :
if(add_bit==1)
{
add_transparence=1;
add_transparence_valid=0;
}
else
{
add_transparence=0;
add_transparence_valid=0;
}
break;
case 1 :
if(add_bit==1)
{
add_transparence=2;
add_transparence_valid=0;
}
else
{
add_transparence=0;
add_transparence_valid=0;
}
break;
case 2:
if(add_bit==1)
{
add_transparence=3;
add_transparence_valid=0;
}
else
{
add_transparence=0;
add_transparence_valid=0;
}
break;
case 3:
if(add_bit==1)
{
add_transparence=4;
add_transparence_valid=0;
}
else
{
add_transparence=0;
add_transparence_valid=0;
}
break;
case 4:
if(add_bit==1)
{
add_transparence=0;
add_transparence_valid=1;
}
else
{
add_transparence=0;
add_transparence_valid=0;
}
break;
}
}
//设置时间
set_time()
{
unsigned char *p;
unsigned short check_temp;
unsigned char i,j;
unsigned char beginbit=0; ////////////////////////////////////////
//设置时间后用
datanumber=0;
data_final_number=0;
tempdata=0;
XBYTE[0XC009]=checkdata[5]; //year
XBYTE[0XC008]=checkdata[6]; //month
XBYTE[0XC007]=checkdata[7]; //date
XBYTE[0XC004]=checkdata[8]; //hour
XBYTE[0XC002]=checkdata[9]; //min
XBYTE[0XC000]=checkdata[10]; //sec
XBYTE[0XC006]=checkdata[11]; //day
//应答
answer_data[0]=h_address;
answer_data[1]=l_address;
answer_data[2]=0xcc;
answer_data[3]=0xc1;
answer_data[4]=0xd3;
// answer_data[5]=0x00;
p=&answer_data[0];
check_temp=cal_crc(p,5);
answer_data[5]=(check_temp>>8); //crc
answer_data[6]=check_temp; //crc
answer_data[7]=0x7e;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
add_bit=(answer_data[i]>>(7-j))%2;
add_transparences();
tempdata=tempdata+(add_bit<<(7-data_final_number++));
if((add_transparence_valid==1) && (i!=7)){ ///////////////////////////////////
if(data_final_number==8)beginbit=1;
else data_final_number++;
} ///////////////////////////////////
if(data_final_number>=8){ /////////////////////////////////
if(beginbit==1){ ////////////////////
data_final_number=1; ////////////////////////
beginbit=0; ////////////////////
}else{
data_final_number=0;
}
data_final[datanumber++]=tempdata; /////////////////////
tempdata=0;
}
}
}
if( data_final_number!=0)data_final[datanumber++]=tempdata;
EA=0;
SBUF=0X7E;
while(TI==0);TI=0;
for(i=0;i<datanumber;i++)
{
SBUF=data_final[i];
while(TI==0);TI=0;
}EA=1;
}
//设置相位
set_phase()
{
unsigned char *p;
unsigned short check_temp;
unsigned int i;
unsigned int j,k;
unsigned char beginbit=0;
datanumber=0;
data_final_number=0;
//设置相位 0X5000
// EA=0;
if(checkdata[5]==0){
for(i=0;i<289;i++){
XBYTE[0X5000+i]=checkdata[5+i];
k=eeprom_addr;
k=k+i;
XBYTE[k]=checkdata[5+i];
k=0;
do{k++;WatchDog = !WatchDog;}while(k<800);
}
}else{
for(i=0;i<289;i++){
XBYTE[0X5121+i]=checkdata[5+i];
k=eeprom_addr;
k=k+0x121+i;
XBYTE[k]=checkdata[5+i];
k=0;
do{k++;WatchDog = !WatchDog;}while(k<800);
}
}
//EA=1;
//应答
answer_data[0]=h_address;
answer_data[1]=l_address;
answer_data[2]=0xcc;
answer_data[3]=0xc1;
answer_data[4]=0xd4;
p=&answer_data[0];
check_temp=cal_crc(p,5);
answer_data[5]=(check_temp>>8); //crc
answer_data[6]=check_temp; //crc
answer_data[7]=0x7e;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
add_bit=(answer_data[i]>>(7-j))%2;
add_transparences();
tempdata=tempdata+(add_bit<<(7-data_final_number++));
if((add_transparence_valid==1) && (i!=7)){ ///////////////////////////////////
if(data_final_number==8)beginbit=1;
else data_final_number++;
} ///////////////////////////////////
if(data_final_number>=8){ /////////////////////////////////
if(beginbit==1){ ////////////////////
data_final_number=1; ////////////////////////
beginbit=0; ////////////////////
}else{
data_final_number=0;
}
data_final[datanumber++]=tempdata; /////////////////////
tempdata=0;
}
}
}
if( data_final_number!=0)data_final[datanumber++]=tempdata;
EA=0;
SBUF=0X7E;
while(!TI);TI=0;
for(i=0;i<datanumber;i++)
{
SBUF=data_final[i];
while(!TI);TI=0;
}
EA=1;
//更改FPGA数据内容
tran_fpag(0x94,290);
}
//设置阶段表
set_stage()
{
unsigned char *p;
unsigned short check_temp;
unsigned int i;
unsigned int j,k;
unsigned char beginbit=0;
datanumber=0;
data_final_number=0;
//设置阶段表
j=(checkdata[5]-1)*98;
for(i=0;i<98;i++){
XBYTE[0X5242+i+j]=checkdata[5+i]; //一个阶段表写入
k=eeprom_addr;
k=k+0x242+i+j;
XBYTE[k]=checkdata[5+i];
k=0;
do{k++;WatchDog = !WatchDog;}while(k<800);
}
//应答
answer_data[0]=h_address;
answer_data[1]=l_address;
answer_data[2]=0XCC;
answer_data[3]=0XC1;
answer_data[4]=0XD5;
p=&answer_data[0];
check_temp=cal_crc(p,5);
answer_data[5]=(check_temp>>8); //crc
answer_data[6]=check_temp; //crc
answer_data[7]=0x7e;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
add_bit=(answer_data[i]>>(7-j))%2;
add_transparences();
// if((add_transparence_valid==1) && (i!=17))data_final_number++;
tempdata=tempdata+(add_bit<<(7-data_final_number++));
if((add_transparence_valid==1) && (i!=7)){ ///////////////////////////////////
if(data_final_number==8)beginbit=1;
else data_final_number++;
} ///////////////////////////////////
if(data_final_number>=8){ /////////////////////////////////
if(beginbit==1){ ////////////////////
data_final_number=1; ////////////////////////
beginbit=0; ////////////////////
}else{
data_final_number=0;
}
data_final[datanumber++]=tempdata; /////////////////////
tempdata=0;
}
}
}
if( data_final_number!=0)data_final[datanumber++]=tempdata;
EA=0;
SBUF=0X7E;
while(!TI);TI=0;
for(i=0;i<datanumber;i++)
{
SBUF=data_final[i];
while(!TI);TI=0;
}
EA=1;
tran_fpag(0x95,99);
}
//设置当前方案
set_project()
{
unsigned char *p;
unsigned short check_temp;
unsigned int i,k;
unsigned int j;
unsigned char beginbit=0;
data_final_number=0;
datanumber=0;
//设置当前方案
j=(checkdata[5]-1)*41;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -