《PIC单片机原理及应用(第五章).ppt》由会员分享,可在线阅读,更多相关《PIC单片机原理及应用(第五章).ppt(61页珍藏版)》请在三一办公上搜索。
1、PIC单片机指令系统和其它单片机一样,是较为低级的语言系统,是一套控制和指挥CPU工作的编码,即机器语言。单片机只能识别和执行由二进制数组成的机器语言,然而,这样一种二进制代码的机器语言是很难为人们直接理解和分析。为了能较好表达人们的设计思路,便于记忆和使用,人们在低级语言之上设计出一种新的符号语言,即汇编语言。汇编语言是机器语言的符号表达。,第6章 汇编语言程序设计,根据指令的功能和作用,只有操作码是必须存在的,它主要决定了指令的操作性质。而其它部分是指令语句的重要补充和说明,有时可以缺省。,6.1 汇编语言指令格式,标号位于指令助记符前面,它一般是用于表示指令所在的地址,例如表示主程序或子
2、程序的起始地址、转移语句的入口地址等。在程序汇编时,将该指令机器码所在程序存储器中的地址赋值给标号。,1.标号,标号并不是指令的必须部分,只有那些欲被其他语句引用的指令之前,才必须附加标号。标号不一定和语句同行,可以单独在语句上方作为一行使用。标号最多可以由32个字母、数字和其它一些字符组成,但第一个字符必须是字母或下划线。标号不能用系统保留字,即系统禁用指令助记符、寄存器名、标志符等作为标号,如:ADD、PCLATH等。,使用标号的要点是:,一个标号只能表示一个地址,不允许多个地址用一个标号重复定义。标号的定义和引用必须一致,其中的大小写可以混写但必须相同。标号必须顶格书写,结束不用冒号。,
3、操作码决定着指令的操作类型和操作性质,是汇编语言语句中的核心要素,每一条汇编指令都不可缺少,而其它三部分有些指令可以缺省。,2.操作码,操作码所对应的指令助记符,其中的符号大小写可以混写,而不会影响操作码的含意,这一点和标号、操作数符号变量的表达方式是有本质区别。指令助记符不能顶格书写,当前面没有标号时,必须至少保留一个空格。操作码核心助记符部分比较简单,初学者必须熟悉复合助记符部分的功能。,有关操作码(指令助记符)的要点是:,在PIC汇编语言语句中,操作数的形式和内容最为丰富,它是指令助记符操作的对象,一般以数据或地址的形式出现,也可以用符号变量所表示的数据或地址。,3.操作数,使用操作数的
4、要点是:,若操作数有二项,中间用逗号(半角)分开。以A、B、C、D、E、F开头的数,前面应加0作为引导。MPASM编辑环境默认进制为十六进制,也可按用户需要进行重新设置。操作数部分的符号变量必须区分大小写。重视d参数的应用,目标地址为:F(d=1);W(d=0)。,各种进制168的表示形式,注释内容用分号引出,是汇编语言语句功能的一种补充说明,主要是便于人们阅读、分析、修改和调试程序。,4.注释,用分号(半角)引出注释内容,可以紧跟指令之后,也可以独立一行或多行书写,但每一行均需由分号引出。注释内容可以英文书写,也能用中文书写(来源于文本编辑内容)。,使用注释的要点是:,各种单片机的汇编程序除
5、了指令系统语句(PIC16F877共35条)以外,一般都还定义许多非正式指令的语句,即伪指令。大多数伪指令汇编时并不产生机器码,仅为源程序提供汇编控制信息。,6.2 系统伪指令,格式:ORG nnnn 说明:ORG伪指令指出紧跟在该伪指令后的机器码指令的汇编地址,即经汇编后生成的机器码目标程序或数据块在单片机程序存储器中的起始存放地址。,1.定位伪指令:ORG(Origin),例题6-1以下三个程序段的含义是一样的。;程序段1;ORG0008H;常数0008HSTARTMOVLW00H;程序段2;ABCEQU0008HORGABC;标识符ABC即0008HSTARTMOVLW00H;程序段3;
6、ABCEQU0004HORGABC+4;代数表达式即0008HSTARTMOVLW00H,格式:符号名 EQU nn 说明:EQU伪指令几乎每一个程序中都用到,其操作含意是使EQU两端的值相等。一般在PIC的程序设计中,原则上每次遇到新的符号参数,都必须在前面定义符号名的初始数值或存储器地址。符号名一旦被EQU赋值,其值便不能被再重新定义。这里的符号名,既可以是PIC中的特殊功能寄存器、一个常数,或者是表示一个通用数据存储器地址。,2.赋值伪指令:EQU(Equate),实际上对于伪指令:ABC EQU20H,其中ABC既可以认为是符号变量,因为ABC可以代表20H地址;又可以认为是符号常量,
7、因为ABC可以代表立即数20H。所以对于一个定义的符号量,应结合引用的指令进行分析才能真正确定符号量的类型。,分析 ABC EQU 20H,【例题6-2】正确区别符号变量和符号常量之间的关系。ABCEQU 20H;定义符号量ABC ORG 0000H NOPMOVLW 77HMOVWF 20HMOVLW 88HMOVF ABC,0;ABC为符号变量MOVLW ABC;ABC为符号常量NOP END,在符号名定义和引用过程中,必须保证大小写属性的一致,注意不能混合使用。如果有定义:ABC EQU20H 在引用符号名ABC时,不能改变其大小写的属性,即Abc、aBC或ABc与ABC是不一样的,在汇
8、编时均会发生出错信息。,格式:END 说明:END伪指令表示汇编语言源程序(*.ASM)的结束,MPASM汇编器汇编时遇到END就认为程序已结束,对其后的程序段不再进行汇编。,3.程序结束伪指令:END,格式:LIST 可选项,可选项,说明:LIST伪指令用于设置各种汇编参数,以便控制整个汇编过程或对打印输出的列表文件进行格式化。1)P 例如:P16F877 2)R 例如:RDEC(十进制);RHEX(十六进制);RBIN(二进制);默认为十六进制。,4.列表选项伪指令:LIST,格式:INCLUDE“文件名”说明:INCLUDE伪指令的主要功能是将外部预先编写好的指定文件纳入本源程序的汇编内
9、容,这样可以减少重复劳动,提高编程效率。如:P16F877.INC为PIC16F877单片机的复位矢量、专用寄存器的地址及其控制位和状态位的位地址的原始定义,有些参考书把P16F877.INC称为PIC16F877的头文件。,5.外调程序伪指令:INCLUDE,6.定义数据伪指令DB(DW、DE、DATA)表达式,表达式,例题6-3ORG0000HNOPORG0100HDB45H,67H,89H,0ABH,0CDH,0EFH;定义6个字节数据ORG0200HDB4567H,89ABH,0CDEFH;定义6个字节数据ORG0300HDBA,B,C,D,E,F,G;定义6个字符数据ORG0400H
10、DBABCDEFG;定义1个字符串数据END注:建议使用DE定义数据,可以定义单字节数据、单字节字符和字符串。,格式:RADIX 说明:RADIX伪指令用于设置在MPLAB-ICD集成开发环境中采用的进制方式,如定义十进制、八进制和十六进制等参数,MPLAB-ICD集成开发系统缺省为十六进制。例如:RADIX DEC;定义为十进制 RADIX HEX;定义为十六进制 RADIX OCT;定义为八进制,7.进制定义伪指令:RADIX,8.体选伪指令 BANKSEL BANKSEL ABC MOVLW 00H MOVWF ABC9.页选伪指令 PAGESEL PAGESEL DEL10MS CAL
11、L DEL10MS,6.3 存储器选择方式,数据存储器体选方式直接寻址访问数据存储器7+2模式间接寻址访问数据存储器8+1模式,在直接寻址中,体选码来自状态寄存器STATUS的RP1和RPO位,体内的单元地址直接来自指令机器码。而在间接寻址中,体选码由STATUS的IRP位和FSR寄存器的BIT7组成。,直接寻址/间接寻址方式的示意图,2.程序存储器页选方式6种途径(1)复位地址0000H;(2)中断地址0004H;(3)指令寄存器;(4)执行以PCL为目的地址的指令;(5)转移指令方式,GOTO指令;(6)调用子程序方式,CALL指令。(1)、(2)、(3)PC自动形成;(4)、(5)、(6
12、)PC需要装载。,例题6-4LISTP=16F877;PAGESELINCLUDEP16F877.INC;COUNTEREQU30H;查表偏移量ORG0000HNOPMOVLW20H;数据存储器起始地址MOVWFFSRCLRFCOUNTER;查表偏移量置0LOOPMOVFCOUNTER,WCALLCHABIAO;调用查表子程序MOVWFINDF;送入数据存储器INCFCOUNTER;指向下一偏移量INCFFSR;指向下一数据存储器BTFSSCOUNTER,4;是否已取16个数据GOTOLOOP;否,继续GOTO$;是,停止,查表子程序;CHABIAOADDWFPCL,F;增加偏移量RETLW0
13、0H;第0个数据RETLW01H;第1个数据RETLW02H;第2个数据RETLW03H;第3个数据RETLW04H;第4个数据RETLW05H;第5个数据RETLW06H;第6个数据RETLW07H;第7个数据RETLW08H;第8个数据RETLW09H;第9个数据RETLW0AH;第10个数据RETLW0BH;第11个数据RETLW0CH;第12个数据RETLW0DH;第13个数据RETLW0EH;第14个数据RETLW0FH;第15个数据;END,在程序设计中,除主程序以外还有一部分很重要的内容就是关于子程序的设计,它是为完成特定的目的而构成的复合程序。,6.4 常用子程序的设计,转移和
14、循环程序,主要是通过跳转、判断和位测试指令来构成的。1.跳转指令 GOTO;2.判断指令 INCFSZ、DECFSZ;3.位测试指令 BTFSS、BTFSC。,6.4.1 跳转和循环子程序,【例题6-5】假定执行某个显示功能100次后结束工作,显示子程序为XSH。ORG 0000HMOVLWD101MOVWF20HLOOPDECFSZ20H,FGOTORRTGOTOPPYRRTPAGESELXSHCALLXSHPAGESELLOOPGOTOLOOPPPYEND,【例题6-6】比较两个数据寄存器20H和30H内容的大小,将较大的数送入40H中。MOVF30H,WSUBWF20H,WBTFSCST
15、ATUSGOTOL20HMOVF30H,WMOVWF40HGOTOPOPL20HMOVF20H,WMOVWF40HPOPEND,单片机的延时程序,在程序设计中具有很重要的地位。延时的设计,一般可以通过两种方式:硬件延时和软件延时。所谓硬件延时,就是由单片机系统的定时器实现;而软件延时,是通过循环程序实现。一般来说,前者适用于精确定量延时,而后者常用于初略定性延时。,6.4.2 软件延时子程序,【例题6-7】简单循环的软件延时子程序。;软件延时子程序DELAY;COUNTEREQU20HORG1000HDELAYMOVLW0FFHMOVWFCOUNTERLOOPDECFSZCOUNTERGOTO
16、LOOPRETURN,【例题6-8】请编写10MS软件延时子程序。ORG0000HDEL10MSMOVLW0DHMOVWF20HLOOP1MOVLW0FFHMOVWF21HLOOP2DECFSZ21HGOTOLOOP2DECFSZ20HGOTOLOOP1RETURN,【例题6-9】请编写1S软件延时子程序。;1s软件延时子程序DELAY1SDELAY1SMOVLW06HMOVWF20HLOOP1MOVLW0EBHMOVWF21HLOOP2MOVLW0ECHMOVWF22HLOOP3DECFSZ22HGOTOLOOP3DECFSZ21HGOTOLOOP2DECFSZ20HGOTOLOOP1RET
17、URN,数据查表子程序在某些特殊场合是非常有用的,如共阴极LED八段显示器以及其它具有固定显示模式的场合,需根据其显示数值去查找对应参考数据库编码输出。,6.4.3 数据查表子程序,【例题6-10】将RC端口与共阴极LED八段显示器相连,从09循环显示,间隔时间为1秒,请编写相应的软件程序。,八段显示数值(0-9)编码,00000000,XXXXXXXX,PIC单片机架构PC相对寻址,查表实例,MOVLWHIGH DECODEMOVWFPCLATHMOVF DISPLAYVALUE,WCALLDECODEMOVWFPORTBGOTOCONTINUEDECODEADDWFPCL,FRETLWB0
18、0111111;DECODE 0RETLWB00000110;DECODE 1RETLWB01011011;DECODE 2RETLWB01001111;DECODE 3RETLWB01100110;DECODE 4RETLWB01101101;DECODE 5RETLWB01111101;DECODE 6RETLWB00000111;DECODE 7RETLWB01111111;DECODE 8RETLWB01101111;DECODE 9CONTINUE,b,e,RB0,RB1,RB2,RB3,RB4,RB5,RB6,b,c,d,e,f,g,W 寄存器,I/O B口,01101101,00
19、000101,01101101,【例题6-11】将RC端口与八个LED显示器相连,请按照表6-4即跑马灯流动显示方式,间隔时间为1秒,请编写相应的软件程序。,ABCEQU20HTRISCEQU03HPORTCEQU87HSTATUSEQU07H;主程序ORG0000HNOPBSFSTATUS,RP0MOVLW00HMOVWFTRISCBCFSTATUS,RP0MAINMOVLW00HMOVWFABCMOVLW00HMOVWFPORTCSTMOVFABC,WCALLSHUZHMOVWFPORTCCALLDELAY1SINCFABC,FBTFSSABC,4GOTOSTGOTOMAIN,;查表子程序
20、SHUZHADDWFPCL,FRETLW00HRETLW01HRETLW03HRETLW07HRETLW0FHRETLW1FHRETLW3FHRETLW7FHRETLW0FFHRETLW0FEHRETLW0FCHRETLW0F8HRETLW0F0HRETLW0E0HRETLW0C0HRETLW080HDELAY1S;1s延时子程序END,在PIC指令系统中并没有类似的语句,但如果借助于PIC单片机指令的特殊功能,同样可以轻松地构成分支跳转。分支跳转实际上是多条件判断指令,条件本身是一个整数或事件,而跳转出口应该是整数的信息返回或事件功能内容的具体表现。在程序形式上,分支功能跳转子程序与数据查表
21、子程序的结构类似,只是它是用GOTO语句替代了RETLW语句。,6.4.4 分支功能跳转子程序,假定W为某个按键的输入值JIANGN ADDWF PCL,F;确定相对偏移量GOTO PKEY0;执行PKEY0键盘定义功能GOTO PKEY1;执行PKEY1键盘定义功能GOTO PKEY2;执行PKEY2键盘定义功能.GOTO PKEYN;执行PKEYN键盘定义功能,例题6-13编写N个键盘功能选择子程序。ORG1000HPAGESELKEYCALLKEYPAGESELJIANGNCALLJIANGN;根据键入情况,确定相应键功能子程序;JIANGNADDWFPCL,FGOTOPKEY0GOTO
22、PKEY1GOTOPKEY2GOTOPKEYN-1,本节给出一些常用的数学运算类子程序,主要有加、减、乘、除等子程序,还有为外扩系统设计中的数码显示所需的BCD码和二进制数据的互换子程序。均涉及入口条件及出口条件,在调用时务必加以注意。一般入口条件是指参与操作的相关源数据,用S1、S2(source)等表示,而操作结果用R1、R2(result)等表示。高低8位数据分别用H、L表示,另外用Z表示中8位数据。,6.4.5 常用数学运算类子程序,可以将这些固定变量参数定义在PIC16F877的头文件内,并且单元定义位于映射区域70H7FH,这样就可以不受程序所在页面的影响。,例题6-14将两个无符
23、号16位数相加,编写双精度运算程序。INCLUDEP16F877.INCS1HEQU50HS1LEQU51HS2HEQU52HS2LEQU53HR1HEQU54HR1LEQU55HORG0000HNOPMOVLW12HMOVWFS1HMOVLW34HMOVWFS1LMOVLW56HMOVWFS2HMOVLW78HMOVWFS2LCALLADDXYGOTO$,;加法子程序;ADDXYMOVFS1L,WADDWFS2LBTFSCSTATUS,CINCFS2HMOVFS1H,WADDWFS2HMOVFS2H,WMOVWFR1HMOVFS2L,WMOVWFR1LRETLW00HEND,例题6-15将两
24、个无符号16位数相减,编写双精度运算程序。INCLUDEP16F877.INCS1HEQU50HS1LEQU51HS2HEQU52HS2LEQU53HR1HEQU54HR1LEQU55HORG0000HNOPMOVLW56HMOVWFS1HMOVLW78HMOVWFS1LMOVLW12HMOVWFS2HMOVLW34HMOVWFS2LCALLSUBXYGOTO$SUBXYCOMFS2LINCFS2LBTFSCSTATUS,ZDECFS2HCOMFS2H,;加法程序;MOVFS2L,WADDWFS1LBTFSCSTATUS,CINCFS1HMOVFS2H,WADDWFS1HMOVFS1H,WMO
25、VWFR1H;此处和例题14一样,是不是应该是R2?MOVFS1L,WMOVWFR1L;此处和例题14一样,是不是应该是R2?RETLW00HEND;本实验结果:(R1H:R1L)=4444H;,例题6-16将两个无符号16位数相乘,编写双精度运算程序。INCLUDEP16F877.INCS1HEQU50HS1LEQU51HS2HEQU52HS2LEQU53HR1HEQU54HR1LEQU55HR2HEQU56HR2LEQU57HP1HEQU58HP1LEQU59HCOUNTEQU5AHORG0000HNOPMOVLW12HMOVWFS1HMOVLW34HMOVWFS1LMOVLW56HMOV
26、WFS2HMOVLW78HMOVWFS2LCALLMPXYGOTO$,;乘法子程序;MPXYCALLYIWEIMPLOOPRRFP1HRRFP1LBTFSCSTATUS,CCALLMPADDRRFS2HRRFS2LRRFR2HRRFR2LDECFSZCOUNTGOTOMPLOOPMOVFS2H,WMOVWFR1HMOVFS2L,WMOVWFR1LRETLW00H,;16次右移设置准备程序;YIWEIMOVLW10HMOVWFCOUNTMOVFS2H,WMOVFWP1HMOVFS2L,WMOVFWP1LCLRFS2HCLRFS2LRETLW00HMPADDMOVFS1L,WADDWFS2LBTF
27、SCSTATUS,CINCFS2HMOVFS1H,WADDWFS2HRETLW00HEND;本题实验结果:(R1H:R1L:R2H:R2L)=06260060H;,例题6-17将两个无符号16位数相除,编写双精度运算程序。INCLUDEP16F877.INCS1HEQU50HS1LEQU51HS2HEQU52HS2LEQU53HR1HEQU54HR1LEQU55HR2HEQU56HR2LEQU57HP1HEQU58HP1LEQU59HCOUNTEQU5AHORG0000HNOPMOVLW12HMOVWFS1HMOVLW34HMOVWFS1LMOVLW67HMOVWFS2HMOVLW89HMOV
28、WFS2LCALLDIVXYGOTO$,;除法子程序DIVXYCALLDIVYIWEICLRFR2HCLRFR2LDIVLOOPBCFSTATUS,CRLFP1LRLFP1HRLFR2LRLFR2HMOVFS1H,WSUBWFR2H,WBTFSSSTATUS,ZGOTOASPMOVFS1L,WSUBWFR2L,WASPBTFSSSTATUS,CGOTOPUPMOVFS1L,WSUBWFR2LBTFSSSTATUS,CDECFASPMOVFS1H,WSUBWFR2HBSFSTATUS,C,PUPRLFS2LRLFS2HDECFSZCOUNTGOTODIVLOOPMOVFS2H,WMOVWFR1HMOVFS2L,WMOVWFR1LRETLW00H;16次左移设置准备程序;DIVYIWEIMOVLW10HMOVWFCOUNTMOVFS2H,WMOVFWP1HMOVFS2L,WMOVFWP1LCLRFS2HCLRFS2LRETLW00HEND;本题实验结果:(R1H:R1L)=0005H,余数(R2H:R2L)=0C85H;,例题6-18将一个5位数(65535)的BCD码转换成二进制数。例题6-19将一个16位二进制数转换成BCD码(65535),