1、EM78xxxxx 指令系统1. EM78xxxxxx 指令概述EM78 系列单片机共有的 47 条(EM78P447 和 451、458 有 48 条) 指令,其寬度为 13 位.每一个指令码可分割成两部份,第一部分为标示指令功能的运算码( OPCODE ),第二部份則指出运算時所需之參数,亦即运算码( OPERAND ).而指令的类型大致可分为下列四种:(1)控制型指令( control operation ): 如INT.等等.(2)面向寄存器(字节操作)型指令( register oriented ): 如MOV A, Reg_B ; move Reg_B to AADD Reg_B,
2、 A ; add Reg_B with A, and; save in Reg_B. 等等.(3)位操作型指令( bit oriented ): 如BC,JBS.等等.(4)常数型指令( constant operation ):如MOV A, 0x55 ; move 0x55 to AXOR 0xFF ;Xor A with 0xFF一般而言,EM78 系列八位微控制器除了對 PC (Program Counter)做 “写” 的指令如 (MOV PC, A),需二个指令周期外,其他的指令只需一个指令周期,.2. EM78 指令寻址方式关于对寄存器的存取,必須要先说明寄存器的位址,说明暫存的
3、位址的方式称做寻址方式,EM78 的寻址方式有两种,一种为直接寻址,一种为間接寻址.2.1. 立即数寻址这种方式就是操作数为立即数,可直接从指令中获取.例:MOV A,0x16 ;将常数 0x16 送给寄存器 A2.2. 直接寻址若是使用者要存取寄存器的内容,可以在运算码上直接描述. 例:將寄存器 0X20 的内容,COPY 到寄存器 0X21 中.MOV A, 0X20MOV 0X21, A2.3. 间接寻址这种寻址方式是通过寄存器 R4 来实现的,R4 的 bit0-5 是用来选择寄存器(地址:00-06,0F-3F)若是使用者所需要存取的寄存器,有位址相邻的特性,使用間接寻址是很方便的.
4、 例:写一个程序,將寄存器 0X20 0X3F 的值都填 0.MOV A, 0X20MOV 0X04, AAGAIN:CLR 0INC 0X04MOV A, 0X04XOR A, 0X3FJBS 0X03, 2JMP AGAINEND:2.4. 位寻址这种位寻址是对寄存器中的任一位(bit)进行操作.例:BS 0x12,2 ;将寄存器 0x12 的第 2 位置为“1”.3. EM78 指令说明1. ADD 加语法 ADD A,R编码 0 0011 10rr rrrr操作 A+RA对标志位影响 D,C,DC说明 无举例 实现 A=R11+R12:MOV A,0X11ADD A,0X12语法 AD
5、D R,A编码 0 0011 11rr rrrr操作 A+RR对标志位影响 Z,C,DC说明 无举例 实现 R10=R11+R12:MOV A,0X11MOV 0X10,AMOV A,0X12ADD 0X10,A语法 ADD A,K编码 1 1111 kkkk kkkk操作 A+KA对标志位影响 Z,C,DC说明 无举例 实现 A=0X01+0X01:MOV A,0X01ADD A,0X012. AND 与语法 AND A,R编码 0 0010 10rr rrrr操作 AP6 口输入AND A,0X10 ;相与MOV 0X6,A ;P6 口输出语法 AND R,A编码 0 0010 11rr
6、rrrr操作 AR10=00001111BC 0X10,3 ;R10=000001114. BS 位置 1语法 BS R,b编码 0 101b bbrr rrrr操作 1R(b)对标志位影响 无说明 R 寄存器第 b 位置 1举例 置 C 标志为 1:BS 0X3,05. CALL 子程序调用语法 CALL K编码 1 00kk kkkk kkkk操作 PC+1栈顶,KPC(9:0),R3(7:5)PC(12:10)对标志位影响 无说明 当调用子程序时 ,首先将返回地址入栈 ,由 K 指定的 10 位地址装入 PC(9:0),页面选择位 PS2,PS1,PS0 装入 PC(12:10)举例 H
7、ERE:CALL SUBRTNCONT:MOV A,10指令执行前,PC 为 HERE 地址,执行后,PC 为 SUBRTN 地址,栈顶为 CONT 地址6. CLRA 清累加器 A语法 CLRA编码 0 0000 1000 0000操作 0A对标志位影响 1Z说明 无举例 CLRA7. CLR 清寄存器语法 CLR R编码 0 0000 11rr rrrr操作 0R对标志位影响 1Z说明 无举例 CLR 0X108. COMA R 寄存器取补,存于 A语法 COMA R编码 0 0100 10rr rrrr操作 A对标志位影响 Z说明 无举例 P6 口输入,取补后再由 P6 口输出:MOV
8、A,0X6MOV 0X10,ACOMA 0X10MOV 0X6,A9. COM R 取补语法 COM R编码 0 0100 11rr rrrr操作 R对标志位影响 Z说明 无举例 COM 0X1010. CONTR 读 CONT 寄存器语法 CONTR编码 0 0000 0001 0100操作 CONTA对标志位影响 无说明 无举例 CONTR11. CONTW 写 CONT 寄存器语法 CONTW编码 0 0000 0000 0010操作 A 寄存器值送入 CONT 寄存器对标志位影响 无说明 无举例 MOV A,0X83CONTW ;0X83 为 10000011;分频系数 1:16,预分
9、频器分配给 TCC;TCC 加 1 由 TCC 引脚低到高变化触;发,TCC 信号源为内部时钟,禁止;中断,P7 内部上拉禁止.12. DAA 十进制调整语法 DAA编码 0 0000 0000 0001操作 若A9或DC=1则 A+6- A若A9或C=1则 A+6- A对标志位影响 C说明 该指令对累加器中的 8 位数值进行调整(该值为两个组合 BCD 数之和) 产生两位十进制数,每位由 4 位 2 进制数表示举例 执行 6+9 的十进制加法MOV A,0X6MOV 0X10,AMOV A,0X9ADD A,0X10 ;A=0XFDAA ;A=15H(组合 BCD 数)13. DECA R
10、减 1,存于 A语法 DECA R编码 0 0001 10rr rrrr操作 R1A对标志位影响 Z说明 将 R 寄存器减 1,结果存于累加器中举例 说明如何制作一个计数 16 次的循环:STATUS = 3 ;状态寄存器Z_FLAG = 2MOV A,0X10MOV 0X10,ALOOP:DECA 0X10MOV 0X10,AJBS STATUS,Z_FLAGJMP LOOP14. DEC R 减 1语法 DEC R编码 0 0001 11rr rrrr操作 R1R对标志位影响 Z说明 无举例 说明如何制作一个计数 16 次的循环:STATUS = 3 ;状态寄存器Z_FLAG = 2MOV
11、 A,0X10MOV 0X10,ALOOP:DEC 0X10JBS STATUS,Z_FLAGJMP LOOP15. DISI 禁止中断语法 DISI编码 0 0000 0001 0001操作 0INT对标志位影响 无说明 清 INT 位为 0,禁止全局中断举例 DISI ;禁止中断16. DJZA 语法 DJZA R编码 0 0101 10rr rrrr操作 R1A,为 0 则跳过下一指令对标志位影响 无说明 R 寄存器减 1,结果存入 A,为 0 则跳过下一指令举例 HERE:DJZA 0X9COUNT:MOV A,0X10SKIP:ADD A,10DJZA 指令执行前,PC 为 HERE
12、 地址,执行后,A=R91,若 A=0,PC 为 SKIP 地址,若 A0,PC为 COUNT 地址.17. DJZ 语法 DJZ R编码 0 0101 11rr rrrr操作 R1R,为 0 则跳过下一指令对标志位影响 无说明 无举例 实现 LOOP 段程序执行 100 次:MOV A,100MOV 0X10,ALOOP:DJZ 0X10 ;未执行完 100 次,JMP LOOP ;则跳回 LOOPS18. ENI 中断使能语法 ENI编码 0 0000 0001 0000操作 1INT对标志位影响 无说明 置 INT 位为 1,使能全局中断举例 ENI ;使能中断19. IOR 读控制寄存
13、器语法 IOR R编码 0 0000 0001 rrrr操作 IOCRA对标志位影响 无说明 将控制寄存器内容读出至 A 寄存器,不可用 MOV 指令举例 IOR 0XF ;获得 IOCF 内容MOV 0X10,A ;存入 0X10 寄存器20. IOW 写控制寄存器语法 IOW R编码 0 0000 0000 rrrr操作 AIOCR对标志位影响 无说明 A 寄存器值移入控制寄存器 IOCR举例 将 P6 口奇数位置为内部上拉,P6 口控制寄存器为 0XDMOV A,0XAAIOW 0XD21. INC R 加 1语法 INC R编码 0 0101 01rr rrrr操作 R+1R对标志位影
14、响 Z说明 无举例 INC 0X1022. INCA R 加 1,存于 A 寄存器语法 INCA R编码 0 0101 00rr rrrr操作 R+1A对标志位影响 Z说明 无举例 对外部中断计数,达到一百次,则设置一些标志:STATUS = 0X03 ;状态寄存器ISR = 0X0F ;中断状态寄存器FLAG = 0X10COUNTER = 0X11A_BUF = 0X12 ;A 缓冲器S_BUF = 0X13 ;状态缓冲器TMO_FLG = 0 ;次数达到标志TCIF = 0EXIF = 3Z_FLAG = 2EXT_INT :DISI ;禁止中断BC ISR,EXIF ;EXIF 标志清
15、 0MOV A_BUF,A ;备份 AMOV A,STATUSMOV S_BUF,A ;备份状态寄存器INCA COUNTER ;次数加 1MOV COUNTER,AXOR A,100 ;到 100 次,则 TMO_FLGJBC STATUS,Z_FLAG ;标志置 1BS FLAG,TMO_FLGMOV A,S_BUFMOV STATUS,A ;恢复状态寄存器MOV A,A_BUF ;恢复 A,Z 标志可能BC STATUS,Z_FLAG ;会改变,故需JBC S_BUF,Z_FLAG ;要恢复 Z 标志BS STATUS,Z_FLAGRETI23. INT 软件中断指令语法 INT编码 1
16、 1110 0000 0001操作 PC+1栈顶,001HPC对标志位影响 无说明 执行软件中断时,返回地址(PC+1)入栈,PC 为 0X001举例 ORG 0X001JMP SET_INTSET_INT:RETIMAIN:HERE:INTCONT:CLRAINT 指令执行前,PC 为 HERE 地址,执行后 PC=001H,栈顶为 CONT 地址24. JBC 位检测,为 0 则跳过下一指令语法 JBC R,b编码 0 110b bbrr rrrr操作 若 R(b)=0,则跳过下一指令对标志位影响 无说明 无举例 检测 R10.0 的内容,若为 0,则 P5.0 输出 0,否则输出 1:J
17、BC 0X10,0BS 0X5,0JBS 0X10,0BC 0X5,025. JBS 位检测,为 1 则跳过下一指令语法 JBS R,b编码 0 111b bbrr rrrr操作 若 R(b)=1,跳过下一指令对标志位影响 无说明 无举例 HERE:JBS 0X9,3COUNT:MOV A,0X10SKIP:ADD A,10JBS 指令执行前,PC 为 HERE 地址,执行后,若 R9(3)=0,PC 为 COUNT 地址,若 R9(3)0,PC 为SKIP 地址 .26. JMP 无条件跳转语法 JMP K编码 1 01kk kkkk kkkk操作 KPC(9:0),R3(7:5)PC(12
18、:10)对标志位影响 无说明 执行无条件跳转时,由 K 指定的 10 位地址装入 PC(9:0), 页面选择位 PS2,PS1,PS0 装入 PC(12:10)举例 HERE:JMP BRANCH指令执行前,PC 为 HERE 地址,执行后为 BRANCH 地址27. JZ 语法 JZ R编码 0 0111 11rr rrrr操作 R+1R,结果为 0 则跳过下一指令对标志位影响 无说明 无举例 HERE:JZ 0X9COUNT:MOV A,0X10SKIP:ADD A,10JZ 指令执行前,PC 为 HERE 地址,执行后,R9=R91,若 R9=0,PC 为 SKIP 地址,若 R90,P
19、C 为COUNT 地址.28. JZA语法 JZA R编码 0 0111 10rr rrrr操作 R+1A,结果为 0 则跳过下一指令对标志位影响 无说明 无举例 实现 P6 口输出递增的二进制数:MOV A,0LOOP:MOV 0X6,AMOV 0X10,AJZA 0X10JMP LOOP29. MOV 数据转移语法 MOV R,A编码 0 0000 01rr rrrr操作 AR对标志位影响 无说明 无举例 MOV 0X10,A语法 MOV A,R编码 0 0100 00rr rrrr操作 RA对标志位影响 Z说明 R 寄存器内容移至 A 中,结果为 0 则 Z 标志置 1举例 MOV A,
20、0X10语法 MOV R,R编码 0 0100 01rr rrrr操作 RR对标志位影响 Z说明 源寄存器与目的寄存器应为同一寄存器,主要用于获得 Z 标志举例 MOV 0X10,0X10语法 MOV A,K编码 1 1000 kkkk kkkk操作 KA对标志位影响 无说明 将立即数(8 位)送入 A举例 MOV A,0X1130. NOP 空指令语法 NOP编码 0 0000 0000 0000操作 空操作对标志位影响 无说明 空操作,用于延时举例 P50 输出 3s 的脉冲(系统时钟 2MHz)BS 0X5,0X0 ;P50 输出为高NOP ;延迟两个指令周期NOPBC 0X5,0X0
21、; P50 输出为低31. OR 或语法 OR A,R编码 0 0010 00rr rrrr操作 ARA对标志位影响 Z说明 无举例 无语法 OR R,A编码 0 0010 01rr rrrr操作 ARR对标志位影响 Z说明 无举例 无语法 OR A,K编码 1 1001 kkkk kkkk操作 AKA对标志位影响 Z说明 无举例 无32. RET 子程序返回语法 RET编码 0 0000 0001 0010操作 栈顶PC对标志位影响 无说明 从子程序返回,栈顶值弹入 PC举例 TEST:RETCALL TESTHERE:ADD A,0X2;RET 执行前,栈顶为 HERE 地址;执行后,HE
22、RE 地址装入 PC33. RETI 中断返回语法 RETI编码 0 0000 0001 0011操作 栈顶PC,1INT对标志位影响 无说明 由中断程序返回,栈顶弹入 PC,使能全局中断举例 INTRTN: ;中断子程RETIMAIN: ;中断发生HERE: ;指令执行前,栈顶为 HERE 地址;执行后,HERE 地址移入 PC,INT 置 134. RETL 查表指令语法 RETL K编码 1 1100 kkkk kkkk操作 KA,栈顶PC对标志位影响 无说明 由子程返回,立即数 K 载入 A,栈顶弹入 PC.该指令多用于查表.举例构造 7 段 LED 译码表,7 段 LED 连在 P6
23、 口;寄存器定义PC = 2TRANS:ADD PC,ARETL 0B11111100RETL 0B01100000RETL 0B11011010RETL 0B11110010RETL 0B01100110RETL 0B10110110RETL 0B10111110RETL 0B11100000RETL 0B11111110RETL 0B11110110MAIN:MOV A,0X10CALL TRANSMOV 0X6,A ;输出至 7 段 LED35. RLC R 寄存器带 C 标志循环左移语法 RLC R编码 0 0110 11rr rrrr操作 R(n)R(n+1),R(7)C,CR(0)
24、对标志位影响 C说明 无举例 无36. RLCA R 寄存器带 C 标志循环左移,存于 A语法 RLCA R编码 0 0110 10rr rrrr操作 R(n)A(n+1),R(7)C,CA(0)对标志位影响 C说明 R 寄存器内容及 C 标志循环左移,结果存于累加器举例 实现 16 位数(R10,R11)的左移:RLCA 0X11;将 0X11 最高位移入 C 标志RLC 0X10RLC 0X1137. RRC R 寄存器带 C 标志循环右移语法 RRC R编码 0 0110 01rr rrrr操作 R(n)R(n1),R(0)C,CR(7)对标志位影响 C说明 R 寄存器带 C 标志右移举
25、例 MOV A,0X0FBC 0X3,0MOV 0X10,ARRC 0X1038. RRCA R 带 C 标志循环右移,存于 A语法 RRCA R编码 0 0110 00rr rrrr操作 R(n)A(n1),R(0)C,CA(7)对标志位影响 C说明 R 寄存器内容及 C 标志循环右移,结果存于累加器举例 用该指令实现不带 C 标志的右移 ,结果输出至 P5 口 :BIT_BUF = 10COUNTER = 11MOV A,8MOV COUNTER,ALOOP:RRCA BIT_BUF ;将最低位移入 C 标志RRCA BIT_BUFMOV 0X5,AMOV BIT_BUF,ADJZ COU
26、NTERJMP LOOP39. SLEP 休眠语法 SLEP编码 0 0000 0000 0011操作 00HWDT,0预分频器(若分配给 WDT),0P,1T对标志位影响 P,T说明 休眠模式下,晶振停振举例 SLEP ;单片机进入休眠模式40. SUB 减语法 SUB A,R编码 0 0001 00rr rrrr操作 RAA对标志位影响 Z,C,DC说明 无举例 SUB A,0X10语法 SUB R,A编码 0 0001 01rr rrrr操作 RAR对标志位影响 Z,C,DC说明 无举例 SUB 0X10,A语法 SUB A,K编码 1 1101 kkkk kkkk操作 KAA对标志位影
27、响 Z,C,DC说明 无举例 计算式 A=0X99-0X55 的完成 :MOV A,0X99MOV 0X10,AMOV A,0X55SUB A,0X10计算式 A=0X02-A 的完成:MOV A,0X01 ;A=0X01SUB A,0X02 ;A=0X02-0X01=0X01;C 标志为 1,结果为;正值41. SWAP R 寄存器高低 4 位交换语法 SWAP R编码 0 0111 01rr rrrr操作 R(3:0)R(7:4)对标志位影响 无说明 无举例 MOV A,0X43 MOV 0X10,A ; R10=0X43SWAP 0X10 ;R10=0X3442. SWAPA R 寄存器
28、高低 4 位交换,结果存入 A语法 SWAPA R编码 0 0111 00rr rrrr操作 R(3:0)A(7:4)R(7:4)A(3:0)对标志位影响 无43. WDTC 清 WDT语法 WDTC编码 0 0000 0000 0100操作 00HWDT,0预分频器(若分配给 WDT),1P,1T对标志位影响 P,T说明 无举例 WDTC ;WDTC 清 044. XOR 异或语法 XOR A,R编码 0 0011 00rr rrrr操作 ARA对标志位影响 Z说明 无举例 测试 0X10 寄存器的内容是否为 0X55,若不是则跳转到 ERROR 子程序:STATUS = 3Z_FLAG =
29、 2MOV A,0X55XOR A,0X10JBS STATUS,Z_FLAGJMP ERROR语法 XOR R,A编码 0 0011 01rr rrrr操作 ARR对标志位影响 Z说明 无举例 实现 R10=R11R12:MOV A,0X11MOV 0X10,AMOV A,0X12XOR 0X10,A语法 XOR A,K编码 1 1011 kkkk kkkk操作 AKA对标志位影响 Z说明 无举例 实现 A=A0XF0:MOV A,0X00XOR A,0XF04. 指 令 速 查 表二 进 制 指 令 十六进制 符 号 操 作 影响标志0 0000 0000 0000 0000 NOP 无操
30、作 无0 0000 0000 0001 0001 DAA 十进制调整 A C0 0000 0000 0010 0002 CONTW A CONT 无0 0000 0000 0011 0003 SLEP 0 WDT,停振荡器 T,P0 0000 0000 0100 0004 WDTC 0 WDT T,P0 0000 0000 Rrrr 000r IOW R A IOCR 无 0 0000 0001 0000 0010 ENI 允许 中断 无0 0000 0001 0001 0011 DISI 禁止 中断 无0 0000 0001 0010 0012 RET 堆栈顶 PC 中断返回 无0 0000
31、 0001 0011 0013 RETI 堆栈顶 PC, 中断返回 无0 0000 0001 0100 0014 CONTR CONT A 无0 0000 0001 Rrrr 001r IOR R IOCR A 无 0 0000 01rr Rrrr 00rr MOV R,A A R 无0 0000 1000 0000 0080 CLRA 0 A Z0 0000 11rr Rrrr 00rr CLR R 0 R Z0 0001 00rr Rrrr 01rr SUB A, R R-A A Z,C,DC0 0001 01rr Rrrr 01rr SUB R,A R-A R Z,C,DC0 0001
32、10rr Rrrr 01rr DECA R R-1 A Z0 0001 11rr Rrrr 01rr DEC R R-1 R Z0 0010 00rr Rrrr 02rr OR A,R A VR A Z0 0010 01rr Rrrr 02rr OR R,A A VR R Z0 0010 10rr rrrr 02rr AND A,R A & R A Z0 0010 11rr rrrr 02rr AND R,A A & R R Z0 0011 00rr rrrr 03rr XOR A,R A R A Z0 0011 01rr rrrr 03rr XOR R,A A R R Z0 0011 10r
33、r rrrr 03rr ADD A,R A + R A Z,C,DC0 0011 11rr rrrr 03rr ADD R,A A + R R Z,C,DC0 0100 00rr rrrr 04rr MOV A,R R A Z0 0100 01rr rrrr 04rr MOV R,R R R Z0 0100 10rr rrrr 04rr COMA R /R A Z0 0100 11rr rrrr 04rr COM R /R R Z0 0101 00rr rrrr 05rr INCA R R+1 A Z0 0101 01rr rrrr 05rr INC R R+1 R Z0 0101 10rr
34、rrrr 05rr DJZA R R-1 A, 如果为“0”跳过 无0 0101 11rr rrrr 05rr DJZ R R-1 R, 如果为“0”跳过 无0 0110 00rr rrrr 06rr RRCA R R(n) A(n-1)R(0) C, C A(7) C0 0110 01rr rrrr 06rr RRC R R(n) R(n-1)R(0) C, C R(7) C0 0110 10rr rrrr 06rr RLCA R R(n) A(n+1)R(7) C, C A(0) C0 0110 11rr rrrr 06rr RLC R R(n) R(n+1)R(7) C, C R(0)
35、C0 0111 00rr rrrr 07rr SWAPA R R(0-3) A(4-7)R(4-7) A(0-3) 无0 0111 01rr rrrr 07rr SWAP R R(0-3) R(4-7) 无0 0111 10rr rrrr 07rr JZA R R+1 A, 如果为“0”跳过 无0 0111 11rr rrrr 07rr JZ R R+1 R, 如果为“0”跳过 无二 进 制 指 令 十六进制 符 号 操 作 影响标志0 100B BBRR RRRR 0XXX BC R,B 0 R(B) 无 0 101b bbrr rrrr 0xxx BS R,b 1 R(b) 无 0 110
36、b bbrr rrrr 0xxx JBC R,b 如果 R(b)=0, 跳过 无0 111b bbrr rrrr 0xxx JBS R,b 如果 R(b)=1, 跳过 无1 00kk kkkk kkkk 1kkk CALL k PC+1 SP, (页, k) PC 无1 01kk kkkk kkkk 1kkk JMP k (页, k) PC 无1 1000 kkkk kkkk 18kk MOV A,k k A 无1 1001 kkkk kkkk 19kk OR A,k Ak A Z1 1010 kkkk kkkk 1Akk AND A,k A & k A Z1 1011 kkkk kkkk 1
37、Bkk XOR A,k A k A Z1 1100 kkkk kkkk 1Ckk RETL k k A, 堆栈顶 PC 无1 1101 kkkk kkkk 1Dkk SUB A,k k-A A Z,C,DC1 1110 0000 0001 1E01 INT PC+1 SP, 001H PC 无1 1111 kkkk kkkk 1Fkk ADD A,k k+A A Z,C,DC0 0000 0010 0000 0020 TBL R2+ R2R2 的 89 位不改变 Z,C,DC该指令仅能操作于 IOC6, IOCBIOCF .该指令不建议用于 RF 操作.该指令不能用于 RF 操作.该指令只有 EM78P447、451、458/459 这几个芯片才有.符号 “R” 代表寄存器( 包括操作寄存器和通用寄存器), 符号 “b”表示位号,符号“k” 代表 8 位或 10 位