当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]源程序的编写主要就是用这些基本的指令实现你的控制任务。但为了增加源程序的可读性和可维护性,我们引入了伪指令的概念。伪指令本身不会产生可执行的汇编指令,但它们可以

源程序的编写主要就是用这些基本的指令实现你的控制任务。但为了增加源程序的可读性和可维护性,我们引入了伪指令的概念。伪指令本身不会产生可执行的汇编指令,但它们可以帮组“管理”你编写的程序,其实用性和必要性绝不亚于 35 条正真的汇编指令。我们在此着重介绍最常用的几种伪指令。

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

#include 或 include

#include 伪指令的作用是把另外一个文件的内容全部包含复制到本伪指令所在的位置。被包含复制的文件可以是任何形式的文本文件,当然文件中的内容和语法结构必须是 MPASM 能够识别的。最经常被“include”的是针对 PIC 单片机内部特殊功能寄存器定义的包 含 头 文 件 , 在MPLAB安 装 后 它 们 全 部 放 在 路 径 “ C:\Program Files\MPLAB IDE\MCHIP_Tools”下,每一个型号的 PIC 单片机都有一个对应的预定义包含头文件,扩展名是“.inc”。除了一些符号预定义文件,你也可以把现有的其它程序文件作为一个代码模块直接“包含”进来作为自己程序的一部分。见例 3-01。

#include 把预定义的 PIC16F877A 寄存器符号包含到此处

#include ”math.asm” 把现有的程序文件包含进来作为自己代码的一部分

例 3-01

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

list

list 伪指令可以设定程序编译时的一些信息,例如所选单片机的型号,编译时选择的缺省数制等。例如:

list p=16f877a, r=DEC 单片机型号为 PIC16F877A,无特别指明的数字为十进制数

例 3-02

如果程序开发时使用项目管理的模式,则所有 list 伪指令可以描述的参数项都可以在项目的设定选项中通过对话框的形式设定并保存。在此只需对 list 伪指令稍作了解即可。

__config

此伪指令的重要作用是把芯片的配置字设定在源程序中,请参阅 2.5 节的详细说明。建议大家尽量用此伪指令把芯片的配置字写在程序中。

__idlocs

PIC 单片机中有一处非常特殊的标记单元。它独立于任何其它存储器,唯一的作用就是作为一个标记。此标记值无法用软件读到,读取和写入的方法只有通过编程器实现。此标记值没有读保护,你可以利用它存放程序的版本或日期等信息。如果需要,则可以用伪指令 __idloc 在程序中定义具体的值。

__idloc 0x1234

设定芯片的标记值为 0x1234,注意前面有两个下划线符

例 3-03

和__config 伪指令定义的配置字一样,用__idloc 定义的芯片标记值在最后也会存放在HEX 文件中,这就要求编程器能够解析它。

errorlevel

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

编译信息的输出显示级别有三种,分别是 0、1 和 2。级别 0 代表显示所有信息,包括各种错误、警告和提示信息,如图 3-14 所示;级别 1 代表显示错误和警告信息,忽略提示信息;级别 3 代表只显示错误信息而忽略警告和提示信息。在任何一个大的级别上还可以对某些信息单独设定显示或关闭。每个信息都有一个识别标号,见图 3-14 中信息项“[]”中的数字,打开或关闭某类信息只需在 errorlevel 伪指令中引用信息识别标号,并在其前面用“+”或“-”号,即代表打开或关闭这一类信息,例如:

errorlevel 0, -302, -305 显示所有信息,但不需要 302 和 305 这两类提示信息

errorlevel 1, +305 显示错误和警告信息,但同时还要关注 305 类的提示信息

#define / #undefine 例 3-04

#define 的作用是定义常数符号,即用一个符号变量替换另一个符号串或变量。被替换的可以是任意字母数字组成的符号但替换者本身不能是一个纯数字。例如:

#define DELAY_TIME 1000 定义常数符号,即用 DELAY_TIME 符号代替 1000

#define KEY1 PORTB,7 用 KEY1 符号代替端口 PORTB 的第 7 引脚 例 3-05

用#define 伪指令定义符号后,可使程序中的变量或指令变得更具实际意义,也使程序变得更易维护。

指令“btfss PORTB,7”和“btfss KEY1”在事先用了例 3-05 中的#define 后编译的结果是一样的,但明显地后者看起来更容易理解,一看就知道这是在测试编号为KEY1 的一个按键。

PIC指令功能分类表

