?? 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 + -