PIC单片机最常用的几种指令介绍

上传人:pu****.1 文档编号:562526373 上传时间:2023-07-05 格式:DOCX 页数:29 大小:51.93KB
返回 下载 相关 举报
PIC单片机最常用的几种指令介绍_第1页
第1页 / 共29页
PIC单片机最常用的几种指令介绍_第2页
第2页 / 共29页
PIC单片机最常用的几种指令介绍_第3页
第3页 / 共29页
PIC单片机最常用的几种指令介绍_第4页
第4页 / 共29页
PIC单片机最常用的几种指令介绍_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《PIC单片机最常用的几种指令介绍》由会员分享,可在线阅读,更多相关《PIC单片机最常用的几种指令介绍(29页珍藏版)》请在金锄头文库上搜索。

1、PIC单片机最常用的几种指令介绍源程序的编写主要就是用这些基本的指令实现你的控制任务。但为了增加源 程序的可读性和可维护性,我们引入了伪指令的概念。伪指令本身不会产生可执 行的汇编指令,但它们可以帮组“管理”你编写的程序,其实用性和必要性绝不 亚于35条正真的汇编指令。我们在此着重介绍最常用的几种伪指令。8 #include 或 include#include伪指令的作用是把另外一个文件的内容全部包含复制到本伪指令 所在的位置。被包含复制的文件可以是任何形式的文本文件,当然文件中的内容 和语法结构必须是MPASM能够识别的。最经常被“include”的是针对PIC单 片机内部特殊功能寄存器定义

2、的包含头文件,在MPLAB安装后它们 全部放在路径 “ C:Program FilesMPLAB IDEMCHIP_Tools”下,每一 个型号的PIC单片机都有一个对应的预定义包含头文件,扩展名是“ .inc”。 除了一些符号预定义文件,你也可以把现有的其它程序文件作为一个代码模块直 接“包含”进来作为自己程序的一部分。见例3-01。#include;把预定义的PIC16F877A寄存器符号包含到此处#include ”ma th.asm”;把现有的程序文件包含进来作为自己代码的一部分例 3-01请注意被包含文件的引用方式。一种是尖括号引用,这种引用意味着让编 译器去默认的路径下寻找该文件,

3、MPASM默认的寄存器预定义文件存放路径即为 上面提及的MPLAB安装后的目录;另一种是” ”双引号引用,这种引用方式的 意思是指示编译器从引号中指定的全程文件路径下寻找该文件。例3-01中” m ath. asm”没有指定路径,即意味着在当前项目路径下寻找math.asm文件。如 果编译器找不到被包含的文件,将会有错误信息告知。请在你的源程序中尽量用 MPLAB标准头文件定义的寄存器符号。一来这些被定义的寄存器符号和芯片数 据手册上的描述一一对应,理解起来即直观又容易;二来如果用你自己定义符号 就缺乏一个大家能一起交流的标准平台,其他人要解读你的代码时将费时费力。 故例3-01中的首行#in

4、clude包含引用伪指令可以说是PIC单片机程序编写 时的标准必备。8 lis tlist伪指令可以设定程序编译时的一些信息,例如所选单片机的型号,编译 时选择的缺省数制等。例如:list p=16f877a, r=DEC;单片机型号为PIC16F877A,无特别指明的数字为十进制数例 3-02如果程序开发时使用项目管理的模式,则所有list伪指令可以描述的参数 项都可以在项目的设定选项中通过对话框的形式设定并保存。在此只需对list 伪指令稍作了解即可。8_config此伪指令的重要作用是把芯片的配置字设定在源程序中,请参阅2.5节的详 细说明。建议大家尽量用此伪指令把芯片的配置字写在程序中

5、。8_idlocsPIC单片机中有一处非常特殊的标记单元。它独立于任何其它存储器,唯一 的作用就是作为一个标记。此标记值无法用软件读到,读取和写入的方法只有通 过编程器实现。此标记值没有读保护,你可以利用它存放程序的版本或日期等信 息。如果需要,则可以用伪指令_idloc在程序中定义具体的值。_idloc 0x1234;设定芯片的标记值为0x1234,注意前面有两个下划线符例 3-03和_config伪指令定义的配置字一样,用idloc定义的芯片标记值在最 后也会存放在HEX文件中,这就要求编程器能够解析它。errorlevelerrorlevel的用途是控制编译信息的输出显示。编译器在编译你

