义隆单片机指令集
- 格式:doc
- 大小:59.00 KB
- 文档页数:6
单片机指令大全- - 指令格式功能简述字节数周期一、数据传送类指令MOV A, Rn 寄存器送累加器 1 1MOV Rn,A 累加器送寄存器 1 1MOV A ,@Ri 内部RAM单元送累加器 1 1MOV @Ri ,A 累加器送内部RAM单元 1 1MOV A ,#data 立即数送累加器 2 1MOV A ,direct 直接寻址单元送累加器 2 1MOV direct ,A 累加器送直接寻址单元 2 1MOV Rn,#data 立即数送寄存器 2 1MOV direct ,#data 立即数送直接寻址单元 3 2MOV @Ri ,#data 立即数送内部RAM单元 2 1MOV direct ,Rn 寄存器送直接寻址单元 2 2MOV Rn ,direct 直接寻址单元送寄存器 2 2MOV direct ,@Ri 内部RAM单元送直接寻址单元 2 2 MOV @Ri ,direct 直接寻址单元送内部RAM单元 2 2 MOV direct2,direct1 直接寻址单元送直接寻址单元 3 2 MOV DPTR ,#data16 16位立即数送数据指针 3 2 MOVX A ,@Ri 外部RAM单元送累加器(8位地址) 1 2 MOVX @Ri ,A 累加器送外部RAM单元(8位地址) 1 2 MOVX A ,@DPTR 外部RAM单元送累加器(16位地址) 1 2MOVX @DPTR ,A 累加器送外部RAM单元(16位地址) 1 2 MOVC A ,@A+DPTR 查表数据送累加器(DPTR为基址) 1 2 MOVC A ,@A+PC 查表数据送累加器(PC为基址) 1 2 XCH A ,Rn 累加器与寄存器交换 1 1XCH A ,@Ri 累加器与内部RAM单元交换 1 1 XCHD A ,direct 累加器与直接寻址单元交换 2 1XCHD A ,@Ri 累加器与内部RAM单元低4位交换 1 1 SWAP A 累加器高4位与低4位交换 1 1POP direct 栈顶弹出指令直接寻址单元 2 2PUSH direct 直接寻址单元压入栈顶 2 2二、算术运算类指令ADD A, Rn 累加器加寄存器 1 1ADD A,@Ri 累加器加内部RAM单元 1 1ADD A, direct 累加器加直接寻址单元 2 1ADD A, #data 累加器加立即数 2 1ADDC A, Rn 累加器加寄存器和进位标志 1 1ADDC A,@Ri 累加器加内部RAM单元和进位标志 1 1 ADDC A, #data 累加器加立即数和进位标志 2 1 ADDC A, direct 累加器加直接寻址单元和进位标志 2 1INC A 累加器加1 1 1INC Rn 寄存器加1 1 1INC direct 直接寻址单元加1 2 1INC @Ri 内部RAM单元加1 1 1INC DPTR 数据指针加1 1 2DA A 十进制调整 1 1SUBB A, Rn 累加器减寄存器和进位标志 1 1 SUBB A,@Ri 累加器减内部RAM单元和进位标志 1 1 SUBB A, #data 累加器减立即数和进位标志 2 1 SUBB A, direct 累加器减直接寻址单元和进位标志 2 1 DEC A 累加器减1 1 1DEC Rn 寄存器减1 1 1DEC @Ri 内部RAM单元减1 1 1DEC direct 直接寻址单元减1 2 1MUL AB 累加器乘寄存器B 1 4DIV AB 累加器除以寄存器B 1 4三、逻辑运算类指令ANL A, Rn 累加器与寄存器 1 1ANL A,@Ri 累加器与内部RAM单元 1 1ANL A, #data 累加器与立即数 2 1ANL A, direct 累加器与直接寻址单元 2 1ANL direct, A 直接寻址单元与累加器 2 1ANL direct, #data 直接寻址单元与立即数 3 1ORL A, Rn 累加器或寄存器 1 1ORL A,@Ri 累加器或内部RAM单元 1 1ORL A,#data 累加器或立即数 2 1 ORL A,direct 累加器或直接寻址单元 2 1 ORL direct, A 直接寻址单元或累加器 2 1 ORL direct, #data 直接寻址单元或立即数 3 1 XRL A, Rn 累加器异或寄存器 1 1XRL A,@Ri 累加器异或内部RAM单元 1 1 XRL A,#data 累加器异或立即数 2 1 XRL A,direct 累加器异或直接寻址单元 2 1 XRL direct, A 直接寻址单元异或累加器 2 1 XRL direct, #data 直接寻址单元异或立即数 3 2 RL A 累加器左循环移位 1 1RLC A 累加器连进位标志左循环移位 1 1 RR A 累加器右循环移位 1 1RRC A 累加器连进位标志右循环移位 1 1 CPL A 累加器取反 1 1CLR A 累加器清零 1 1四、控制转移类指令类ACCALL addr11 2KB范围内绝对调用 2 2 AJMP addr11 2KB范围内绝对转移 2 2 LCALL addr16 2KB范围内长调用 3 2 LJMP addr16 2KB范围内长转移 3 2 SJMP rel 相对短转移 2 2JMP @A+DPTR 相对长转移 1 2RET 子程序返回 1 2RET1 中断返回 1 2JZ rel 累加器为零转移 2 2JNZ rel 累加器非零转移 2 2CJNE A ,#data ,rel 累加器与立即数不等转移 3 2 CJNE A ,direct ,rel 累加器与直接寻址单元不等转移 3 2 CJNE Rn,#data ,rel 寄存器与立即数不等转移 3 2 CJNE @Ri ,#data,rel RAM单元与立即数不等转移 3 2 DJNZ Rn ,rel 寄存器减1不为零转移 2 2 DJNZ direct ,rel 直接寻址单元减1不为零转移 3 2 NOP 空操作 1 1五、布尔操作类指令MOV C, bit 直接寻址位送C 2 1MOV bit, C C送直接寻址位 2 1CLR C C清零 1 1CLR bit 直接寻址位清零 2 1CPL C C取反 1 1CPL bit 直接寻址位取反 2 1SETB C C置位 1 1SETB bit 直接寻址位置位 2 1ANL C, bit C逻辑与直接寻址位 2 2ANL C, /bit C逻辑与直接寻址位的反 2 2ORL C, bit C逻辑或直接寻址位 2 2ORL C, /bit C逻辑或直接寻址位的反 2 2JC rel C为1转移 2 2JNC rel C为零转移 2 2JB bit,rel 直接寻址位为1转移 3 2JNB bit,rel 直接寻址为0转移 3 2JBC bit,rel 直接寻址位为1转移并清该位 3 2单片机MCS-51系列指令快速记忆法随着微电子技术和超大规模集成电路技术的发展,单片微型计算机以其体积小、性价比高、功能强、可靠性高等独有的特点,在各个领域(如工业控制、家电产品、汽车电子、通信、智能仪器仪表)得到了广泛的应用。
单片机指令大全(二)引言概述:本文是关于单片机指令大全的第二部分。
在上一部分中,我们介绍了一些常用的单片机指令和其功能。
本文将继续介绍更多的单片机指令,包括数据传输、逻辑运算、算术运算、位操作以及状态寄存器等方面的指令。
这些指令将帮助您更好地理解和使用单片机。
1. 数据传输指令1.1. MOV指令:将一个数据从源操作数传送到目的操作数。
1.2. LDI指令:将一个立即数传送到一个寄存器。
1.3. LDS和STS指令:将数据从SRAM传送到寄存器或将寄存器的数据传送到SRAM。
1.4. IN和OUT指令:将数据从端口传送到寄存器或从寄存器传送到端口。
2. 逻辑运算指令2.1. AND、OR和XOR指令:进行逻辑与、逻辑或和逻辑异或运算。
2.2. NOT指令:对一个寄存器的数据进行逻辑非运算。
2.3. CLR指令:将一个寄存器的数据清零。
3. 算术运算指令3.1. ADD和SUB指令:对两个操作数进行加法或减法运算。
3.2. INC和DEC指令:对一个寄存器的数据进行加1或减1操作。
3.3. MUL和DIV指令:进行乘法和除法运算。
4. 位操作指令4.1. ANDI、ORI和XORI指令:对一个寄存器的数据进行与、或和异或运算。
4.2. SBI和CBI指令:设置或清除一个I/O端口的某个位。
4.3. SBIC和SBIS指令:跳转指令,根据指定的I/O端口位是否被设置或清除执行跳转操作。
5. 状态寄存器相关指令5.1. SEI和CLI指令:设置或清除全局中断。
5.2. SREG指令:用于保存和恢复状态寄存器的值。
5.3. IJMP和EIJMP指令:用于从程序中直接跳转到任意存储器位置。
总结:本文介绍了单片机指令大全的第二部分内容,包括数据传输、逻辑运算、算术运算、位操作以及状态寄存器等方面的指令。
这些指令的功能与用法将有助于您更好地理解和应用单片机。
通过熟练掌握这些指令,您将能够更加灵活地进行单片机程序的设计与开发。
单片机指令大全
单片机指令大全是一种汇编语言和机器语言结合的指令集,它在微处理器内部执行,包括算术运算指令、数据传送指令、控制流指令、I/O操作指令等。
常用的单片机指令大全如下:
1. MOV:移动指令,将源操作数的值移动到目标操作数中。
2. ADD:加法指令,将源操作数的值加上目标操作数的值,并将结果存储在目标操作数中。
3. SUB:减法指令,将源操作数的值减去目标操作数的值,并将结果存储在目标操作数中。
4. CMP:比较指令,比较源操作数的值和目标操作数的值,并设置标志位来标识结果是否大于、小于或等于。
5. AND:逻辑与指令,将源操作数的值与目标操作数的值按位与,并将结果存储在目标操作数中。
6. OR:逻辑或指令,将源操作数的值与目标操作数的值按位或,并将结果存储在目标操作数中。
7. XOR:逻辑异或指令,将源操作数的值与目标操作数的值按位异或,并将结果存储在目标操作数中。
8. JMP:无条件跳转指令,跳转到指定的指令地址。
9. JZ:当ZF(零标志)=1时跳转,跳转到指定的指令地址。
10. JC:当CF(进位标志)=1时跳转,跳转到指定的指令地址。
一、数据传送类指令(8种助记符)MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送;P55PUSH (Push onto Stack) 入栈;PUSH directPOP (Pop from Stack) 出栈;POP directXCH (Exchange) 字节交换;XCH A,源/@RiXCHD (Exchange low-order Digit) 低半字节交换;同上SWAP (Swap) 低4位与高4位交换;SWAP A MOVC(Move Code)读取程序存储器数据表格的数据传送;MOVC A,@A+DPTR/PC MOVX (Move External RAM) 对外部RAM的数据传送;MOVX @DPTR,A MOVX A,@DPTR/@Ri MOVX @Ri,A二、算术运算类指令(8种助记符)ADD(Addition) 加法;ADDC(Add with Carry) 带进位加法;INC(Increment) 加1;INC A/Rn/direct/@Ri/源/DPTRDA(Decimal Adjust) 十进制调整;SUBB(Subtract with Borrow) 带借位减法;DEC(Decrement) 减1;DEC A/Rn/direct/@Ri/源MUL(Multiplication、Multiply) 乘法;MUL AB 高B,低A。
Cy=0 大于256,OV=1 DIV(Division、Divide) 除法;DIV AB 商A,余B。
Cy=0 OV=B(同上)三、逻辑运算类指令(9种助记符)CLR(Clear) 清零;CLR ACPL(Complement) 取反;CPL ARL(Rotate left) 循环左移;(同上)RLC(Rotate Left throught the Carry flag) 带进位循环左移;(同上)RR(Rotate Right) 循环右移;(同上)RRC (Rotate Right throught the Carry flag) 带进位循环右移;(同上)ANL(AND Logic) 逻辑与;ANL A,#data/Rn/direct/@Ri ANL direct,A/#dataORL(OR Logic) 逻辑或;ORL A,#data/Rn/direct/@Ri ANL direct,A/#dataXRL(Exclusive-OR Logic) 逻辑异或;(同上)四、位操作指令(6种助记符)MOV 位数据传送指令;MOV C,bit MOV bit,CCLR 位清零;C bitSETB(Set Bit)位置1;C bitCPL位取反;(同上)ANL位逻辑运算指令;ANL C,bit//bitORL位逻辑或运算指令;(同上)五、控制转移类指令(18种助记符)AJMP(Absolute Jump)绝对转移;AJMP addr11/ LABELLJMP(Long Jump)长转移;(同上)SJMP(Short Jump)短转移;SJMP rel/ LABELJMP间接转移指令; JMP @A+DPTRJZ (Jump if Zero)结果为0则转移;JZ rel/ LABELJNZ (Jump if Not Zero) 结果不为0则转移;(同上)CJNE (Compare Jump if Not Equal)比较不相等则转移;CJNE A,direct,rel/ LABEL CJNE A/Rn/@Ri,#data,rel/ LABELJC (Jump if the Carry flag is set)有进位则转移;JC rel/ LABELJNC (Jump if Not Carry)无进位则转移;(同上)JB (Jump if the Bit is set)位为1则转移;JB bit, rel/ LABELJNB (Jump if the Bit is Not set) 位为0则转移;(同上)JBC(Jump if the Bit is set and Clear the bit) 为1则转移,并清除该位;DJNZ (Decrement Jump if Not Zero)减1后不为0则转移;DJNZ Rn,rel/ LABEL DJNZ direct,rel/ LABELLCALL(Long subroutine Call)子程序长16调用;LCALL addr16/ SUBROUTINEACALL(Absolute subroutine Call)子程序绝对11调用;(同上)RET(Return from subroutine)子程序返回;RETI(Return from Interruption)中断返回;NOP (No Operation) 空操作;8种常用伪指令1.ORG 16位地址;此指令用在原程序或数据块的开始,指明此语句后面目标程序或数据块存放的起始地址。
单片机指令以A开头的指令有18条,分别为:1、ACALL addr11指令名称:绝对调用指令指令代码:A10 A9 A8 10001 A7 A6 A5 A4 A3 A2 A1 A0指令功能:构造目的地址,进行子程序调用。
其方法是以指令提供的11位地址(al0~a0),取代PC的低11位,PC的高5位不变。
操作容:PC←(PC)+2SP←(SP)+1(SP)←(PC)7~0SP←(SP)+1(SP)←(PC)15~8PC10~0←addrl0~0字节数: 2机器周期:2使用说明:由于指令只给出子程序入口地址的低11位,因此调用围是2KB。
2、ADD A,Rn指令名称:寄存器加法指令指令代码:28H~2FH指令功能:累加器容与寄存器容相加操作容:A←(A)+(Rn), n=0~7字节数: 1机器周期;1影响标志位:C,AC,OV3、ADD A,direct指令名称:直接寻址加法指令指令代码:25H指令功能:累加器容与部RAM单元或专用寄存器容相加操作容:A←(A)+(direct)字节数: 2机器周期:1影响标志位:C,AC,OV4、ADD A,@Ri ’指令名称:间接寻址加法指令指令代码:26H~27H指令功能:累加器容与部RAM低128单元容相加操作容:A←(A)+((Ri)), i=0,1字节数: 1机器周期:1影响标志位:C,AC,OV5、ADD A,#data指令名称:立即数加法指令指令代码:24H指令功能:累加器容与立即数相加操作容:A←(A)+data字节数: 2机器周期:1影响标志位:C,AC,OV6、ADDC A,Rn指令名称:寄存器带进位加法指令指令代码:38H~3FH指令功能:累加器容、寄存器容和进位位相加操作容:A←(A)+(Rn)+(C), n=0~7字节数: 1 机器周期:1 影响标志位:C,AC,OV7、ADDC A,direct指令名称:直接寻址带进位加法指令指令代码:35H指令功能:累加器容、部RAM低128单元或专用寄存器容与进位位加操作容:A←(A)+(direct)+(C)字节数: 2机器周期:1影响标志位:C,AC,OV8、ADDC A,@Ri指令名称:间接寻址带进位加法指令指令代码:36H~37H指令功能:累加器容, 部RAM低128单元容与进位位相加操作容:A←(A)+((Ri))+(C), i=0,1字节数: 1机器周期:1影响标志位:C,AC,OV9、ADDC A,#data指令名称:立即数带进位加法指令指令代码:34H指令功能:累加器容、立即数与进位位相加操作容:A←(A)+data+(C)字节数: 2机器周期:1影响标志位:C,AC,OV10、AJMP addr11指令名称:绝对转移指令指令代码:A10 A9 A8 1 0 0 0 1 A7 A6 A5 A4 A3 A2 A1 A0 指令功能:构造目的地址,实现程序转移。
基于EM78P153S的应用设计(V1.0)目录第一章EM78P153S的初识 (1)1.1 EM78P152/3S特性 (1)1.2 EM78P152/3S引脚 (2)1.3 功能寄存器 (2)1.3.1 累加器与端口控制寄存器 (2)1.3.2中断状态寄存器与中断使能寄存器 (3)1.3.3 操作寄存器 (4)1.3.4 特殊功能寄存器 (6)1.4 数据存储器的配置 (7)1.5 休眠与唤醒 (7)1.6 分频器 (9)1.7 定时器/计数器TCC (9)第二章EM78系列单片机应用软件的编辑与仿真 (11)2.1 Simulator的下载与安装 (11)2.2 Simulator的使用方法 (11)2.3 Simulator系统常用命令汇总 (14)2.4 Simulator仿真中的常见问题 (15)第三章EM78系列单片机的汇编指令 (17)3.1 寻址方式 (17)3.2 伪指令 (18)3.3 指令速查表 (18)第四章EM78P153S应用软件设计 (20)4.1 外部中断程序 (20)4.2 花样灯程序 (22)4.2.1 设计需求 (22)4.2.2 软件设计 (23)4.2.3 硬件设计 (37)4.2.4 元器件明细表 (38)第五章EM78系列单片机应用程序的烧录 (39)5.1 程序的转换过程 (39)5.2 烧录器与烧录软件 (40)5.3 烧录步骤 (41)第一章 EM78P153S的初识EM78P152/3S是采用低功耗高速CMOS工艺设计开发的8位微控制器,它的内部有一个1024×13位一次性可编程只读存储器(OTP_ROM) ,可见1k的只读存储器(ROM)决定了应用程序不能够太多,否则应用程序机器码将无法烧录到芯片中。
硬件设计中,EM78P152/3S可以通过设置代码选项寄存器使微处理器工作在内部RC 振荡模式(IRC)下,此模式下采用上电复位模式而不需要外接时钟电路;同时利用上电自动复位而不需要外接复位电路,P63复位引脚可以直接作为输入脚使用,充分提高了微处理器端口的利用率,这样硬件应用电路极为简化,节省了硬件成本。
E M78P153单片机
EM78P153是台湾义隆公司采用高速CMOS工艺制造的8位单片机,其内部集有
512×13bitOTP(一次性)ROM(程序存储器),用户通过仿真器编写和调试正确的机器码文件通过编程器烧录入芯片,有13个掩模选项可满足不同产品的要求,同时有密码保护位防止程序数据被读出.
工作电压:2.0—6.0V
工作温度:0-70℃
时钟频率:DC-8MHz
低功耗:在5V/4MHz工作条件下,电流小于1.5mA,3V/32kHz条件下,电流为15uA,睡眠模式下电流仅为1uA.
512×13bit程序存储器(OTPROM),32×8片内RAM(SDRAM).
片内4MHz校准RC振荡器
可编程振荡器起振时间预分频器
可按位编程
一个密码保护位
2个双向I/O端口
5级堆栈
掉电模式
3个中断源:TCC溢出中断,睡眠状态唤醒中断,外部中断.
可编程自由运行看门狗定时器(WDT)
有7个引脚可编程为上拉,有6个引脚可编程为下拉.
有7个引脚可编程为漏极开路.
每个指令周期为两个时钟周期,99%为单指令周期.
具有电压检测单元,检测范围2.0V±0.15V.
EM78P153为14pin封装,有:DIP-14,SOP-14和SSOP-14三种封装形式.。
3.2.2. 面向位操作类指令(10条)
3.2.3. 常数操作和控制类指令(22条)
例:MOV A,@0x16 ;将常数0x16送给寄存器A
3.3.2. 直接寻址
若是使用者要存取寄存器的内容,可以在运算码上直接描述。
l 例:将寄存器0X20的内容,COPY到寄存器0X21中。
MOV A, 0X20
MOV 0X21, A
3.3.3. 间接寻址
这种寻址方式是通过寄存器R4来实现的,R4的bit0-5是用来选择寄存器(地址:00-06,0F-3F)
若是使用者所需要存取的寄存器,有位址相邻的特性,使用间接寻址是很方便的。
l 例:写一个程序,將寄存器0X20~0X3F的值都填0。
;设定A = 0X20。
;设定间接寻址寄存器(0X04)
;的內含值为0X20
;清除0X04所指的寄存器。
;递增间接寻址寄存器(0X04)
;设定A=0X04寄存器的值。
;比较间接寻址的位址是否
;以到0X3F。
若是则结束。
;否则在继续。
MOV A, @0X20
MOV 0X04, A
AGAIN:
CLR 0
INC 0X04
MOV A, 0X04
XOR A, 0X3F
JBS 0X03, 2
JMP AGAIN
END:
3.3.
4. 位寻址
这种位寻址是对寄存器中的任一位(bit)进行操作。
例:BS 0x12,2 ;将寄存器0x12的第2位置为“1”。
3.4.EM78指令说明
--> A .--> R。
; Program for EM55000 series Assember; Program is IR car; Reference program date : April 23,2003; Programmer : w.m.liu; Project : em_rx_1; Project Leader :; Program Approval by : w.m.liu; Program Check sum :; Customer :; Customer order code :; fequency test: p2.2 p2.3 connet to vdd p3.0 out 14 khz fequency; ir input : p2.0; f/b mottor: p3.0 p3.2; l/r mottor: p3.1 p3.3include "define.inc"poweron:stop2mov rate2,#8287mov a,#0000bmov p2s,amov a,#0000bmov p3s,amov p4s,amov p4,amov p2,amov p3,apage1call clr_rampage0call clr_rammov m2,#1100bmov a,p2and a,m2caje m2,test_modemov m13,#0110bmov m3,#0001b;jmp testend;**************************************test_mode:page0mov m4,#0001bmov a,#0001bmov p3,atest_mode_loop:mov a,#0001b;; 1xor a,m4;; 1mov m4,a;; 1mov p3,a;; 1mov a,p2;; 1and a,m2;; 1caje m2,test_mode_loop;; 3 -> 9 KHz 110usjmp poweron;-------------------------------------------init:call cl_128jmp rx_start_init;mov timer,#0 ;0----->.85ms 1---->1.7ms 2----->3.4ms 3----->6.8ms ;--------------------------------receive_loop:page1mov m4,#0mov m5,#0mov m6,#0mov m7,#0mov m8,#0mov m13,#0mov m12,#0mov m15,#0page0mov a,m1caje #0,rx_endrx_end@:page0call udchkmov a,m8caje #0,rx_endjmp rx_start@rx_end:page1mov m4,#0mov m5,#0mov m6,#0mov m7,#0mov m8,#0mov m13,#0mov m12,#0mov m1,#0mov m15,apage0mov m1,#0mov m9,#0mov m5,#0mov a,#0000bmov p3,amov p2,amov m0,amov m5,#0end ;;;;;;;;;;;;;;;;;;;;;;;;rx_start_init:page0mov m3,#0001bmov a,m1and a,m3caje #0,rx_end@mov a,m15caje #2,rx_startcall udchkmov a,m8caje #1,rx_startmov a,#0000bmov p3,amov p2,amov p4,arx_start:call voice2rx_start@:page1mov m4,#0mov m5,#0mov m6,#0mov m7,#0mov m8,#0mov m13,#0mov m12,#0mov m15,#0mov m3,#0001bnopnopnopmov a,p2and a,m3caje m3,rx_start_init nopnopnopmov a,p2and a,m3caje m3,rx_start_init call get_receivecaje #15,receive_loop;------------------------------------------------get_receive:call cl_128call cl_128mov m4,#0mov m5,#0mov m6,#0mov m7,#0mov m8,#0mov m13,#0mov m12,#0mov a,#1000bmov p3,acall hl_waitcaje #0,no_receivemov a,#0100bmov p3,arx_receive:mov a,m4caje #0000b,receive_15bitcaje #0001b,receive_14bitcaje #0010b,receive_13bitcaje #0011b,receive_12bitcaje #0100b,receive_11bitcaje #0101b,receive_10bitcaje #0110b,receive_9bitcaje #0111b,receive_8bitcaje #1000b,receive_7bitcaje #1001b,receive_6bitcaje #1010b,receive_5bitcaje #1011b,receive_4bitcaje #1100b,receive_3bitcaje #1101b,receive_2bitcaje #1110b,receive_1bitcaje #1111b,receive_0bitreceive_15bit:;call cl_128 ;15 call cl_128mov a,p2and a,m3caje #0,zero15one15:mov a,#1000bor a,m5mov m5,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero15:mov a,#0010b mov p3,acall hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_14bit:call cl_128 ;14 ;call cl_128mov a,#0001bmov p3,amov a,p2and a,m3caje #0,zero14one14:mov a,#0100bor a,m5mov m5,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero14:mov a,#0000bmov p3,amov a,m13caje #0,no_receivejmp comp_increceive_13bit:call cl_128 ;13 ;call cl_128mov a,p2and a,m3caje #0,zero13one13:mov a,#0010bor a,m5mov m5,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero13:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_12bit:call cl_128 ;12;call cl_128mov a,p2and a,m3caje #0,zero12one12:mov a,#0001bor a,m5mov m5,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero12:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_11bit:call cl_128 ;11 ;call cl_128mov a,p2and a,m3caje #0,zero11one11:mov a,#1000bor a,m6mov m6,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero11:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_10bit:call cl_128 ;10 ;call cl_128mov a,p2and a,m3caje #0,zero10one10:mov a,#0100bmov m6,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero10:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_9bit:call cl_128 ;9 ;call cl_128mov a,p2and a,m3caje #0,zero12one9:mov a,#0010bor a,m6mov m6,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero9:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_8bit:call cl_128 ;8 ;call cl_128mov a,p2and a,m3caje #0,zero8one8:mov a,#0001bor a,m6mov m6,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero8:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_7bit:call cl_128 ;7 ;call cl_128mov a,p2and a,m3caje #0,zero7one7:mov a,#1000bor a,m7mov m7,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero7:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_6bit:call cl_128 ;6 ;call cl_128and a,m3caje #0,zero6one6:mov a,#0100bor a,m7mov m7,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero6:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_5bit:call cl_128 ;5 ;call cl_128mov a,p2and a,m3caje #0,zero5one5:mov a,#0010bor a,m7mov m7,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero5:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_4bit:call cl_128 ;4 ;call cl_128mov a,p2and a,m3caje #0,zero4one4:mov a,#0001bor a,m7mov m7,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero4:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_3bit:call cl_128 ;3 ;call cl_128mov a,p2and a,m3caje #0,zero3one3:mov a,#1000bor a,m8mov m8,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero3:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_2bit:call cl_128 ;2 ;call cl_128mov a,p2and a,m3caje #0,zero2one2:mov a,#0100bor a,m8mov m8,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero2:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_1bit:call cl_128 ;1 ;call cl_128mov a,p2and a,m3caje #0,zero1one1:mov a,#0010bor a,m8mov m8,acall l_waitmov a,m12caje #0,no_receivejmp comp_inczero1:call hl_waitmov a,m13caje #0,no_receivejmp comp_increceive_0bit:call cl_128 ;0 ;call cl_128mov a,p2and a,m3caje #0,zero0one0:mov a,#0001bor a,m8mov m8,a;call l_wait;mov a,m12;caje #0,no_receivejmp comp_inczero0:;call hl_wait;mov a,m13;caje #0,no_receivejmp comp_inccomp_inc:mov a,m4add a,#1mov m4,acaje #0,receive_okjmp rx_receivereceive_ok:mov a,#0retno_receive:mov a,#15ret;-----------------------------------l_wait:l_chk:page1mov m12,#0mov m3,#0001bmov level_count,#0 mov noise_count,#0 mov over_count,#0l_chk_loop:nopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopmov a,p2and a,m3caje #0,l_chk_endmov noise_count,#0 mov a,level_count incamov level_count,a caje #0,l_chk_flow jmp l_chk_loopl_chk_end:mov a,noise_count incamov noise_count,a caje #1,l_chk_loop ;jmp l_chk_okl_chk_ok:mov m12,#1retl_chk_flow:mov m12,#0ret;=============================== hl_wait:hl_chk:page1mov m13,#0mov m3,#0001bmov level_count,#0 mov noise_count,#0 mov over_count,#0 wait_h_loop:nopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopmov a,p2and a,m3caje m3,wait_h_noise mov noise_count,#0 mov a,level_count incamov level_count,a caje #0,hl_chk_flow jmp wait_h_loop wait_h_noise:mov a,noise_count incamov noise_count,a caje #1,wait_h_loop ;jmp wait_l_start wait_l_start:mov level_count,#0 mov noise_count,#0 mov over_count,#0 wait_l_loop:nopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopmov a,p2and a,m3caje #0,wait_l_noise mov noise_count,#0 mov a,level_count incamov level_count,a caje #0,hl_chk_flow jmp wait_l_loop wait_l_noise:mov a,noise_count incamov noise_count,a caje #1,wait_l_loop jmp hl_chk_okhl_chk_ok:mov m13,#1rethl_chk_flow:mov m13,#0ret;*******************************page1mov timer,#2rsttfmov m12,#0000bmov m3,#0001bl_wait_cnt:mov a,statusmov timer_f,#0100band a,timer_fcaje #0100b,l_wait_endmov a,p2and a,m3caje m3,l_wait_cntnopnopnopmov a,p2and a,m3caje m3,l_wait_cntl_wait_ok:mov m12,#0001bretl_wait_end:mov m12,#0000bret;**************************************;;hl_wait:page1rsttfmov timer,#2mov m13,#0000bmov m3,#0001bhl_wait_cnt:mov a,statusmov timer_f,#0100band a,timer_fcaje #0100b,hl_wait_endmov a,p2and a,m3caje #0,hl_wait_cntnopnopnopmov a,p2and a,m3caje #0,hl_wait_cntll_wait:rsttfmov timer,#2ll_wait_cnt:mov a,statusmov timer_f,#0100band a,timer_fcaje #0100b,hl_wait_endmov a,p2and a,m3caje m3,ll_wait_cntnopnopnopmov a,p2and a,m3caje m3,ll_wait_cnthl_wait_ok:mov m13,#0001brethl_wait_end:mov m13,#0000bret;================================================== cp_chk:page1mov a,m6 ;-----------------m5,m6 port31 caje m5,cp_next_chkjmp receive_loopcp_next_chk:page1mov a,m8 ;-----------------m7,m8 power caje m7,cp_okjmp receive_loopcp_ok:page1mov a,m7mov m3,#0100band a,m3caje #0100b,tonmov a,m5mov m3,#0100band a,m3caje #0100b,toff;mov a,m7;caje #0,cp_ok_exitjmp motcp_ok_exit:page0mov a,m1page1caje #0001b,receive_loopjmp rx_end;-------------------------------mot:page0mov a,m1caje #0,rx_endpage1mov a,#0000bmov p4,amov a,m7caje #0001b,mot_m1caje #0010b,mot_m2caje #0011b,mot_m3mot_next:page1mov m3,#0011bmov a,m5and a,m3caje #0001b,mot_m4caje #0010b,mot_m5caje #0011b,mot_m6jmp mot_n;--------------------------------mot_m1:mov a,m5caje #0010b,m1_addjmp m1_no_addm1_add:mov a,#0001bmov timer_f,#1000bor a,timer_fmov p4,ajmp mot_v1m1_no_add:mov a,#0001bmov p4,ajmp mot_v1;--------------------------------mot_m2:mov a,m5caje #0001b,m2_addjmp m2_no_addm2_add:mov a,#0010bmov timer_f,#0100bor a,timer_fmov p4,ajmp mot_v1m2_no_add:mov a,#0010bmov p4,ajmp mot_n;---------------------------mot_m3:mov a,#0011bmov p4,ajmp mot_v1;--------------------------- mot_m4:mov a,#0100bmov p4,ajmp mot_v1mot_m5:mov a,#1000bmov p4,ajmp mot_nmot_m6:mov a,#1100bmov p4,ajmp mot_v1mot_v1:page1mov a,m5mov m3,#1000band a,m3caje #1000b,jmp_spk_s page0mov a,m0caje #5,rx_start;caje #5,rx_start_wmov m0,#5stop2jmp rx_startjmp rx_start_Wmot_n:page1mov a,m5mov m3,#1000band a,m3caje #1000b,jmp_spk_spage0mov a,m0caje #8,rx_start;caje #8,rx_start_Wstop2mov m0,#8jmp rx_start;jmp rx_start_Wjmp_spk_s:stop2page0mov m0,#4jmp rx_start;-------------------------------tspk:stop2page0mov a,m1caje #0,rx_endpl_spk:play2 h1.wavspk_w:; cjp spk_w; call2 ply_tailpage0mov m0,#3page1mov a,m15caje #0,rx_startjmp rx_start_wton:stop2page0mov m1,#0001bmov m0,#0001bjmp rx_starttoff:stop2page0mov m1,#0mov m4,#0mov m0,#0mov a,#0000bmov p3,amov p2,amov p4,aend ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; udchk ;;;;;;;;;;;; udchk:page0mov timer,#2rsttfmov m10,#0mov m11,#0mov m8,#0udchk_loop:mov a,statusmov timer_f,#0100band a,timer_fcaje #0100b,udchk_cntmov m3,#0001bnopnopnopmov a,p2and a,m3caje #0,udchk_okjmp udchk_loopudchk_cnt:rsttfmov a,m10add a,#1mov m10,acaje #0,udchk_cnt@jmp udchk_loopudchk_cnt@:mov a,m11add a,#1mov m11,acaje #3,udchk_endjmp udchk_loopudchk_end:stop2mov m0,#3mov m8,#0000bretudchk_ok:mov m8,#0001bret;**************************************cl_128:page0mov m10,#0mov m11,#0cl_loop:mov a,m10add a,#1mov m10,acaje #5,cl_cntjmp cl_loopcl_cnt:mov m10,#0mov a,m11mov m11,acaje #2,cl_okjmp cl_loopcl_ok:page1ret;*******************************clr_ram:mov m15,#0mov m14,#0mov m13,#0mov m12,#0mov m11,#0mov m10,#0mov m9,#0mov m8,#0mov m7,#0mov m6,#0mov m5,#0mov m4,#0mov m3,#0mov m2,#0mov m1,#0mov m3,#0ret;@@@@@@####################### voice2 start voice2:page0mov vo_temp,#0010bmov a,statusand a,vo_tempcaje #0010b,voice_retpage0mov a,m0caje #0,for_tailcaje #1,for_headcaje #2,for_startcaje #3,for_idlecaje #4,for_spkcaje #5,for_straightcaje #8,for_idle@jmp voice_retfor_head:stop2mov m0,#2mov m15,#2retfor_tail:mov m15,#1retfor_start:play2 wstart.wavmov m0,#3mov m15,#2retfor_idle:play2 widle.wavmov m0,#3mov m15,#2retfor_idle@:play2 widle.wavmov m0,#8mov m15,#3retfor_straight:play2 wstraight.wavmov m0,#5mov m15,#3retfor_spk:play2 h1.wavh1_wait:mov timer_f,#0010band a,timer_fcaje #0010b,h1_waitmov a,m1caje #1,spk_idlejmp spk_tailspk_idle:mov m0,#3mov m15,#3retspk_tail:mov m0,#0mov m15,#2voice_ret:ret;------------------------;d_4ms:mov timer,#3 ;0----->.85ms 1---->1.7ms 2----->3.4ms 3----->6.8ms rsttfd_4ms_wait:mov a,statusmov timer_f,#0100band a,timer_fcaje #0100b,d_4ms_exitjmp d_4ms_waitd_4ms_exit:ret;===========================rx_delay:page0mov m10,#0mov m11,#0mov timer,#3rsttfrx_delay_loop:mov a,statusmov timer_f,#0100band a,timer_fcaje #0100b,rx_delay_cntjmp rx_delay_looprx_delay_cnt:rsttfmov a,m10add a,#1mov m10,acaje#0,rx_delay_incjmp rx_delay_looprx_delay_inc:mov a,m11add a,#1mov m11,acaje#2,rx_delay_retjmp rx_delay_looprx_delay_ret:ret;-------------------------------------------delay:nopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopret;-------------------------------rx_start_w----------rx_start_w:page0mov m10,#0mov m11,#0mov m9,#0mov timer,#2rsttfrx_w_loop:mov a,statusmov timer_f,#0100band a,timer_fcaje timer_f,rx_w_cntmov m3,#0001bmov a,p2and a,m3caje #0,rx_startjmp rx_w_looprx_w_cnt:rsttfmov a,m10incamov m10,acaje #0,rx_w_cnt@jmp rx_w_looprx_w_cnt@:mov a,m11incamov m11,acaje #3,rx_w_endjmp rx_w_looprx_w_end:mov m0,#3mov a,#0000bmov p3,amov p2,amov a,m1caje #0001b,rx_start_initpage0mov m5,#0jmp rx_endtest:mov a,#1111bmov p3,acall cl_128call cl_128mov a,#0000bmov p3,acall d_4mscall d_4msjmp test。
义隆单片机EMC-法宝级的EMC单片机编程技巧集锦2007-03-16 11:44EM78XXX单芯片自从问世以来已经陆续推出十余种不同等级的单芯片,小到8Pin 的78P152,大到100PinOTP的78P860,其汇编语言指令都是一样的,仅有57个,所以反复练习几次就能熟悉指令的用法。
汇编语言用在I/O控制非常容易,也有很高的效率,所以坊间的书籍大部份以讨论控制为主显,显少专门探讨软件技巧的篇幅,其实老手都知道,关于芯片之控制往往用到时再去翻一翻DATABOOK,注意一下TIMING,然后准备一部示波器,三两下就可以搞定。
反倒是算法用的好不好会大大影响产品的稳定度,所以有经验的程序设计师通常都有自己的一套葵花秘笈,所以要提升自己的功力最好的方式除了多练习之外,看看别人的程序也会使你进步很快。
BCD转换成Binary由于EM78XXX是8位的微控器,因此为了节省内存,我们的范例仅以一个BYTE 存放两位BCD数为例,数字的范围在0~99之间,转换后的结果放在ACC,如果您需要更多的位数,相信您在看完之后应该不难自行修改才是。
程序一这个范例程序共花费13个指令CYCLE,需要两个变量空间,执行后会影响到原BCD的内容。
MOV A,BCDMOV TMP,AMOV A,@0x0FAND TMP,ASWAP BCDAND BCD,ABC PSW,0RLC BCD ; *2MOV A,BCDADD TMP,ARLC BCDRLCA BCD ; *8ADD A,TMP说明在程序一中所采用的方式应该算是最多人知道的方式,也是一种最直觉的方法,先将BCD个位数保存起来,因为十位数必须要乘以10,所以利用移位的技巧乘以10再加上个位数,所得的答案放入ACC。
程序二在程序一的缺点,就是在执行程序以后,原本BCD的内容已经在移位的过程中被破坏掉了,为了改善这项缺失,我们换一种方式看看。
下面这个程序,我们企图改善前面的缺失,共花费11个指令CYCLE,仍需要两个变量空间,但是执行后不会破坏原来BCD的内容。
隆单片机指令系统3.1.EM78指令概述EM78156 & EM78P156 单片机共有的58 条指令,其宽度为13 位。
每一个指令码可分割成两部份,第一部分为标示指令功能的运算码(OPCODE ),第二部份則指出运算时所需之參数,亦即运算码(OPERAND )。
而指令的类型大致可分为下列四种:(1)控制型指令(control operation ):如INT...等等。
(2)面向寄存器(字节操作)型指令(register oriented ):如MOV A, Reg_B ;move Reg_B to AADD Reg_B, 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)。
3.2.EMC 汇编语言指令集符号解说:1.符号‘R’:代表一般用途寄存器中的其中一个。
2.符号‘B’:代表一般用途寄存器中的某一位。
3.符号‘K’:代表8位或10位的常数或内容。
4.符号‘A’:代表累加寄存器。
3.2.1. 面向寄存器(字节操作)型指令(26条)助记符号指令动作标志影响指令周期语言描述ADD A,R A+R->A Z,C,DC 1 ADDADD R,A A+R->R Z,C,DC 1 ADDAND A,R A&R->A Z 1 ANDAND R,A A&R->R Z 1 ANDCLR R 0->R Z 1 Clear RegisterCLRA 0->A Z 1 Clear the A registerCOM R /R->R Z 1 Complement R助记符号指令动作标志影响指令周期语言描述COMA R /R->A Z 1 Complement R,Place in ADAA A寄存器调整为BCD值 C 1 Decimal AdjustDEC R R-1->R Z 1 Decrement RDECA R R-1->A Z 1 Decrement R,Place in ADJZ R R-1->R 结果为零就跳过下一个指令 1 Decrement R,Skip if 0DJZA R R-1->A 结果为零就跳过下一个指令 1 Decrement R,Please in A register, Skip if 0 INC R R+1->R Z 1 Increment RINCA R R+1->A Z 1 Increment R,Please in AJZ R R+1->R, 结果为零就跳过下一个指令 1 Increment R,Skip if 0JZA R R+1->A, 结果为零就跳过下一个指令 1 Increment R,Place in the A regiser,Skipif 0MOV R,A A->R 1 Move DataMOV A,R R->A Z 1 Move DataMOV R,R R->R Z 1 Move DataOR A,R A OR R ->A Z 1 Inclusive OROR R,A A OR R->R Z 1 Inclusive ORSUB A,R R-A->A Z,C,DC 1 SubtractSUB R,A R-A->R Z,C,DC 1 SubtractXOR A,R A XOR R->A Z 1 Exclusive ORXOR R,A A XOR R->R Z 1 Exclusive OR3.2.2. 面向位操作类指令(10条)助记符号指令动作标志影响指令周期语言描述BC R,B 0->R(B) 1 Bit ClearBS R,B 1->R(B) 1 Bit SetJBC R,B 如果R(B)=0,则跳过下一个指令 1 Bit Test, Skip if Clear JBS R,B 如果R(B)=1,则跳过下一个指令 1 Bit Test, Skip if Set RLC R R(N)->R(N+1) R(7)->CC->R(0) C 1 Rotate Left R through CarryRLCA R R(N)->A(N+1) R(7)->CC->A(0) C 1 Rotate Left R through Carry,Place in the A Register RRC R R(N)->R(N-1) R(0)->CC->R(7) C 1 Rotate Right R through Carry助记符号指令动作标志影响指令周期语言描述RRCA R R(N)->A(N-1) R(0)->CC->A(7) C 1 Rotate Right R through Carry,Place in the A Register SWAP R R(0-3)->R(4-7) R(4-7)->R(0-3) 1 Swap RSWAPA R R(0-3)->A(4-7) R(4-7)->A(0-3) 1 Swap R3.2.3. 常数操作和控制类指令(22条)助记符号指令动作标志影响指令周期语言描述ADD A,K A+K->A Z,C,DC 1 ADDAND A,K A&K->A Z 1 ANDCALL K PC+1->[SP] (PAGE,K)->PC 1 Subroutine Call CONTR CONT->A 1 Move CONT to the A registerCONTW A->CONT 1 Move A to CONTDISI 禁止中断 1 Disable InterruptENI 使能中断 1 Enable InterruptINT PC+1->[SP] 001H->PC 1 Software interruptIOR R IOCR->A 1 Move IOCR to the A registerIOW R A->IOCR 1 Move A to IOCRJMP K (PAGE,K)->PC 1 Unconditional BranchMOV A,K K->A 1 Move DataNOP 1 No OperationOR A,K A OR K->A Z 1 Inclusive ORRET [堆栈顶端]->PC 1 Return from SubroutineRETI [堆栈顶端]->PC,使能中断 1 Return from InterruptRETL K K->A, [堆栈顶端]->PC Return Immediate Data to the A RegisterSLEP 0->WDT , 振荡器停止振荡T,P 1 Into Sleep modeSUB A,K K-A->A Z,C,DC 1 SubtractTBL PC+A->PC Z,C,DC 2 Table Look UpWDTC 0->WDT T,P 1 Clear Watchdog TimerXOR A,K A XOR K->A Z 1 Exclusive OR3.3.EM78指令寻址方式关于对寄存器的存取,必须要先说明寄存器的位址,说明暂存的位址的方式称做寻址方式,EM78的寻址方式有两种,一种为直接寻址,一种为间接寻址。
3.3.1. 立即数寻址这种方式就是操作数为立即数,可直接从指令中获取。
例:MOV A,@0x16 ;将常数0x16送给寄存器A3.3.2. 直接寻址若是使用者要存取寄存器的内容,可以在运算码上直接描述。
例:将寄存器0X20的内容,COPY到寄存器0X21中。
MOV A, 0X20 MOV 0X21, A3.3.3. 间接寻址这种寻址方式是通过寄存器R4来实现的,R4的bit0-5是用来选择寄存器(地址:00-06,0F-3F)若是使用者所需要存取的寄存器,有位址相邻的特性,使用间接寻址是很方便的。
例:写一个程序,將寄存器0X20~0X3F的值都填0。
;设定A = 0X20。
;设定间接寻址寄存器(0X04);的內含值为0X20;清除0X04所指的寄存器。
;递增间接寻址寄存器(0X04);设定A=0X04寄存器的值。
;比较间接寻址的位址是否;以到0X3F。
若是则结束。
;否则在继续。
MOV A, @0X20 MOV 0X04, AAGAIN:CLR 0INC 0X04 MOV A, 0X04XOR A, 0X3F JBS 0X03, 2JMP AGAIN END:3.3.4. 位寻址这种位寻址是对寄存器中的任一位(bit)进行操作。
例:BS 0x12,2 ;将寄存器0x12的第2位置为“1”。
3.4.EM78指令说明ADD Add语法ADD A,R编码0 0011 10rr rrrrr操作內容 A + R --> A受影响的标志Z,C,DC﹔零标志﹐进位标志和辅助进位标志都会受影响说明將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入A寄存器中。
语法ADD R,A编码0 0011 11rr rrrrr操作內容 A + R --> R受影响的标志Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响说明將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入R寄存器中。
语法ADD A, k编码 1 1111 kkkk kkkk操作內容K + A --> A受影响的标志Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响说明將A寄存器的內含值加上立即值K﹐並且把结果载入A寄存器中。
举例说明下两行指令敘述为A = R11 + R12.MOV A,0x11ADD A,0x12 ;A = R11 + R12下两行指令敘述为R10 = R11 + R12.MOV A,0x11MOV 0x10,AMOV A,0x12ADD 0x10,A ;R10 = R11 + R12下两行指令敘述为A = 0x01 + 0x01.MOV A,@0x01 ;A = 0x01ADD A,@0x01 ;A = 0x02AND And语法AND A,R编码0 0010 10rr rrrrr操作內容 A & R --> A受影响的标志Z﹔零标志说明將A寄存器和R寄存器AND在一起﹐并将结果存入A寄存器。