|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
K/ T2 Y% I( u- F6 e& J5 c; ?* g单片机源程序如下:- #include "STC8A8K64S4A12.h"
- #include <bit_switch.h>
- #include <sfr_switch.h>
- #define R0 DATA[0]
- #define R1 DATA[1]
- #define R2 DATA[2]
- #define R3 DATA[3]
- #define R4 DATA[4]
- #define R5 DATA[5]
- #define R6 DATA[6]
- #define R7 DATA[7]
- #define PCL ((unsigned char data*)&
C_)[1] - #define PCH ((unsigned char data*)&
C_)[0] - #define DPL_ ((unsigned char data*)&DPTR)[1]
- #define DPH_ ((unsigned char data*)&DPTR)[0]
- #define EC ((unsigned char code*)65024)
- #define PDATA ((unsigned char pdata*)0)
- unsigned char A_,B_,SP_;
- unsigned int PC_,DPTR;
- bdata unsigned char PSW_,bit_t;
- idata unsigned char DATA[128];
- xdata unsigned char XDATA[8192];
- sbit P_=PSW_^0;
- sbit F1_=PSW_^1;
- sbit OV_=PSW_^2;
- sbit RS0_=PSW_^3;
- sbit RS1_=PSW_^4;
- sbit F0_=PSW_^5;
- sbit AC_=PSW_^6;
- sbit CY_=PSW_^7;
- sbit B0=bit_t^0;
- sbit B1=bit_t^1;
- sbit B2=bit_t^2;
- sbit B3=bit_t^3;
- sbit B4=bit_t^4;
- sbit B5=bit_t^5;
- sbit B6=bit_t^6;
- sbit B7=bit_t^7;
- void C51_core(){
- unsigned char PSW_b;//PSW备份
- unsigned int PC_t;//PC副本
- switch(EC[PC_]){
- case 0
C_++;break;//空指令 NOP - case 1
C_=EC[PC_+1];break;//短跳转 AJMP ADDR11 00H - case 2
SW_b=EC[PC_+1] CL=EC[PC_+2];PCH=PSW_b;break;//长跳转 LJMP - case 3://累加器循环右移 RR A
- ACC=A_;
- __asm RR A
- PSW_=PSW;
- A_=ACC;
- PC_++;
- break;
- case 4://累加器加1 INC A
- ACC=A_;
- __asm INC A
- PSW_=PSW;
- A_=ACC;
- PC_++;
- break;
- case 5
ATA[EC[PC_+1]]++;PC_+=2;break;//直接地址单元加1 INC DIRECT - case 6
ATA[R0]++;PC_++;break;//间接地址单元加1 INC @R0 - case 7
ATA[R1]++;PC_++;break;//间接地址单元加1 INC @R1 - case 8:R0++;PC_++;break;//寄存器加1 INC R0
- case 9:R1++;PC_++;break;//寄存器加1 INC R1
- case 10:R2++;PC_++;break;//寄存器加1 INC R2
- case 11:R3++;PC_++;break;//寄存器加1 INC R3
- case 12:R4++;PC_++;break;//寄存器加1 INC R4
- case 13:R5++;PC_++;break;//寄存器加1 INC R5
- case 14:R6++;PC_++;break;//寄存器加1 INC R6
- case 15:R7++;PC_++;break;//寄存器加1 INC R7
- case 16:switch16();PC_+=3;break;//直接地址位为1跳转,该位清零 JBC bit,REL
- case 17://短调用子程序 ACALL ADDR11 00H
- DATA[++SP_]=PC_;
- DATA[++SP_]=PC_>>8;
- PC_=EC[PC_+1];
- break;
- case 18://长调用子程序 LCALL ADDR16
- PC_t=PC_+3;
- DATA[++SP_]=PC_t;
- DATA[++SP_]=PC_t>>8;
- PSW_b=EC[PC_+1];
- PCL=EC[PC_+2];
- PCH=PSW_b;
- break;
- case 19://累加器带进位循环右移 RRC A
- PSW=PSW_;
- ACC=A_;
- __asm RRC A
- PSW_=PSW;
- A_=ACC;
- PC_++;
- break;
- case 20:A_--;PC_++;break;//累加器减1 DEC A
- case 21:DATA[EC[PC_+1]]--;PC_+=2;break;//直接单元地址减1 DEC DIRECT
- case 22:DATA[R0]--;PC_++;break;//间接地址单元减1 DEC @R0
- case 23:DATA[R1]--;PC_++;break;//间接地址单元减1 DEC @R1
- case 24:R0--;PC_++;break;//寄存器减1 DEC R0
- case 25:R1--;PC_++;break;//寄存器减1 DEC R1
- case 26:R2--;PC_++;break;//寄存器减1 DEC R2
- case 27:R3--;PC_++;break;//寄存器减1 DEC R3
- case 28:R4--;PC_++;break;//寄存器减1 DEC R4
- case 29:R5--;PC_++;break;//寄存器减1 DEC R5
- case 30:R6--;PC_++;break;//寄存器减1 DEC R6
- case 31:R7--;PC_++;break;//寄存器减1 DEC R7
- case 32:switch32();PC_+=3;break;//直接地址位为1跳转 JB BIT,REL
- case 33:PC_=256+EC[PC_+1];break;//短跳转 AJMP ADDR11 01H
- case 34:PC_=DATA[SP_--]<<8;PC_+=DATA[SP_--];break;//子程序返回 RET
- case 35://累加器循环左移 RL A
- ACC=A_;
- __asm RL A
- PSW_=PSW;
- A_=ACC;
- PC_++;
- break;
- case 36:A_+=EC[PC_+1];PSW_=PSW;PC_+=2;break;//立即数加到累加器 ADD A,#DATA
- case 37:A_+=DATA[EC[PC_+1]];PSW_=PSW;PC_+=2;break;//直接地址单元数据加到累加器 ADD A,DIRECT
- case 38:A_+=DATA[R0];PSW_=PSW;PC_++;break;//间接地址单元数据加到累加器 ADD A,@R0
- case 39:A_+=DATA[R1];PSW_=PSW;PC_++;break;//间接地址单元数据加到累加器 ADD A,@R1
- case 40:A_+=R0;PSW_=PSW;PC_++;break;//寄存器内容加到累加器 ADD A,R0
- case 41:A_+=R1;PSW_=PSW;PC_++;break;//寄存器内容加到累加器 ADD A,R1
- case 42:A_+=R2;PSW_=PSW;PC_++;break;//寄存器内容加到累加器 ADD A,R2
- case 43:A_+=R3;PSW_=PSW;PC_++;break;//寄存器内容加到累加器 ADD A,R3
- case 44:A_+=R4;PSW_=PSW;PC_++;break;//寄存器内容加到累加器 ADD A,R4
- case 45:A_+=R5;PSW_=PSW;PC_++;break;//寄存器内容加到累加器 ADD A,R5
- case 46:A_+=R6;PSW_=PSW;PC_++;break;//寄存器内容加到累加器 ADD A,R6
- case 47:A_+=R7;PSW_=PSW;PC_++;break;//寄存器内容加到累加器 ADD A,R7
- case 48:switch48();PC_+=3;break;//直接地址位为0跳转 JNB BIT,REL
- case 49://短调用子程序 ACALL ADDR11 01H
- DATA[++SP_]=PC_;
- DATA[++SP_]=PC_>>8;
- PC_=256+EC[PC_+1];
- break;
- case 50:PC_++;break;//中断返回 RETI(不支持)
- case 51://累加器带进位循环左移 RLC A
- PSW=PSW_;
- ACC=A_;
- __asm RLC A
- PSW_=PSW;
- A_=ACC;
- PC_++;
- break;
- case 52://立即数带进位加到累加器 ADDC A,#DATA
- PSW_b=EC[PC_+1];
- PSW=PSW_;
- ACC=A_;
- __asm ADDC A,0
- PSW_=PSW;
- A_=ACC;
- PC_+=2;
- break;
- case 53://直接地址单元数据带进位加到累加器 ADDC A,DIRECT
- A_+=DATA[EC[PC_+1]];
- PSW_b=PSW;
- A_+=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_+=2;
- break;
- case 54://间接地址单元数据带进位加到累加器 ADDC A,@R0
- A_+=DATA[R0];
- PSW_b=PSW;
- A_+=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 55://间接地址单元数据带进位加到累加器 ADDC A,@R1
- A_+=DATA[R1];
- PSW_b=PSW;
- A_+=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 56://寄存器带进位加到累加器 ADDC A,R0
- A_+=R0;
- PSW_b=PSW;
- A_+=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 57://寄存器带进位加到累加器 ADDC A,R1
- A_+=R1;
- PSW_b=PSW;
- A_+=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 58://寄存器带进位加到累加器 ADDC A,R2
- A_+=R2;
- PSW_b=PSW;
- A_+=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 59://寄存器带进位加到累加器 ADDC A,R3
- A_+=R3;
- PSW_b=PSW;
- A_+=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 60://寄存器带进位加到累加器 ADDC A,R4
- A_+=R4;
- PSW_b=PSW;
- A_+=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 61://寄存器带进位加到累加器 ADDC A,R5
- A_+=R5;
- PSW_b=PSW;
- A_+=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 62://寄存器带进位加到累加器 ADDC A,R6
- A_+=R6;
- PSW_b=PSW;
- A_+=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 63://寄存器带进位加到累加器 ADDC A,R7
- A_+=R7;
- PSW_b=PSW;
- A_+=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 64:if(CY_)PC_+=(char)EC[PC_+1];PC_+=2;break;//进位位为1跳转 JC REL
- case 65:PC_=512+EC[PC_+1];break;//短跳转 AJMP ADDR11 02H
- case 66:DATA[EC[PC_+1]]|=A_;PC_+=2;break;//直接地址单元与累加器相或 ORL DIRECT,A
- case 67:DATA[EC[PC_+1]]|=EC[PC_+2];PC_+=3;break;//直接地址单元与立即数相或 ORL DIRECT,#DATA
- case 68:A_|=EC[PC_+1];PC_+=2;break;//累加器与立即数相或 ORL A,#DATA
- case 69:A_|=DATA[EC[PC_+1]];PC_+=2;break;//累加器与直接地址单元相或 ORL A,DIRECT
- case 70:A_|=DATA[R0];PC_++;break;//累加器与间接地址单元相或 ORL A,@R0
- case 71:A_|=DATA[R1];PC_++;break;//累加器与间接地址单元相或 ORL A,@R1
- case 72:A_|=R0;PC_++;break;//累加器与寄存器相或 ORL A,R0
- case 73:A_|=R1;PC_++;break;//累加器与寄存器相或 ORL A,R1
- case 74:A_|=R2;PC_++;break;//累加器与寄存器相或 ORL A,R2
- case 75:A_|=R3;PC_++;break;//累加器与寄存器相或 ORL A,R3
- case 76:A_|=R4;PC_++;break;//累加器与寄存器相或 ORL A,R4
- case 77:A_|=R5;PC_++;break;//累加器与寄存器相或 ORL A,R5
- case 78:A_|=R6;PC_++;break;//累加器与寄存器相或 ORL A,R6
- case 79:A_|=R7;PC_++;break;//累加器与寄存器相或 ORL A,R7
- case 80:if(!CY_)PC_+=(char)EC[PC_+1];PC_+=2;break;//进位位为0跳转 JNC REL
- case 81://短调用子程序 ACALL ADDR11 02H
- DATA[++SP_]=PC_;
- DATA[++SP_]=PC_>>8;
- PC_=512+EC[PC_+1];
- break;
- case 82:DATA[EC[PC_+1]]&=A_;PC_+=2;break;//直接地址单元与累加器相与 ANL DIRECT,A
- case 83:DATA[EC[PC_+1]]&=EC[PC_+2];PC_+=3;break;//直接地址单元与立即数相与 ANL DIRECT,#DATA
- case 84:A_&=EC[PC_+1];PC_+=2;break;//累加器与立即数相与 ANL A,#DATA
- case 85:A_&=DATA[EC[PC_+1]];PC_+=2;break;//累加器与直接地址单元相与 ANL A,DIRECT
- case 86:A_&=DATA[R0];PC_++;break;//累加器与间接地址单元相与 ANL A,@R0
- case 87:A_&=DATA[R1];PC_++;break;//累加器与间接地址单元相与 ANL A,@R1
- case 88:A_&=R0;PC_++;break;//累加器与寄存器相与 ANL A,R0
- case 89:A_&=R1;PC_++;break;//累加器与寄存器相与 ANL A,R1
- case 90:A_&=R2;PC_++;break;//累加器与寄存器相与 ANL A,R2
- case 91:A_&=R3;PC_++;break;//累加器与寄存器相与 ANL A,R3
- case 92:A_&=R4;PC_++;break;//累加器与寄存器相与 ANL A,R4
- case 93:A_&=R5;PC_++;break;//累加器与寄存器相与 ANL A,R5
- case 94:A_&=R6;PC_++;break;//累加器与寄存器相与 ANL A,R6
- case 95:A_&=R7;PC_++;break;//累加器与寄存器相与 ANL A,R7
- case 96:if(!A_)PC_+=(char)EC[PC_+1];PC_+=2;break;//累加器为0跳转 JZ REL
- case 97:PC_=768+EC[PC_+1];break;//短跳转 AJMP ADDR11 03H
- case 98:DATA[EC[PC_+1]]^=A_;PC_+=2;break;//直接地址单元与累加器相异或 XRL DIRECT,A
- case 99:DATA[EC[PC_+1]]^=EC[PC_+2];PC_+=3;break;//直接地址单元与立即数相异或 XRL DIRECT,#DATA
- case 100:A_^=EC[PC_+1];PC_+=2;break;//累加器与立即数相异或 XRL A,#DATA
- case 101:A_^=DATA[EC[PC_+1]];PC_+=2;break;//累加器与直接地址单元相异或 XRL A,DIRECT
- case 102:A_^=DATA[R0];PC_++;break;//累加器与间接地址单元相异或 XRL A,@R0
- case 103:A_^=DATA[R1];PC_++;break;//累加器与间接地址单元相异或 XRL A,@R1
- case 104:A_^=R0;PC_++;break;//累加器与寄存器相异或 XRL A,R0
- case 105:A_^=R1;PC_++;break;//累加器与寄存器相异或 XRL A,R1
- case 106:A_^=R2;PC_++;break;//累加器与寄存器相异或 XRL A,R2
- case 107:A_^=R3;PC_++;break;//累加器与寄存器相异或 XRL A,R3
- case 108:A_^=R4;PC_++;break;//累加器与寄存器相异或 XRL A,R4
- case 109:A_^=R5;PC_++;break;//累加器与寄存器相异或 XRL A,R5
- case 110:A_^=R6;PC_++;break;//累加器与寄存器相异或 XRL A,R6
- case 111:A_^=R7;PC_++;break;//累加器与寄存器相异或 XRL A,R7
- case 112:if(A_)PC_+=(char)EC[PC_+1];PC_+=2;break;//累加器非0跳转 JNZ REL
- case 113://短调用子程序 ACALL ADDR11 03H
- DATA[++SP_]=PC_;
- DATA[++SP_]=PC_>>8;
- PC_=768+EC[PC_+1];
- break;
- case 114:switch114();PC_+=2;break;//进位位与直接地址相或 ORL C,BIT
- case 115:PC_=DPTR+A_;break;//相对于DPTR的间接跳转 JMP @A+DPTR
- case 116:A_=EC[PC_+1];PC_+=2;break;//立即数送入累加器 MOV A,#DATA
- case 117:switch117();PC_+=3;break;//立即数送入直接地址单元 MOV DIRECT,#DATA
- case 118:DATA[R0]=EC[PC_+1];PC_+=2;break;//立即数送入间接地址单元 MOV @R0,#DATA
- case 119:DATA[R1]=EC[PC_+1];PC_+=2;break;//立即数送入间接地址单元 MOV @R1,#DATA
- case 120:R0=EC[PC_+1];PC_+=2;break;//立即数送入寄存器 MOV R0,#DATA
- case 121:R1=EC[PC_+1];PC_+=2;break;//立即数送入寄存器 MOV R1,#DATA
- case 122:R2=EC[PC_+1];PC_+=2;break;//立即数送入寄存器 MOV R2,#DATA
- case 123:R3=EC[PC_+1];PC_+=2;break;//立即数送入寄存器 MOV R3,#DATA
- case 124:R4=EC[PC_+1];PC_+=2;break;//立即数送入寄存器 MOV R4,#DATA
- case 125:R5=EC[PC_+1];PC_+=2;break;//立即数送入寄存器 MOV R5,#DATA
- case 126:R6=EC[PC_+1];PC_+=2;break;//立即数送入寄存器 MOV R6,#DATA
- case 127:R7=EC[PC_+1];PC_+=2;break;//立即数送入寄存器 MOV R7,#DATA
- case 128:PC_+=(char)EC[PC_+1];PC_+=2;break;//相对跳转 SJMP rel
- case 129:PC_=1024+EC[PC_+1];break;//短跳转 AJMP ADDR11 04H
- case 130:switch130();PC_+=2;break;//进位位与直接地址位相与 ANL C,BIT
- case 131:A_=EC[PC_+A_];PC_++;break;//以PC为基地址变址寻址单元中的数据送入累加器 MOVC A,@A+PC
- case 132:A_/=B_;PSW_=PSW;A_=ACC;B_=B;PC_++;break;//A除以B DIV AB
- case 133:DATA[EC[PC_+2]]=DATA[EC[PC_+1]];PC_+=3;break;//直接地址单元数据送入直接地址单元 MOV DIRECT,DIRECT
- case 134:DATA[EC[PC_+1]]=DATA[R0];PC_+=2;break;//间接地址单元数据送入直接地址单元 MOV DIRECT,@R0
- case 135:DATA[EC[PC_+1]]=DATA[R1];PC_+=2;break;//间接地址单元数据送入直接地址单元 MOV DIRECT,@R1
- case 136:DATA[EC[PC_+1]]=R0;PC_+=2;break;//寄存器内容送入直接地址单元 MOV DIRECT,R0
- case 137:DATA[EC[PC_+1]]=R1;PC_+=2;break;//寄存器内容送入直接地址单元 MOV DIRECT,R1
- case 138:DATA[EC[PC_+1]]=R2;PC_+=2;break;//寄存器内容送入直接地址单元 MOV DIRECT,R2
- case 139:DATA[EC[PC_+1]]=R3;PC_+=2;break;//寄存器内容送入直接地址单元 MOV DIRECT,R3
- case 140:DATA[EC[PC_+1]]=R4;PC_+=2;break;//寄存器内容送入直接地址单元 MOV DIRECT,R4
- case 141:DATA[EC[PC_+1]]=R5;PC_+=2;break;//寄存器内容送入直接地址单元 MOV DIRECT,R5
- case 142:DATA[EC[PC_+1]]=R6;PC_+=2;break;//寄存器内容送入直接地址单元 MOV DIRECT,R6
- case 143:DATA[EC[PC_+1]]=R7;PC_+=2;break;//寄存器内容送入直接地址单元 MOV DIRECT,R7
- case 144:DPH_=EC[PC_+1];DPL_=EC[PC_+2];PC_+=3;break;//16位立即数送入数据指针 MOV DPTR,#DATA16
- case 145://短调用子程序 ACALL ADDR11 04H
- DATA[++SP_]=PC_;
- DATA[++SP_]=PC_>>8;
- PC_=1024+EC[PC_+1];
- break;
- case 146:switch146();PC_+=2;break;//进位位送入直接地址位 MOV BIT,C
- case 147:A_=EC[DPTR+A_];PC_++;break;//以DPTR为基地址变址寻址单元中的数据送入累加器 MOVC A,@A+DPTR
- case 148://累加器带借位减立即数 SUBB A,#DATA
- A_-=EC[PC_+1];
- PSW_b=PSW;
- A_-=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_+=2;
- break;
- case 149://累加器带借位减直接地址单元内容 SUBB A,DIRECT
- A_-=DATA[EC[PC_+1]];
- PSW_b=PSW;
- A_-=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_+=2;
- break;
- case 150://累加器带借位减间接地址单元内容 SUBB A,@R0
- A_-=DATA[R0];
- PSW_b=PSW;
- A_-=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 151://累加器带借位减间接地址单元内容 SUBB A,@R1
- A_-=DATA[R1];
- PSW_b=PSW;
- A_-=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 152://累加器带借位减寄存器内容 SUBB A,R0
- A_-=R0;
- PSW_b=PSW;
- A_-=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 153://累加器带借位减寄存器内容 SUBB A,R1
- A_-=R1;
- PSW_b=PSW;
- A_-=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 154://累加器带借位减寄存器内容 SUBB A,R2
- A_-=R2;
- PSW_b=PSW;
- A_-=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 155://累加器带借位减寄存器内容 SUBB A,R3
- A_-=R3;
- PSW_b=PSW;
- A_-=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 156://累加器带借位减寄存器内容 SUBB A,R4
- A_-=R4;
- PSW_b=PSW;
- A_-=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 157://累加器带借位减寄存器内容 SUBB A,R5
- A_-=R5;
- PSW_b=PSW;
- A_-=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 158://累加器带借位减寄存器内容 SUBB A,R6
- A_-=R6;
- PSW_b=PSW;
- A_-=(unsigned char)CY_;
- PSW_=PSW_b|PSW;
- PC_++;
- break;
- case 159://累加器带借位减寄存器内容 SUBB A,R7
- A_-=R7;
- PSW_b=PSW;
8 t* x0 [* r. o1 u4 o( d# E
3 r+ @2 {* h0 k |
|