PIC汇编语言程序设计基础ppt课件.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《PIC汇编语言程序设计基础ppt课件.ppt》由会员分享,可在线阅读,更多相关《PIC汇编语言程序设计基础ppt课件.ppt(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四章 PIC汇编语言程序设计基础4.0 序论4.1 MPASM汇编器的使用4.2 汇编语言的语句格式4.3 常用伪指令4.4 程序格式和程序流程图4.5 RAM数据存储器的体选寻址问题4.6 顺序程序结构4.7 分支程序结构4.8 循环程序结构4.9 子程序结构4.10 程序的跨页跳转和跨页调用问题4.11 延时程序设计4.12 查表程序设计为什么要学习汇编语言1.汇编语言是唯一一种面向机器的、最贴近及其硬件的编程语言。学习汇编语言能够帮助深入了解单片机的构成、工作过程和原理。因此特别适合初学阶段的学习;2.汇编语言程序可以最有效的节省CPU的运行时间和数据存储空间,代码使用效率最高。在简单
2、的控制场合是一种最佳选择;3.由于汇编语言是一种直接控制CPU的指令语言,所以可以产生精确的定时信号,这时其它语言所无法实现的;4.尽管C语言已经成为各类单片机重要的开发手段,但是汇编语言永远不会被淘汰,只有将汇编语言和C语言有机的结合起来才能高效的实现应用软件的设计。4.0 序论CPU所能识别的是由“0”或“1”组成的二进制的“机器语言”。如:“SLEEP”指令的机器语言:“00000001100011”。但机器语言不便于人们编写、阅读。汇编语言是对机器语言的改进。使用了便于记忆、阅读的符号、字符串来表示指令的操作码、操作数和操作数地址。是一种符号语言,它与机器语言一一对应。汇编语言CPU是
3、不能识别的,因此必须使用一种工具将其“翻译”为机器语言,这个工具叫“汇编器”或“汇编程序”。使用“汇编器”或“汇编程序”帮助将汇编语言的源程序转换为机器语言,这一过程称之为“汇编”。汇编语言的使用为我们提供了一种可以不涉及机器指令码和实际存储器地址的便捷条件。但是要想正确使用汇编语言编程必须了解“编译器”所约定的内容,掌握如:语句格式、标号格式、数据进制的表示方法、伪指令和汇编器的使用等等。在下面的章节中将介绍MPASM编译器的使用、汇编语言的语句格式、几种常用伪指令、程序格式和流程图。返回4.1 MPASM汇编器的使用MPASM汇编器是美国microchip公司为其单片机开发、应用者设计的一
4、套语言工具软件。它不仅能将汇编语言源程序“翻译”成机器语言,还能检查源程序中的语法错误或格式错误并向用户给出题示。MPASM汇编器有两种版本:DOS版本的 MPASM.EXE;WINDOWS的 MPASMWIN.EXE。有关如何使用MPASM将在后面相关章节中介绍。返回4.2 汇编语言的语句格式为了使编译器能够顺利的对用户编制的汇编语言源程序进行代码转换,在编制源程序时必须依照汇编器的约定进行书写。microchip公司提供的MPASM汇编器其汇编语言格式的一般格式由4个字段组成,这4个段不都是必要的,但顺序不能颠倒。标标 号号操操 作作 码码操操 作作 数数;注;注 释释(label lab
5、el )(opcode opcode)(operand operand)(commendcommend)1.标号必须从左面第1列开始,后面至少用1个空格与操作码隔离(注意:标号后面没有冒号);2.在无标号时,操作码前至少要保留一个或一个以上的空格(建议使用“Tab”键分割标号列);3.操作码与操作数之间至少要保留一个或一个以上的空格,如果有两个操作数时两者之间要由逗号(半角)隔开(建议使用“Tab”键分割);4.注释由分号(英文半角)引导,在标号、操作码和操作数之后。标号也可以单独占一行单必需由分号引导。(一)标号1.在指令前的标号实际上就是该指令的符号地址。2.并不是每条指令都需加标号的,只
6、有那些欲被其它语句引用的语句之前才需要加标号。子程序第一条语句的标号实际上就是该子程序的名称;3.标号可以单独作为作为一行;4.标号的第1个字符必须由字母或下划线“_”开始,并且从每一行的第1列开始写。标号最多可由32个字母、数字和其它符号组成。标号不能使用指令的助记符、寄存器名、或其它系统中已有固定用途的字符串(系统的保留字)。5.一个标号在系统中只能定义一次。(二)操作码1.在汇编语言语言源程序中,尽管其它3个字段有时是空的,但操作码字段无论在何时都不能是空的。2.操作码是指令的助记符,是指令功能的英文缩写,表示指令的操作类型、性质,是汇编语言语句中的“关键字”,因此是不能省略的。3.汇编
7、器将操作码进行汇编时,将其与一个预先建立的操作码索引表相比较找出对应的机器码取而代之,这叫“代真”4.当操作码前无标号时,操作码前至少要留有一个空格以防汇编器将其误认为标号。(三)操作数操作数是指令操作的对象,是数据或数据的地址。它们可以使用数值或标号形式表示。其中,数值可以使用二进制、八进制、十进制和十六进制或ASCII字符值(参见讲义88页表4.2);而标号可以是在此前定义或赋值的代表数字或地址标号或字符串。如果操作数有两个,中间应由逗号隔开。(四)注释注释部分用于对指令进行注解和说明。虽然注释可有可无,但对于一个编程者来说,为了便于程序的阅读、交流、修改和调试,在一些关键的语句上加标注释
8、是一种好的编程习惯;注释由半角的引号“;”开始,它不是程序的功能部分,编译器对该部分不做任何处理。返回4.3 常用伪指令所谓伪指令就是“假指令”的意思,它不是为CPU识别的指令、没有对应的机器码。它是为编译器服务的指令,如确定指令的存储地址,为标号、字符串赋值等。伪指令的使用使程序在书写、阅读上更方便。对于一些没有说明意义的数字、RAM地址可以通过伪指令换为有意义的字符来取代,使程序具有很好的可读性。如:在PIC的指令中不能直接引用寄存器的名字取代地址,只能通过EQU伪指令定义后引用其寄存器的符号。伪指令只在汇编的过程中进行一些辅助工作,是程序设计人员向编译器发出的控制命令,告诉汇编器如何完成
9、汇编过程和一些规定的操作,以及控制汇编的输入、输出和数据定位等。一旦汇编完成,伪指令就不存在了。与指令类似,伪指令的格式也是由4个字符段组成。符号名 伪指令助记符 操作数 ;注释符号名:通常为寄存器名、变量名、常数名、标志位名或控制 位名、复位矢量或中断矢量的一个字符串。同标号一 样符号名必须从一行的第1列开始,后面与伪指令应至 少保留一个空格。但不能向标号那样独占一行。(一)EQU-符号名赋值伪指令格式:符号名 EQU n n 说明:使 EQU 两边的值相等。其中 nn 是长度不同的二进制数(可以分别作为寄存器名、位地址、8位的数据或常数、13位的复位或中断矢量等)。一旦符号名被EQU赋值,
10、其值就固定下来不能再重新改变。举例:STATUSEQU03H;定义寄存器名RP0EQU05H;定义位地址TMR0_bEQU00H;定义定时器的初值常数【举例】:在PIC指令系统中,没有寄存器寻址的方式,汇编程序也不允许直接使用寄存器的名字。所以与寄存器相关的操作只能通过“直接寻址”方式完成。【如】:将W中的数据送PORTC寄存器:MOVWF 07H 因此,编写PIC的程序清单时,在程序的开头可以使用QEU伪指令现将相关的寄存器名进行定义,然后在程序中就可以直接引用寄存器的名字。PORTCEQU07H;定义寄存器名 MOVWF PORTC ;将W中的数据送PORTC汇编时,编译器将用07H取代P
11、ORTC。举例:经EQU伪指令定义后,汇编程序中直接使用寄存器的符号名来取代寄存器的地址,使程序具有更好的可读性。INDF EQU 00HTMR0 EQU 01HPCL EQU 02HSTATUS EQU 03HRP0 EQU 05H ;参见讲义48页RP1 EQU 06HPORTC EQU 07H :ORG 0000H GOTO MAIN ORG 0005HMAIN BSF STATUS,RP0 BCF STATUS,RP1 ;选择体 MOVLW 01H ;立即数01H送W MOVWF PORTC ;W内容送PORTC(二)ORG-程序起始地址定义伪指令格式:ORG nnnn说明:用于指定该
12、伪指令后面的源程序在ROM中存放 的起始地址。nnnn 为13位长的地址参数。举例:ORG 0005HMAINCLRWCALL SUB :MAIN是标号,也就是本行指令的符号地址。ORG伪指令又将该符号地址定义为单片机内部RAM的0005H单元,即CLRW的机器码存储在程序存储器ROM的0005H开始的单元中。(三)END-程序结束伪指令格式:END说明:该伪指令通知MPASM汇编器结束对源程序的汇编。注意:在一个源程序中必须有一个END伪指令,且只能在 程序的最后。(四)LIST-列表选项伪指令格式:LIST 可选项,可选项,可选项 说明:用于设置汇编参数来控制汇编过程,或对打印输出文件进行
13、格式化。该伪指令的所有选项都应在一行内完成。指令的可选项共有十余种,这里仅介绍2种。P=设定单片机型号。例如:P=16F877 R=定义默认的数值进制。例如:R=DEC(十进制)或:R=HEX(十六进制)(五)INCLUDE-调入外部程序文件伪指令格式:INCLUDE “文件名”说明:用来告知汇编器,将一个预先编制好的外部程序文件包含进来。这样做可以减少重复劳动,提高编程效率。调入的外部程序文件通常是“定义文件”,即定义单片机的复位矢量、专用寄存器的地址及控制位和状态为地址等。返回4.4 程序格式和程序流程图虽然书写源程序时没有统一的要求,但是一个良好的格式风格非常重要。在此推出一种风格的格式
14、供参考:;-;符号定义和变量定义;-INDFEQU00H;把后面程序指令要用到的TMR0EQU 01H;寄存器单元地址用表义性很PCLEQU02H;强的符号名预先定义STATUSEQU03HFSREQU04HPORTAEQU05HTRISAEQU85HXEQU20H;对程序所需的变量预先定义YEQU 21H;-;复位矢量和中断矢量的安排(PIC16F87X);-ORG 0000H;复位矢量入口GOTO MAIN;转跳到主程序ORG0004H;中断矢量入口GOTO INT_BODY;跳转到中断服务程序;-;主程序区;-ORG 0005H;主程序从0005H开始存放MAIN CLRWCALLSUB
15、 GOTO MAIN标号注释;-;子程序区和中断服务程序区;-SUBMOVLW01H;子程序 RETURN;子程序返回;INT_BODY;中断服务程序MOVLW0FFH RETFIE;中断服务程序返回;-END;全部程序结束从这个例子中,可以看出:纵向上将程序划分为几个功能块,层次清晰,便于阅读;横向上按4个字段划分并上下对齐程序框图的图形符号用图形来表示程序的结构和流向叫程序的“流程图”。流程图比程序本身更直观的体现出程序的特点。因此,在编制、书写程序本身之前应当首先画出流程图。通过图形将程序的每一个操作及操作的顺序、分支的结构等等一目了然的展现出来。在编写一个程序(特别是复杂的程序)事先通
16、过流程图制定程序的结构、操作顺序等,然后将程序采用模块化,逐一编制、调式,最后完成,这是编程者必须养成的良好习惯。开始操作1操作2条件判断结束条件成立条件不成立4.5 程序的四种结构及流程图开始操作1 操作2 操作3 操作n 结束初始化操作1条件判断开始结束初始化循环体循环控制开始结束开始操作1 Call A Call A 结束子程序A操作n 1,顺序结构 2,分支结构 3,循环结构 4,子程序调用结构操作2 返回(一)顺序程序结构结构中最简单的一种。流程图中的任务框按顺序自上而下的执行,最后结束;【例题】字节拆分将将RAM中20H单元中的8位数据拆分为高4位(A)、低4位(B),并分别送入2
17、2H、21H寄存器中。程序示意图:B BA A-20H21H22HB BA A0 0A A0 0B B20H21H22H流程图结束20H单元数据送W将W中高4位清零处理后数据送21H将20H中的数据经半字交换后送W将W的高4位清零处理后数据送22HMOVF 20H,0;将20H单元中的数据送WANDLW0FH;屏蔽数据的高四位MOVWF21H;送RAM的21H单元SWAPF20H,0;将20H单元中的数据交换送WANDLW0FH;屏蔽数据的高4位MOVWF22H;送RAM的21H单元(思考题)不使用半字交换指令SWAPF时,程序应当怎样编写?B BA A-20H21H22HB BA A0 0A
18、 A0 0B B20H21H22H(二)分支程序在分支结构程序的流程图中,包含一个判断框。判断框中有一个入口、两个出口,从而形成两个分支;判断框是由“条件判跳语句”实现的:当条件满足时 skip 跳一步;当条件不满足时顺序执行。条件成立?OP成立时(skip)不成立时(顺序执行)【举例】:将RAM的20H、21H单元中的无符号数进行比 较,将大数送入22H单元。【算法】:将两个数进行一次减法操作,如果产生借位,则 表明:被减数小于减数。【注意】:1.减法指令SUBWF F,d 中:F为被减数、W为减数即:F-W2.在减法运算时:如果有借位则Cy=0;无借位Cy=1。这一点不同于常规系统的定义;
19、3.使用“位测试”指令BTFSS STATUS,C;如果Cy=1(无借位)时skip或BTFSC STATUS,C;如果Cy=0(有借位)时skip程序流程图开 始C=1(无借位)C=0(有借位)(21H)送22H单元C=1?(21H)-(22H)(20H)送22H单元停 机F21BIGF20BIG程序清单STATUSEQU03HCEQU0MOVF20H,0;20H数据送WSUBWF 21H,0;21H-W送WBTFSSSTATUS,C;如果C=1(无借位)skip GOTO F20BIG;C=0(有借位)F21BIGMOVF 21H,0;无借位时21H数大MOVWF22H GOTO STOP
20、;跳转到停机F20BIGMOVF20H,0;有借位时20H数大MOVWF22HSTOPGOTOSTOP;停机(三)循环程序结构对于一些重复性的操作可以采用循环结构以简化程序;一个循环程序包含以下五个组成部分:1.循环计数器:由一个寄存器承担,用于循环次数的控制;2.数据指针:在处理数据块时,采用指针是一种唯一可行方法。通过“寄存器间接寻址”的方式来使用数据指针的;3.循环工作体:要重复执行的基本操作;4.修改数据指针:在循环体中每完成一次基本操作后,通过对指针的“加一”或“减一”为下次访问作好准备;5.循环控制:对于固定次数的循环,在每循环一次后,通过对“循环计数器”(或其它条件)进行处理、判
21、断,当条件满足后即可退出循环,否则程序将会进入“死循环”。【举例】RAM存储器的数据填充。将地址30H开始的50个单元全部填充00H。【算法】程序采用循环结构:1.建立数据指针,即FSR做指针,原始=30H;2.选择一个寄存器作循环计数器,原始=50;3.循环体的基本操作是对内存RAM某一单元清零;4.修改数据指针,采用对FSR加一的方法实现;5.利用DECFSZ F,1实现循环次数的控制。程序清单COUNTEQU20HFSREQU04HINDFEQU00HMOVLWD50MOVWFCOUNTMOVLW30HMOVWFFSRNEXTCLRFINDF;注意采用间接寻址方式INCFFSR,1;修改
22、指针DECSZCOUNT,1;循环控制语句GOTONEXTSTOPGOTOSTOP定次数循环程序流程图开 始NO循环结束?初始化修改指针停 机YES工作体关于程序的几点说明1.CLRF INDF 指令是“寄存器间接寻址”的寻址方式,且实际操作中是以文件选择寄存器FSR的内容为操作数的地址;2.程序中所遇到的寄存器(FSR)都在体0中,即系统上电复位后所默认的体,所以省去了访问FSR前的选体过程;3.在间接寻址中,RAM单元的9位地址:由FSR寄存器本身提供8位地址、STATUS中的IRP提供最高位地址。由于整个数据块(30H62H)都在体0中,且系统上电复位后STATUS中的IRP=0,所以省
23、去了对IRP的设定;数据存储器RAM的寻址示意图00H7FH80HFFH100H17FH180H1FFH6 来自指令 0 PR1 PR0IRP 7 FSR寄存器 0 RAM单元选择单元选择间接寻址的体选直接寻址的体选 00 01 10 11体0 体1 体2 体3 STATUS寄存器(四)子程序结构在一个程序中,对于一些完全相同的计算或操作可以采用“子程序”结构以简化程序、节省存储空间;在PIC系列单片机是采用 CALL+子程序名 实现子程序的调用:1.在子程序的开头必须要有一个标号,此标号也是该子程序的名;2.子程序的最后是通过RETURU或RETLW(带参数返回)或RETIF(中断服务子程序
24、的返回)。在编制子程序时,要关注两个问题:1.参数的传递:主程序与子程序之间相关的数据。一般是约定某一存储单元作为参数的存储空间。主程序调用之前将参数放入此单元;而子程序从该单元取出数据进行处理,最后再将处理后的数据送回(或约定另一个单元);返回主程序后主程序从对应单元得到数据。一般最常用的存储单元是工作寄存器W。2.现场保护:在运行子程序时,要用到一些寄存器来处理一些中间数据,而这些寄存器往往在调用子程序前已经被使用(存有数据,最常见的是工作寄存器W)。为了避免因调用子程序而破坏原有主程序的数据,就要对子程序所临时使用的寄存器(也称局部变量)的数据事先进行保护现场保护。一般保护指令放在子程序
25、的最开始部分,待子程序返回前再使用指令恢复这些数据。子程序结构应用举例【举例】极值挑选:假设在RAM的30H单元开始有三个无符号数。现编制一个程序将其中的最大数挑选出来并送如40H单元。【算法】编制一个比较两个数大小的子程序SUB。入口参数分别为X、Y(参加比较的两个数的存储单元)、出口参数为Z(挑选出来的大数存储单元),编制一个主程序两次调用SUB就可以跳出最大值。程序流程图停机初始化 将两个数据送X、Y单元将Z和第三个数送X、Y调用SUB,得Z调用SUB,得ZMAINSUB返回(Y)-(X)(Y)送Z(X)送Z有借位?YES(C=0)NO(C=1)将Z送指定最大单元主程序流程图SUB子程序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC 汇编语言 程序设计 基础 ppt 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内