6、的源程序时会提供很多信息,有些信息是你必须要处理的,例如错误信息(Error), 只要有错误信息存在,你的程序将永远无法完成编译;有些可能只需要关注,例 如警告信息(Warning);也有一些可能你根本就不感兴趣,它们只是一些提示信 息(Message)而已。注意出现警告和提示信息时将不会中止编译器的编译工作, 你的程序将被编译并最终产生HEX文件。图3-14中显示了一个程序编译后的 各种信息实例,其中既有错误信息,也有警告和提示信息。我们可以用errorle vel伪指令来控制输出信息的级别,或刻意关闭/打开一些提示信息。DcuLir (:Vi:li4::u FilitiWUIJ neiEE

7、D.lQDlIWnjBiLTL err i,ai| .rDieFflT: |SfBTO_K!B l_IMBT5_jr Xilft 血眞1 玛h!R CpTdi|iJI 7 : hm卩m rup*rc*did hyIir. Tnty prorpar ryJinL,血 I CViPa畐JJ: ;口口JPLLB KE.iLRIPTaiU-PliKrL X 37 : IE卫Mi:亠匸EcrarCin Ci-TFSnIfFPR 厨I ? i SNrl hot ddwld旧冷出閉:LATS.*0nn.ruEi4 HitkHUU=il:3C4B=D,EE -aefl.EnUEtTJ-iiCt-irfi&1X

8、JIE4町ohwE】SruruEA1 l-r:C-X# Ji1Ucd rcc-H.Jk 宓斗曲旧CAWITlilFS7-lSl lfl 5DES ClTESnifFSTE. 51 T4 a r 叫逅J C = TtST I OTTt. JISI Id 址凸gedMQ】 rsiTEJni-TO. 151 IT kMM-fwj ei.rT. i i misi 闵&IJUE6 IhK bufi till k4 C0LLt4CV:i firi-iiiri ihit hirb 5|tj:匚 narr-prl.i; j : rl nEpwulmztxjibaric亠i0-* in-frrincfecati

9、dibwljihris9 xr*i rl ncprKfi.Uit-urc:iRjfjifiLfrin4出【配门iiiuilma.:h rtjiri i ri.Tircrwrinirjnhirk!.la r 3 3 o US) C ! .EEST I CT-TISL J3 D9 I: Lb|1EA衍轴 1J| biuJf 口;lPn bRri/fe BJ.E J 止申 日左铤Idtt.託“梶*门口 ciiTnnimrt ni i i iin*e m前列凱加inui甫mn 时 i 口:门1和-Baca 3CQJ 匚 ETEST.1 CPITfu 11 J J : JR|KS tL hc ui aF

10、MEird. ral in bik DLLeju kbarl b-nkkehHaJtmf kjd.1-1 ch Tlej盘于 re wn-diBOlUi FiJlEb; Tbh 迪 i Sts&i =5Q 魁m图 3-14编译信息的输出显示级别有三种,分别是0、1和2。级别0代表显示所有 信息,包括各种错误、警告和提示信息,如图3-14所示;级别1代表显示错 误和警告信息,忽略提示信息;级别3代表只显示错误信息而忽略警告和提示 信息。在任何一个大的级别上还可以对某些信息单独设定显示或关闭。每个信息 都有一个识别标号,见图3-14中信息项“”中的数字,打开或关闭某类信息 只需在errorleve

11、l伪指令中引用信息识别标号,并在其前面用“ + ”或“-”号, 即代表打开或关闭这一类信息,例如:;显示所有信息,但不需要302和305这两类errorlevel 0, -302, -305 提示信息errorlevel 1, +305;显示错误和警告信息,但同时还要关注305类的提示信息#define / #undefine例 3-04#define的作用是定义常数符号,即用一个符号变量替换另一个符号串或变 量。被替换的可以是任意字母数字组成的符号但替换者本身不能是一个纯数字。 例如:#define DELAY_TIME 1000;定义常数符号,即用DELAY_TIME符号代替1000#de

12、fine KEY1 P0RTB,7 ;用KEY1符号代替端口 PORTB的第7引脚例 3-05用#define伪指令定义符号后,可使程序中的变量或指令变得更具实际意义, 也使程序变得更易维护。指令“btfss PORTB,7”和“btfss KEY1”在事先用了 例3-05中的#define后编译的结果是一样的,但明显地后者看起来更容易理 解,一看就知道这是在测试编号为KEY1的一个按键。而且如果你的硬件设计改 动了 KEY1所接的单片机引脚,只要改动这一#define重新定义引脚位置,程 序的其它部分无需任何修改,再编译一次即可得到更新后的软件代码。一个好的 编程习惯是事先把一些代表实际意义

13、的变量、单片机的输入输出引脚在硬件电路 中的实际功能等用#define伪指令定义成简单直观的符号名字,然后在程序中直 接用其符号名字而不用简单机械的数字形式。替换的工作由编译器在编译时自动 完成。它会先扫描你的源程序代码,把事先#define的符号名改回成被替换的字 符串,然后再继续编译生产机器码。equequ顾名思义是“等于”的意思,其作用和#define伪指令有点类似,也是 用一个符号名字替换其它数字变量,但它只能替换立即数。如果要替换一个符号 名字,则此符号名必须事先用#define或equ伪指令已经定义替换了一个立即 数。例如:#define MyCount 0x70 ;定义 MyCo

14、unt 符号替换立即数 0x70w_temp equ 0x20;符号名 w_temp 等于 0x20countl equ MyCount ;符号名 countl 等同于 MyCount;如果MyCount没有事先定义则会产生一个错误例 3-06在绝对定位的编程模式中equ被经常用于定义用户自己的变量,即用一个符 号名代替一个固定的存储单元地址,上例3-06中的w_temp定义即属于此类。 用equ方式定义的符号在汇编后可以生成相关的调试信息,可以通过各种变量 观察的方式显示此符号所代表的内存地址处的数据内容,但用#define方式定义 的符号则不能产生调试信息。要注意equ伪指令本身并没有限定

15、所定义的一定 是一个变量地址,它只是一个简单的符号和数字替换而已,其意义必须和具体的 指令结合才能确定,如下例3-07中对符号w_temp的理解。w_temp equ 0x20;符号名 w_temp 等于 0x20movlwmovwfmovfmovwfmovlw0x55w_tempw_t emp, wFSRw_tempFSR;W=0x55;把W的值送给变量w_temp, (0x20单元内容= 0x55);把w_temp单元内容送W,(W=0x55);把 W 的内容送 FSR,(FSR=0x55);把w_temp所代表的立即数即地址值送给W, (W=0x20);让 FSR 指针指向 w_temp,(FSR=0x20 而不是 0x55)例 3-07cblock / endc用equ伪指令可以给一个符号变量分配一个地址。但在一个程序设计过程中 往往需要定义很多变量,你当然可以给每一个变量逐个用equ的方法分配一个 地址空间。但如果变量很多,这样

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号