类型 助记符 操作说明 命令说明

传 送 类 MOVF F,dF→d 将F寄存器的内容传送到F本身(d=1)或W(d=0)(影响状态位)Z

MOVWF FW→F 将W寄存器的内容传送到F,W内容不变-

MOVLW KK→W 将8位立即数传送到W寄存器-

SWAPF F,dF半字节交换→dF寄存器的高4位和低4位交换位置后,结果存入F本身(d=1)或W(d=0)中-[!--empirenews.page--]

算 术 运 算 类 ADDWF F,dF+W→dW寄存器的内容和F寄存器的内容相加,结果存入F(d=1)或W(d=0)中C,DC,Z

ADDLW F,dK+W→WW寄存器的内容和8位立即数相加,结果存入WC,DC,Z

INCF F,dF+1→dF寄存器的内容加1后,结果存入W(d=0)或F(d=1)中Z

SUBWF F,dF-W→dF寄存器的内容减去W寄存器的内容,结果存入W(d=0)或F(d=1)中C,DC,Z

SUBLW KK-W→W8位立即数减掉W寄存器的内容,结果存入WC,DC,Z

DECF F,dF-1→dF寄存器的内容减1后,结果存入W(d=0)或F(d=1)中Z

逻 辑 运 算 类 ANDWF F,dF∧W→dW寄存器的内容和F寄存器的内容相与,结果存入F(d=1)或W(d=0)中Z

ANDLW KK∧W→WW寄存器的内容和8位立即数相与,结果存入WZ

IORWF F,dF∨W→dW寄存器的内容和F寄存器的内容相或,结果存入F(d=1)或W(d=0)中Z

IORLW KK∨W→WW寄存器的内容和8位立即数相或,结果存入WZ

XORWF F,dF⊕W→dW寄存器的内容和F寄存器的内容相异或,结果存入F(d=1)或W(d=0)中Z

XORLW KK⊕W→WW寄存器的内容和8位立即数相异或,结果存入WZ

COMF F,dF取反→dF寄存器的内容取反后,结果存入F(d=1)或W(d=0)中Z

CLRF F0→F,寄存器复位F寄存器的内容被清为全0Z

CLRW -0→W,寄存器复位W寄存器的内容被清为全0Z

RLF F,dF带C循环左移→d将F寄存器带C循环左移,结果存入F本身(d=1)或W(d=0)。C

RRF F,dF带C循环右移→d将F寄存器带C循环右移,结果存入F本身(d=1)或W(d=0)。C

BCF F,B将F中第B位清0将寄存器的第B位清为0-

BSF F,B将F中第B位置1将寄存器的第B位置1-

程 序 跳 转 类 INCFSZ F,dF+1→d,结果若为0则跳一步F寄存器的内容加1后,结果存入F本身(d=1)或W(d=0)。如结果为0则跳过下一条指令,否则顺序执行-

DECFSZ F,dF-1→d,结果若为0则跳一步F寄存器的内容减1后,结果存入F本身(d=1)或W(d=0)。如结果为0则跳过下一条指令,否则顺序执行-

BTFSC F,BF中第B位为0,则跳一步测试F寄存器的第B位。若F(B)=0,则跳过下一条指令,否则顺序执行-

BTFSS F,BF中第B位为1,则跳一步测试F寄存器的第B位。若F(B)=1,则跳过下一条指令,否则顺序执行-

CALL K调用子程序首先将PC+1推入堆栈,然后将11位常数K送入PC(10~0),同时将PCLATH(4,3)→PC(12,11),从而使PC=子程序入口地址-

GOTO K 无条件跳转将11位常数K送入PC(10~0),同时将PCLATH(4,3)→PC(12,11),从而使PC=新地址-

RETURN -从子程序返回将堆栈顶端单元的内容弹出并送入PC,从而返回主程序断点处-

RETLW KW带参数子程序返回将堆栈顶端单元的内容弹出并送入PC,同时8位常数K→W,从而带着参数返回主程序断点处-

RETFIE -从中断服务子程序返回将堆栈顶端单元的内容弹出并送入PC,从而返回主程序断点处,同时将全局中断使能位GIE置1,从新开放中断-

控 制 类SLEEP -进入睡眠方式该指令执行后,单片机进入低功耗睡眠模式,时基电路停振TO,PD

CLRWDT -0→WDT将WDT寄存器和分配给它的预分频器同时清为全0TO,PD

NOP -空操作空操作

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