PIC单片机基础2
PIC中档系列单片机,每条指令14位,共有35条汇编指令,根据操作对象不同,可将其分为三类:
- 字节操作类指令
- 位操作类指令
- 立即数与控制类操作指令
1、字节操作类指令,以MOVF指令为例:
指令:MOVF f, d
说明:
- 功能:寄存器f值传送;
- MOVF为助记符,即操作指令,大小写均可;
- f代表文件寄存器标识符,即RAM寄存器(PIC单片机基础1中有说明),取值范围为[0, 127]
- d代表目标标识符,表明指令操作的结果放在何处;
d=0:操作的结果放在W寄存器中;
d=1:操作的结果放在f寄存器中;
- 影响状态位:Z
- 指令周期:1(执行本指令需要的时间)
实例1:
假设执行指令前,F寄存器22H的值为05H,W寄存器内的值为00H
MOVF 22H, 0
由于d=0,指令执行后结果存入W寄存器:
22H(F寄存器)= 05H;
W = 05H;
Z = 0;
指令应用:由于PIC指令中,不存在F寄存器之间的值传递操作指令,这种操作需要借助W寄存器作为中介,并且此指令也可以直接给W寄存器赋值;
实例2:
假设执行指令前,F寄存器22H的值为05H,W寄存器内的值为00H
MOVF 22H, 1
由于d=1,指令执行后结果存入F寄存器(即22H):
22H(F寄存器)= 05H;
W = 00H;
Z = 0;
指令应用:指令操作以后,寄存器值大小、位置都没变,那么这种指令有什么用呢?答案是:通过状态位Z判断寄存器的值是不是0。
在PIC的汇编指令中,我们没有高级语言中if (var == 0)这样方便的判断操作,想要判断一个寄存器的值是不是0,只有通过状态寄存器中的Z位来判断。当某条可以影响Z状态位的指令执行后,如果Z=0,则说明指令执行的结果非0;如果Z=1,则说明执行的结果为0。
上面的指令操作后Z=0,所以判断22H中的值非0。
2、位操作类指令,以BCF指令为例:
指令:BCF f, b
说明:
- 功能:f寄存器的位b清零;
- BCF和f不在赘述,命令中的b表示f寄存器的位b,从零开始,取值范围为0~7;
- 影响状态位:无(PIC的所有位操作指令都不影响状态位);
- 指令周期:1;
示例:
假设执行指令前,FLAG_REG寄存器的值为0xFF(1111 1111b)
BCF FLAG_REG, 3
注意:位是从0开始的,指令中的位3,实际对应的是寄存器的第四位
执行后:
FLAG_REG = 0xF7(1111 0111b)
指令应用:在程序中,我们经常会用到很多标志位,通过标志位来确定某项功能的当前状态,标志位的状态可通过位操作实现。
3、立即数与控制类操作指令,以MOLW指令为例:
指令:MOVLW k
说明:
- 功能:立即数k送入W寄存器;
- K为立即数,取值范围为[0, 255];
- 影响状态位:无;
- 指令周期:1;
以下通过两个具体示例,说明对于立即数k的理解:
示例1:
假设执行指令前W寄存器值为00H
MOVLW 30H
执行后:
W = 30H
这种操作,明显直接。
示例2:
假设执行指令前寄存器UD_REG的地址为25H,寄存器的值为45H,W寄存器的值为00H
MOVLW UD_REG
执行后:
W = 25H
先说一下寄存器、寄存器地址、寄存器值、寄存器名的关系:
寄存器:我们可以把它当做一个个的盒子;
寄存器地址:由于盒子(寄存器)太多,我们需要给每个盒子加一个编号,00,01,…,这样便于我们描述要找的是哪一个盒子,这个编号就是寄存器地址;
寄存器值:在这些盒子里面,我们可以放鞋子、袜子…,这些放在盒子里面的东西就是寄存器的值;
寄存器名:为了让人便于知道盒子里面装的是什么,我们可以给盒子起一个别名,比如01编号里面装的是运动鞋,那么可以把它叫做运动鞋盒,以后说运动鞋盒,就是指01编号盒子,上面的UD_REG就是这个道理;
在示例2中,执行指令后W寄存器的值是寄存器UD_REG的地址。所以在执行此类操作时,一定要小心谨慎,不能被寄存器的值忽悠了。
以上是对三类命令的大体分析,完整的指令列表详见单片机的数据手册或指令集说明手册。
PIC单片机基础2的更多相关文章
- PIC单片机基础1
1.PIC单片机总线结构——哈佛结构:即指令和数据空间是完全分开的,所以与常见的微控制器不同的一点是,程序和数据总线可以采用不同的宽度.以PIC16F684单片机为例,数据总线是8位的,但指令总线位数 ...
- 【PIC单片机】Pic单片机基础知识
本次学习采用PIC16F877A芯片及HJ-5G 开发板 一.IO口操作 1.1 设置I/O口方向:input or output TRISx 方向寄存器 (Transport and Receive ...
- PIC单片机状态寄存器中的C(进位/借位位标志)
查阅PIC单片机芯片手册,关于进位/借位位的说明为: C:进位/借位位. 1 = 结果的最高位发生了进位 0 = 结果的最高位未发生进位 同时有一条标注:借位的极性是相反的. 通过以上说明,可以将C的 ...
- 【PIC单片机】MPLAB X IDE快速入门指南
引言:近期由于项目实践需要,开始动手学习相关硬件知识.从PIC单片机入手. 单片机学习核心要点:查数据手册 配置寄存器 一.基于MPLAB X IDE配置位设置 MPLAB X IDE和MPLAB I ...
- PIC单片机之时钟设置
PIC单片机之时钟设置 http://blog.csdn.net/superanters/article/details/8541650 内部时钟和外部时钟? PIC单片机有许多型号可以设置成 用外部 ...
- PIC单片机的定时器
PIC单片机的定时器有3个 timer0 timer1 timer2 定时器的计算方法 256*k*Tcy=定时时间 (256-Init-value)*k*Tcy=定时时间
- PIC单片机的XC8
用MPLAB IDE 对pic16f887进行编程的时候需要配置字 用__CONFIG(0xc3e4);__CONFIG(0xffff); 就可以 但是用MPLAB X IDE 对pic16f887编 ...
- 51单片机学习笔记(郭天祥版)(1)——单片机基础和点亮LED灯
关于单片机型号的介绍: STC89C52RC40C-PDIP 0721CV4336..... STC:STC公司 89:89系列 C:COMS 52(还有51,54,55,58,516,):2表示存储 ...
- MOS管使PIC单片机不能正常运行
程序: #include "led.h" void InitLed(void) { TRISB &= ~0x70; ANSELB &= ~0x70; } void ...
随机推荐
- 十八、Hadoop学记笔记————Hbase架构
Hbase结构图: Client,Zookeeper,Hmaster和HRegionServer相互交互协调,各个组件作用如下: 这几个组件在实际使用过程中操作如下所示: Region定位,先读取zo ...
- springboot整合shiro后报java.lang.ClassCastExcepting异常
最近搭一个springboot的框架,整合了shiro和redis,由于平常习惯用热部署,所以自然的引入了热部署的包,但是引入后报如下错误: 没错,这个问题害我搞了一天,后来删除热部署,项目正常的跑飞 ...
- linux实时文件事件监听--inotify
一.inotify简介 inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系 ...
- Vue 2.0 路由全局守卫
vue2.0 实现导航守卫(路由守卫) 路由跳转前做一些验证,比如登录验证,是网站中的普遍需求. 对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navi ...
- Spring Security 实战:QQ登录实现
准备工作 1.在 QQ互联 申请成为开发者,并创建应用,得到APP ID 和 APP Key.2.了解QQ登录时的 网站应用接入流程.(必须看完看懂) 为了方便各位测试,直接把我自己申请的贡献出来:A ...
- 《Spring Cloud与Docker微服务架构实战》配套代码
不才写了本使用Spring Cloud玩转微服务架构的书,书名是<Spring Cloud与Docker微服务架构实战> - 周立,已于2017-01-12交稿.不少朋友想先看看源码,现将 ...
- 12.app后端如何选择合适的数据库产品
app后端的开发中,经常要面临的一个问题是:数据放在哪里? mysql ?redis?mongodb? 现在有这么多优秀的开源数据库产品,怎么根据业务场景来选择合适的数据? 常用的数据库产品的优缺点又 ...
- Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录
Python 2.7 IDE Pycharm 5.0.3 Selenium:Selenium的介绍及使用,强烈推荐@ Eastmount的博客 PIL : Pillow-3.3.0-cp27-cp27 ...
- linux下设置phantomjs环境变量
1)vim /etc/profile2)在文件的最后一行,添加安装路径path语句:(注意路径是phantomjs的安装路径)export PATH=${PATH}:/usr/local/src/ph ...
- switch窗口句柄
Set<String> windows = browser.getWebDriver().getWindowHandles(); //获得所有窗口句柄 for (String string ...