|
函数指针查表法示例
u8 (*fuc_b[256])(u16);
u8 (*fuc_f1[256])(u16);
u8 (*fuc_f2[256])(u16);
u8 (*fuc_f3[256])(u16);
const unsigned char lad[16000] __at (0x0803C000)={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
//lad数组存储的是梯形图指令
u8 FDMUL(u16 i)
{ ...
}
u8 FSECFF(u16 i)
{ ...
}
u8 FANB(u16 i)
{ ...
}
此处略去其他指令的解释函数
。。。
main(void)
{
unsigned int j;
unsigned int i;
for(i=0;i<=255;i++)
{fuc_b[i]=FNO;fuc_f1[i]=FNO;fuc_f2[i]=FNO;fuc_f3[i]=FNO;}
fuc_b[0xff]=FSECFF;
fuc_f2[0xf8]=FANB;//函数与指针一一映射
fuc_f2[0xf9]=FORB;
fuc_f2[0xfa]=FMPS;
fuc_f2[0xfc]=FMPP;
fuc_f2[0xfb]=FMRD;
fuc_f2[0xfd]=FINV;
fuc_b[0x28]=FLDM28;
fuc_b[0x29]=FLDM29;
fuc_b[0x2a]=FLDM2A;
fuc_b[0x2b]=FLDM2B;
fuc_b[0x2c]=FLDM2C;
fuc_b[0x2d]=FLDM2D;
fuc_b[0x2f]=FLDM2F;
fuc_b[0x48]=FANDM48;
fuc_b[0x49]=FANDM49;
fuc_b[0x4a]=FANDM4A;
fuc_b[0x4b]=FANDM4B;
fuc_b[0x4c]=FANDM4C;
fuc_b[0x4d]=FANDM4D;
fuc_b[0x4f]=FANDM4F;
fuc_b[0x68]=FORM68;
fuc_b[0x69]=FORM69;
fuc_b[0x6a]=FORM6A;
fuc_b[0x6b]=FORM6B;
fuc_b[0x6c]=FORM6C;
fuc_b[0x6d]=FORM6D;
fuc_b[0x6f]=FORM6F;
fuc_b[0x38]=FLDIM38;
fuc_b[0x39]=FLDIM39;
fuc_b[0x3a]=FLDIM3A;
fuc_b[0x3b]=FLDIM3B;
fuc_b[0x3c]=FLDIM3C;
fuc_b[0x3d]=FLDIM3D;
fuc_b[0x3f]=FLDIM3F;
fuc_b[0x58]=FANIM58;
fuc_b[0x59]=FANIM59;
fuc_b[0x5a]=FANIM5A;
fuc_b[0x5b]=FANIM5B;
fuc_b[0x5c]=FANIM5C;
fuc_b[0x5d]=FANIM5D;
fuc_b[0x5f]=FANIM5F;
fuc_b[0x78]=FORIM78;
fuc_b[0x79]=FORIM79;
fuc_b[0x7a]=FORIM7A;
fuc_b[0x7b]=FORIM7B;
fuc_b[0x7c]=FORIM7C;
fuc_b[0x7d]=FORIM7D;
fuc_b[0x7f]=FORIM7F;
fuc_b[0x26]=FLDT;
fuc_b[0x46]=FANDT;
fuc_b[0x66]=FORT;
fuc_b[0x36]=FLDIT;
fuc_b[0x56]=FANIT;
fuc_b[0x76]=FORIT;
fuc_b[0x2e]=FLDC;
fuc_b[0x4e]=FANDC;
fuc_b[0x6e]=FORC;
fuc_b[0x3e]=FLDIC;
fuc_b[0x5e]=FANIC;
fuc_b[0x7e]=FORIC;
fuc_b[0x24]=FLDX;
fuc_b[0x44]=FANDX;
fuc_b[0x64]=FORX;
fuc_b[0x34]=FLDIX;
fuc_b[0x54]=FANIX;
fuc_b[0x74]=FORIX;
fuc_b[0x25]=FLDY;
fuc_b[0x45]=FANDY;
fuc_b[0x65]=FORY;
fuc_b[0x35]=FLDIY;
fuc_b[0x55]=FANIY;
fuc_b[0x75]=FORIY;
fuc_b[0xd5]=FSETY;
fuc_b[0xe5]=FRSTY;
fuc_b[0xd8]=FSETM8;
fuc_b[0xe8]=FRSTM8;
fuc_b[0xd9]=FSETM9;
fuc_b[0xe9]=FRSTM9;
fuc_b[0xda]=FSETMA;
fuc_b[0xea]=FRSTMA;
fuc_b[0xdb]=FSETMB;
fuc_b[0xeb]=FRSTMB;
fuc_b[0xdc]=FSETMC;
fuc_b[0xec]=FRSTMC;
fuc_b[0xdd]=FSETMD;
fuc_b[0xed]=FRSTMD;
fuc_b[0x00]=FSEC00;
fuc_b[0x10]=FSEC00;
fuc_b[0x11]=FSEC00;
fuc_f1[0x03]=FSETM8000;
fuc_f1[0x04]=FRSTM8000;
fuc_f1[0x08]=FTRD08;
fuc_f1[0x09]=FTRD09;
fuc_f2[0x85]=FPLSY;
fuc_f2[0x88]=FPLSM8;
fuc_f2[0x89]=FPLSM9;
fuc_f2[0x8a]=FPLSMA;
fuc_f2[0x8b]=FPLSMB;
fuc_f2[0x8c]=FPLSMC;
fuc_f2[0x8d]=FPLSMD;
fuc_f3[0x85]=FPLFY;
fuc_f3[0x88]=FPLFM8;
fuc_f3[0x89]=FPLFM9;
fuc_f3[0x8a]=FPLFMA;
fuc_f3[0x8b]=FPLFMB;
fuc_f3[0x8c]=FPLFMC;
fuc_f3[0x8d]=FPLFMD;
fuc_f1[0x0a]=FTRD0A;
fuc_f1[0x85]=FMCY;
fuc_f1[0x88]=FMCM8;
fuc_f1[0x89]=FMCM9;
fuc_f1[0x8a]=FMCMA;
fuc_f1[0x8b]=FMCMB;
fuc_f1[0x8c]=FMCMC;
fuc_f1[0x8d]=FMCMD;
fuc_f1[0x0b]=FMCR;
fuc_f1[0x56]=FSFTL;
fuc_f1[0x54]=FSFTR;
fuc_b[0xc5]=FOUTY;
fuc_b[0xc8]=FOUTM8;
fuc_b[0xc9]=FOUTM9;
fuc_b[0xca]=FOUTMA;
fuc_b[0xcb]=FOUTMB;
fuc_b[0xcc]=FOUTMC;
fuc_b[0xcd]=FOUTMD;
fuc_f1[0x02]=FOUTMF;
fuc_b[0x06]=FOUTT;
fuc_b[0x0e]=FOUTC;
fuc_f1[0x0c]=FRSTCT;
fuc_f1[0x60]=FZRST;
fuc_f1[0x94]=FALT;
fuc_b[0x01]=FSEC00;
fuc_f1[0xca]=FLDP;
fuc_f1[0xcc]=FANDP;
fuc_f1[0xcb]=FLDF;
fuc_f1[0xcd]=FANDF;
fuc_f1[0xce]=FORP;
fuc_f1[0xcf]=FORF;
fuc_f1[0x28]=FMOV;
fuc_f1[0x29]=FDMOV;
fuc_f1[0x0d]=FRSTD;
fuc_f1[0x40]=FINC;
fuc_f1[0x41]=FDINC;
fuc_f1[0x42]=FDEC;
fuc_f1[0x43]=FDDEC;
fuc_f1[0x38]=FADD;
fuc_f1[0x3a]=FSUB;
fuc_f1[0x3c]=FMUL;
fuc_f1[0x3e]=FDIV;
fuc_f1[0x24]=FCMP;
fuc_f1[0x7b]=FDHSCS;
fuc_f1[0x7d]=FDHSCS;
fuc_f1[0x39]=FDADD;
fuc_f1[0x3b]=FDSUB;
fuc_f1[0x3d]=FDMUL;
fuc_f1[0x3f]=FDDIV;
fuc_f1[0x25]=FDCMP;
fuc_f1[0xd0]=FLD0;//=
fuc_f1[0xd1]=FLDD1;//=
fuc_f1[0xd2]=FLD2;//>
fuc_f1[0xd3]=FLDD3;//>
fuc_f1[0xd4]=FLD4;//<
fuc_f1[0xd5]=FLDD5;//<
fuc_f1[0xd8]=FLD8;//<>
fuc_f1[0xd9]=FLDD9;//<>
fuc_f1[0xdc]=FLD_C;//>=
fuc_f1[0xdd]=FLDD_D;//>=
fuc_f1[0xda]=FLD_A;//<=
fuc_f1[0xdb]=FLDD_B;//<=
fuc_f1[0xe0]=FAND0;//=
fuc_f1[0xe1]=FANDD1;//=
fuc_f1[0xe2]=FAND2;//>
fuc_f1[0xe3]=FANDD3;//>
fuc_f1[0xe4]=FAND4;//<
fuc_f1[0xe5]=FANDD5;//<
fuc_f1[0xe8]=FAND8;//<>
fuc_f1[0xe9]=FANDD9;//<>
fuc_f1[0xec]=FAND_C;//>=
fuc_f1[0xed]=FANDD_D;//>=
fuc_f1[0xea]=FAND_A;//<=
fuc_f1[0xeb]=FANDD_B;//<=
fuc_f1[0xf0]=FOR0;//=
fuc_f1[0xf1]=FORD1;//=
fuc_f1[0xf2]=FOR2;//>
fuc_f1[0xf3]=FORD3;//>
fuc_f1[0xf4]=FOR4;//<
fuc_f1[0xf5]=FORD5;//<
fuc_f1[0xf8]=FOR8;//<>
fuc_f1[0xf9]=FORD9;//<>
fuc_f1[0xfc]=FOR_C;//>=
fuc_f1[0xfd]=FORD_D;//>=
fuc_f1[0xfa]=FOR_A;//<=
fuc_f1[0xfb]=FORD_B;//<=
fuc_f1[0x82]=F_PLSY;
fuc_f1[0x83]=F_DPLSY;
fuc_f1[0x48]=F_ZRN;
fuc_f1[0x49]=F_DZRN;
fuc_f1[0x86]=F_PLSR;
fuc_f1[0x87]=F_DPLSR;
fuc_f1[0x0f]=FEND;
fuc_f1[0x1c]=FEND;
fuc_b[0xb0]=FP;
fuc_f1[0x10]=FCJ;
fuc_f1[0x12]=FCALL;
fuc_f1[0x14]=FSRET;
fuc_b[0xF0]=FSTL0;
fuc_b[0xF1]=FSTL1;
fuc_b[0xF2]=FSTL2;
fuc_b[0xF3]=FSTL3;
fuc_b[0xF7]=FRET;
fuc_f1[0x06]=FSETS;
fuc_f1[0x07]=FRSTS;
fuc_f1[0x05]=FOUTS;
fuc_b[0x20]=FLDS0;
fuc_b[0x40]=FANDS0;
fuc_b[0x60]=FORS0;
fuc_b[0x30]=FLDIS0;
fuc_b[0x50]=FANIS0;
fuc_b[0x70]=FORIS0;
fuc_b[0x21]=FLDS1;
fuc_b[0x41]=FANDS1;
fuc_b[0x61]=FORS1;
fuc_b[0x31]=FLDIS1;
fuc_b[0x51]=FANIS1;
fuc_b[0x71]=FORIS1;
fuc_b[0x22]=FLDS2;
fuc_b[0x42]=FANDS2;
fuc_b[0x62]=FORS2;
fuc_b[0x32]=FLDIS2;
fuc_b[0x52]=FANIS2;
fuc_b[0x72]=FORIS2;
fuc_b[0x23]=FLDS3;
fuc_b[0x43]=FANDS3;
fuc_b[0x63]=FORS3;
fuc_b[0x33]=FLDIS3;
fuc_b[0x53]=FANIS3;
fuc_b[0x73]=FORIS3;
fuc_f1[0x80]=FSPD;
fuc_f1[0x26]=FZCP;
fuc_f1[0x27]=FDZCP;
fuc_f1[0x34]=FBCD;
fuc_f1[0x35]=FDBCD;
fuc_f1[0x36]=FBIN;
fuc_f1[0x37]=FDBIN;
fuc_f1[0x44]=FWAND;
fuc_f1[0x45]=FDAND;
fuc_f1[0x46]=FWOR;
fuc_f1[0x47]=FDOR;
fuc_f2[0x48]=FWXOR;
fuc_f2[0x49]=FDXOR;
fuc_f1[0x62]=FDECO;
fuc_f1[0x64]=FENCO;
fuc_f1[0x74]=FREF;
fuc_f1[0x84]=FPWM;
fuc_f1[0x96]=FRAMP;
fuc_f1[0x4A]=FPLSV;
fuc_f1[0x4B]=FDPLSV;
fuc_f1[0x4C]=FDRVI;
fuc_f1[0x4D]=FDDRVI;
fuc_f1[0x4E]=FDRVI;
fuc_f1[0x4F]=FDDRVI;
fuc_f1[0x50]=FTCMP;
fuc_f1[0x52]=FTZCP;
fuc_f2[0x54]=FTADD;
fuc_f2[0x56]=FTSUB;
fuc_f1[0x5C]=FTRD;
fuc_f1[0x5E]=FTWR;
fuc_f2[0x62]=FHOUR;
fuc_f1[0x63]=FDHOUR;
while(1)
{
STARTRUN:
for(i=0;i<16000;i=i+2)
{
j=(*fuc_b[lad[i+1]])(i);//套入梯形图数据lad[],通过函数指针自动跳转到对应函数
}
}
}
|
|