义隆单片机指令集
单片机指令大全
单片机指令大全- - 指令格式功能简述字节数周期一、数据传送类指令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系列指令快速记忆法随着微电子技术和超大规模集成电路技术的发展,单片微型计算机以其体积小、性价比高、功能强、可靠性高等独有的特点,在各个领域(如工业控制、家电产品、汽车电子、通信、智能仪器仪表)得到了广泛的应用。
单片机指令大全(二)2024
单片机指令大全(二)引言概述:本文是关于单片机指令大全的第二部分。
在上一部分中,我们介绍了一些常用的单片机指令和其功能。
本文将继续介绍更多的单片机指令,包括数据传输、逻辑运算、算术运算、位操作以及状态寄存器等方面的指令。
这些指令将帮助您更好地理解和使用单片机。
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 指令功能:构造目的地址,实现程序转移。
义隆单片机EM78P153使用讲解
基于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复位引脚可以直接作为输入脚使用,充分提高了微处理器端口的利用率,这样硬件应用电路极为简化,节省了硬件成本。
EM78P153单片机简介[新版]
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。
义隆4位单片机红外遥控车原代码
; 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单片机编程技巧集锦
义隆单片机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的内容。
单片机指令集概述
单片机指令集概述单片机指令集是计算机体系结构中的重要组成部分,它定义了单片机能够执行的指令集合。
在本文中,我们将概述单片机指令集及其主要特点。
1.引言单片机是一种集成电路,内部包含了处理器核心、存储器、输入输出接口等功能模块。
指令集是单片机的基本操作指令集合,它决定了单片机的功能与应用范围。
了解单片机指令集对于学习和设计嵌入式系统至关重要。
2.指令格式单片机指令一般由操作码和操作数两部分组成。
操作码用来表示执行的操作类型,如加法、移位、跳转等,操作数则提供了操作所需的数据或地址。
例如,对于一条加法指令,操作码可以是"ADD",操作数可以是要相加的寄存器或者内存地址。
3.指令类型根据操作类型的不同,单片机指令可以分为以下几类:- 数据传输指令:用于在寄存器和内存之间传输数据。
例如,将一个数据从内存读取到寄存器,或将寄存器中的数据写入内存。
- 算术指令:用于进行基本的算术运算,如加法、减法、乘法和除法。
- 逻辑指令:用于进行逻辑运算,如与、或、非等。
- 移位指令:用于将数据在寄存器或内存中移位,如左移、右移等。
- 控制转移指令:用于程序的跳转和循环控制,如条件跳转、无条件跳转等。
4.指令编码为了使单片机能够识别和执行指令,每条指令都被赋予一个唯一的二进制编码。
编码的长度取决于单片机的体系结构。
一些常见的单片机指令集采用的是定长编码,即每条指令的长度相同。
而对于一些复杂的处理器,可能采用变长编码。
编码的设计需要考虑诸多因素,如指令数量、指令长度、指令执行速度等。
合理的编码设计能够最大限度地提高指令集的效率和性能。
5.指令执行单片机的指令执行过程是按照指令的顺序来进行的。
当单片机上电后,程序计数器将指向存储器中的第一条指令,然后逐条执行。
指令的执行过程一般包括以下几个步骤:- 取指令:从存储器中获取即将执行的指令。
- 解码指令:根据指令编码,解码指令的操作类型和操作数。
- 执行指令:根据操作类型和操作数执行相应的操作。
台湾义隆单片机硬件结构
第二章 EM78系列单片机硬件结构EM78系列单片机是采用低功耗、高速CMOS工艺制造的8位单片机,本章将以EM78X56(包括EM78156、EM78256、EM78456)为例来讲述EM78系列单片机的内部结构、存贮器、中断、I/O、看门狗、振荡器和电压检测器等特点。
2.1. 主要功能特点·采用8位数据总线和13位指令总线独立分离的Harvard结构设计。
·采用RISC指令集,共有57条单字节指令,其中99%为单周期指令(对程序计数器PC指针进行写操作除外)。
·1K~4KX13的程序存贮器(有OTP和掩膜二个版本)。
·48个通用数据寄存器可直接寻址使用。
·14个特殊功能寄存器。
·具有一个结构选择寄存器用于设置振荡器的工作方式等。
·具有五级堆栈令程序嵌套更自由。
·两个双向三态I/O口,12个I/O线,可分别设置为上拉、下拉或集电极开路等。
·具有三个硬件中断和一个软件中断。
·两种工作模式:正常工作模式 2mA/5V休眠模式 1μA/5V(可由I/O唤醒)·具有R-OPTION功能,即用电阻的上拉、下拉来选择内部程序的执行。
·一个带8位预置器的8位定时/计数器,一个看门狗定时器(WDT)。
·采用先进的加密方法保证用户代码不被读出。
·工作电压:2.5~5.5V 工作频率DC~36MHZ、工作温度0℃~70℃。
2.2. EM78X56型号分类、命名方法及管脚功能说明2.2.1. 型号分类(表2.1):2.2.2. 命名方法:EM 78 P 156 A P封装形式P-DIP M-SOIC S-SSOP内置电压检测功能 A-有 B-无类型名P:OTP;没有“P”为MASK版本单片机系列号EMC公司字头2.2.3. EM78X56管脚功能描述图2.1 EM78156管脚图(EM78256和EM78456管脚同上)2.3. EM78内部结构框图EM78X56在片内集成了一个8位算术运算单元ALU和工作寄存器ACC、1K~4KROM、56个RAM、12个I/O口,8位预置器(Prescaler)及8位计数器(TCC)、振荡器、看门狗、五级堆栈、中断控制器、指令寄存器、译码器和其它一些寄存器等。
义隆单片机延时程序
晶振为4MHz,选择一个指令周期等于两个振荡周期,所以一条单周期指令被执行所占时间为2*(1/4000000) = 0.5us。
D_R0 == 0X20D_R1 == 0X21D_R2 == 0X22ORG 0x00JMP MAINORG 0x10MAIN:MOV A, @25 ;A = 25。
MOV D_R0, A;设定延迟寄存器0(D_R0)=25。
CALL DELAY;呼叫时间延迟子程序,执行指令数目为1。
JMP MAINDELAY:NOP ;调节延迟时间。
MOV A, @200 ;设定A = 200MOV D_R1, A;设定寄存器D_R1 = 200。
LOOP1:NOP ;调节延迟时间。
NOP ;调节延迟时间。
MOV A, @79 ; 设定A = 79.MOV D_R2, A;设定寄存器D_R2 = 79.LOOP2:NOP ;调节延迟时间。
NOP ;调节延迟时间。
NOP ;调节延迟时间。
DJZ D_R2 ;递減D_R2,为0就跳过下一行。
JMP LOOP2 ;循环,LOOP2循环总共执行指令数目为5*79=395。
DJZ D_R1 ;递減D_R1,为0就跳过下一行。
JMP LOOP1 ;循环,LOOP1循环总共执行指令数目为(395+6)*200=80200。
DJZ D_R0 ;递減D_R0,为0就跳过下一行。
JMP DELAY;循环,DELAY循环总共执行指令数目为(80200+5)*25=2005125。
RET ;返回主程序,执行指令数目为1。
延迟程序总共执行指令数目1+2005125+1=2005127延迟程序总共耗时2005127*0.5us=1002563.5us≈1s。
单片机指令大全
引言概述:单片机指令是嵌入式系统设计中至关重要的一部分,它们定义了单片机的功能和操作。
本文是单片机指令大全系列的第二部分,旨在提供更多全面的单片机指令信息,帮助读者更好地理解和应用单片机指令。
正文内容:一、移位指令1.逻辑左移指令:将操作数的每一位向左移动一位,并且最低位填充0。
2.逻辑右移指令:将操作数的每一位向右移动一位,并且最高位填充0。
3.算术右移指令:将操作数的每一位向右移动一位,并且最高位保持不变。
4.循环左移指令:将操作数的每一位向左循环移动一位,即最高位移动到最低位。
5.循环右移指令:将操作数的每一位向右循环移动一位,即最低位移动到最高位。
二、逻辑运算指令1.逻辑与指令:对操作数进行逻辑与运算,将两个二进制数对应位上的值进行逻辑与操作。
2.逻辑或指令:对操作数进行逻辑或运算,将两个二进制数对应位上的值进行逻辑或操作。
3.逻辑非指令:对操作数进行逻辑非运算,将二进制数的每一位取反。
4.逻辑异或指令:对操作数进行逻辑异或运算,将两个二进制数对应位上的值进行逻辑异或操作。
5.逻辑移位指令:将操作数进行逻辑左移或右移。
三、算术运算指令1.加法指令:对操作数进行加法运算,并将运算结果保存到指定的寄存器或存储器中。
2.减法指令:对操作数进行减法运算,并将运算结果保存到指定的寄存器或存储器中。
3.乘法指令:对操作数进行乘法运算,并将运算结果保存到指定的寄存器或存储器中。
4.除法指令:对操作数进行除法运算,并将运算结果保存到指定的寄存器或存储器中。
5.移位指令:对操作数进行移位运算,包括算术左移、算术右移、循环左移和循环右移。
四、输入输出指令1.读取输入指令:从指定的输入设备读取数据,并将数据保存到指定的寄存器或存储器中。
2.输出显示指令:将指定的数据从寄存器或存储器中读取,并显示到指定的输出设备上。
3.端口输入指令:从指定的端口读取数据,并将数据保存到指定的寄存器或存储器中。
4.端口输出指令:将指定的数据从寄存器或存储器中读取,并输出到指定的端口上。
(完整版)单片机指令大全
一个单片机所需执行指令的集合即为单片机的指令系统。
单片机使用的机器语言、汇编语言及高级语言,但不管使用是何种语言,最终还是要“翻译”成为机器码,单片机才能执行之。
现在有很多半导体厂商都推出了自己的单片机,单片机种类繁多,品种数不胜数,值得注意的是不同的单片机它们的指令系统不一定相同,或不完全相同。
但不管是使用机器语言、汇编语言还是高级语言都是使用指令编写程序的。
所谓机器语言即指令的二进制编码,而汇编语言则是指令的表示符号。
在指令的表达式上也不会直接使用二进制机器码,最常用的是十六进制的形式。
但单片机并不能直接执行汇编语言和高级语言,都必须通过汇编器“翻译”成为二进制机器码方能执行,但如果直接使用二进制来编写程序,那将十分不便,也很难记忆和识别,不易编写、难于辨读,极易出错,同时出错了也相当难查找。
所以现在基本上都不会直接使用机器语言来编写单片机的程序。
最好的办法就是使用易于阅读和辨认的指令符号来代替机器码,我们常称这些符号为助记符,用助记符的形式表示的单片机指令就是汇编语言,为便于记忆和阅读,助记符号通常都使用易于理解的英文单词和拼音字母来表示。
每种单片机都有自己独特的指令系统,那么指令系统是开发和生产厂商定义的,如要使用其单片机,用户就必须理解和遵循这些指令标准,要掌握某种(类)单片机,指令系统的学习是必须的。
MCS-51共有111条指令,可分为5类:[1].数据传送类指令(共29条)[2].算数运算类指令(共24条)[3].逻辑运算及移位类指令(共24条)[4].控制转移类指令(共17条)[5].布尔变量操作类指令(共17条)一些特殊符号的意义在介绍指令系统前,我们先了解一些特殊符号的意义,这对今后程序的编写都是相当有用的。
Rn——当前选中的寄存器区的8个工作寄存器R0—R7(n=0-7)。
Ri——当前选中的寄存器区中可作为地址寄存器的两个寄存器R0和R1(i=0,1)direct—内部数据存储单元的8位地址。
单片机指令集
_at_地址定位为变量进行存储器绝对空间地址定位alien函数特性声明用以声明与PL/M51兼容的函数bdata存储器类型声明可位寻址的8051内部数据存储器bit位变量声明声明位变量或位类型函数code存储器类型声明8051程序存储器空间compact存储器模式指定使用8051外部分页寻址数据存储空间data存储器类型声明直接寻址的8051内部数据存储器far存储器类型声明8051外部数据存储器idata存储器类型声明间接寻址的8051内部数据存储器 interrupt中断函数声明定义中断服务函数large存储器模式指定使用8051外部数据存储空间pdata存储器类型声明分页寻址的8051外部数据存储器_priority_多任务优先声明规定RTX51或RTX51 Tiny的任务优先级reentrant可重入函数声明定义可重入函数sbit位变量声明声明可位寻址的特殊功能位sfr特殊功能寄存器声明声明8位的特殊功能寄存器sfr16特殊功能寄存器声明声明16位的特殊功能寄存器small存储器模式指定使用8051内部数据存储空间_task_任务声明定义实时多任务函数using寄存器组定义定义8051的工作寄存器组xdata存储器类型声明8051外部数据存储器&按位与|按位或^按位异或~按位取反。
一元运算符<<左移操作。
左边移出的位舍去,右边移入的位补0 >>右移操作。
右边移出的位舍去,左边移入的位对无符号数补0;对有符号数补符号位数据类型C51专用长度signed char单字节unsigned char单字节signed short2字节unsigned short2字节signed int2字节unsigned int2字节signed long4字节unsigned long4字节float4字节*1~3字节enum1或2字节bit专用1位sbit专用1位sfr专用1字节sfr16专用2字节存储器类型存储区域大小code程序存储区64KBdata 直接寻址的内部数据存储区128Bidata 间接寻址的内部数据区256Bbdata 位寻址的内部数据存储区16Bxdata外部数据存储或64KB far扩充的RAM和ROMpdata 分页的外部数据存储区256B数据类型保存区域存储器类型符号常数段CODE CO XDATA数据类型XDATA XD DATA数据类型DATA DT IDATA数据类型IDATA IDBIT数据类型BIT BI BDATA数据类型BDATA BA PDATA数据类型PDATA PD取值范围-128 to +1270 to 255-32768 to +327670 to 65535-32768 to +327670 to 65535-2147483648 to+2147464836470 to 4294967295±1.175494E-38 to ±3.402823E+38对象的地址-128 to +127 或 -32768to +327670 或 10 或 10 ~ 2550 ~ 65535对应的汇编语句描述MOVC A,@A+DPTR用来说明常量MOV XX,#ADDR访问速度快MOV XX,@Rn 可访问整个内部数据区域可使用位寻址或字节寻址来访问这一区域MOVX A,@DPTR 使用DPTR来访问外部数据存储器使用用户定义的专用例程或特殊芯片指令扩展命令MOVX A,@Rn 利用R0,R1来访问分页的外部数据存储器全局变量转换后的段名?CO?模块名?XD?模块名?DT?模块名?ID?模块名?BI?模块名?BA?模块名?PD?模块名。
单片机指令(自己整理的)
单片机指令单片机指令分为5类:数据传送类算术运算类逻辑运算及移位类控制转移类位操作类数据传送类指令:(29) 4、数据交换整字节交换:XCH A ,RnXCH A ,@Ri半字节交换:(A的低4位与RAM低4位交换)XCHD A ,@Ri累加器高低半字节交换:(A的高低半字节交换) SWAP A1、内部RAM数据传送8位立即数:MOV A, #dataMOV direct, #dataMOV @Ri, #dataMOV Rn, #data16位立即数:MOV DPTR, #data内部RAM之间:MOV direct2, direct1MOV direct2, @RiMOV direct2, RnMOV @Ri, direct1MOV Rn, direct通过累加器传送:MOV A, directMOV A, @RiMOV A, RnMOV direct, AMOV @Ri, A2、外部数据存储器读写(只能用A使用间址寻址)Ri作为间址寄存器:Movx A, @RiMovx @Ri, ADPTR作为间址寄存器:Movx A, @DPTRMovx @DPTR, A5、堆栈操作PUSH directPOP direct3、程序存储器读指令Movc A, @A+DPTRMovc A, @A+PC算术运算类(24)1、加法指令: 6、乘除:ADD A, #data 乘(低8位给A,高8位给B)ADD A, direct MUL ABADD A,@Ri 除(商给A,余数给B)ADD A, Rn DIV AB2、带进位加法: 7、十进制调整:(紧跟加减反指令后)ADDC A, #data DA AADDC A,@RiADDC A, Rn3、带借位减法:SUBB A, #dataSUBB A, directSUBB A, @RiSUBB A, Rn4、加1:INC AINC directINC @RiINC RnINC DPTR5、减1:DEC ADEC directDEC @RiDEC Rn逻辑运算及移位类指令(24)1、逻辑“与”运算:ANL direct, AANL direct, #dataANL A, #dataANL A, @RiANL A, Rn2、逻辑“或”运算:ORL direct, AORL direct, #dataORL A, #dataORL A, directORL A, @RiORL A, Rn3、逻辑“异或”运算:XRL direct, AXRL direct, #dataXRL A, #dataXRL A, directXRL A, @RiXRL A, Rn4、累加器清零和取反:CLR ACPL A5、移位指令:RL A (累加器循环左移) RR A (累加器循环右移) RLC A (通过CY循环左移) RRC A (通过CY循环右移)控制转移类指令(17)2、条件转移指令累加器判零转移指令: JZ rel (零转移)JNZ rel (非零转移)数值比较转移指令: CJNZ A, #data ,relCJNZ A, direct, relCJNZ Rn,#data, relCJNZ @Ri,#data, rel减1条件转移指令: DJNZ Rn, relDJNZ direct, rel1、无条件转移指令长转移指令: LJMP addr 16绝对转移: AJMP addr 11短转移: SJMP rel变址寻址转移: JMP @A+DPTR3、空操作指令NOP4、子程序调用与返回指令组绝对调用指令: ACALL addr 11长调用指令: LCALL addr 16返回指令: RETRETI位操作类指令(17)1、位传送指令组MOV C, bitMOV bit, C2、位置位复位指令组SETB CSETB bitCLR CCLR bit3、位逻辑运算指令组ANL C, bitANL C, /bitORL C, bitORL C, /bitCPL CCPL bit4、位控制转移指令以C状态为条件的转移指令 JC relJNC rel以位状态为条件的转移指令 JB bit, relJNB bit, relJBC bit, rel。
义隆单片机PORT6 Change中断
例:写一个程序,將寄存器0X20当做计数器,每当PORT6 Change中断产生,就自动加1。
PORT6 = = 6 ;定义。
DISI ;中断禁止。
ORG 0X06 ;设定下一个位址为0X06。
CLR 0X20 ;清除计数寄存器。
JMP MAIN ;跳转到主程序。
DISIINT_PRO:;0X08为中断服务程序起始。
NOPCLR 0X0F ;清除中断标志寄存器。
INC 0X20 ;计数器递增。
MOV R6,R6 ;读PORT6端口状态。
RETI ;中断返回。
MAIN:CLR 0X0F ;清除中断标志寄存器。
MOV A, @0XFF ;设定A = 0XFF。
IOW PORT6 ;將PORT6设成输入口。
MOV R6,R6 ;读PORT6端口状态。
ENI ;使能中断。
MOV A, @0X02 ;设定A = 0X02。
IOW 0X0F ;使能PORT6 Change中WAIT_INT:WDTC ;清除Watch Dog Timer。
NOP ;等待PORT6 Change。
NOP ;等待PORT6 Change。
JMP W AIT_INT ;循环。
使用PORT6 Change中断有下列几个步骤。
1. 关闭看门狗计時器(Watch Dog Timer),若看门狗计時器未关闭,用户要定時下WDTC的指令。
2. 清除中断寄存器。
3. 设定PORT6为输入口。
4. 將PORT6的值存入触发器中(这很重要)。
5. 使能中断(下ENI的指令)。
6. 使能PORT6 Change中断(设定中断控制寄存器的bit1为1)。
7. 中断服务程序的启始位址在0X08。
8. 进入中断服务程序首先要將中断禁止,否则会产生嵌套中断。
9. 中断寄存器0X0F,在进入中断服务程序時可以提供用户判断为何种中断,判断完成之后用户必須自行清除。
10. 由中断服务程序返回主程序应使用指令RETI。
例:写一个程序,將寄存器0X20当做计数器,每当外部中断产生,就自动加1。
义隆单片机 EM78P153_C语言范例
static io unsigned int IMR
@0x0F:iopage 0; //Interrupt Mask Register
/*======================================================;
; Special Purpose Registers Define
@0x05:iopage 0; @0x06:iopage 0; @0x0B:iopage 0; //Push-down Control Register @0x0C:iopage 0; //Open-drain Control Register @0x0D:iopage 0; //Push-high Control Register @0x0E:iopage 0; //WDT Control Register @0x0F:iopage 0; //Interrupt Mask Register
;
; ======================================================;
;
; A: Accumulator
; It can't be addressed.
;
; CONT: Control Register
;
;{
mINT == 0x40 ; Interrupt enable flag
static io unsigned int P5CR @0x05:iopage 0;//Port5 Control Register static io unsigned int P6CR @0x06:iopage 0;//Port6 Control Register static io unsigned int PDCR @0x0B:iopage 0; //Push-down Control Register
义隆汇编指令集
CONT->A
1
Move CONT to the A register
CONTW
A->CONT
1
Move A to CONT
DISI
禁止中断
1
Disable Interrupt
ENI
使能中断
1
Enable Interrupt
INT
PC+1->[SP]
001H->PC
1
Software interrupt
Z
1
Inclusive OR
RET
[堆栈顶端]->PC
1
Return from Subroutine
RETI
[堆栈顶端]->PC,使能中断
1
Return from Interrupt
RETL K
K->A,
[堆栈顶端]->PC
Return Immediate Data to the A Register
RLCA R
R(N)->A(N+1)
R(7)->C
C->A(0)
C
1
Rotate Left R through Carry,Place in the A Register
RRC R
R(N)->R(N-1)
R(0)->C
C->R(7)
C
1
Rotate Right R through Carry
助记符号
IOR R
IOCR->A
1
Move IOCR to the A register
IOW R
A->IOCR
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
隆单片机指令系统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寄存器。