历史上的今天
今天是:2024年11月27日(星期三)
2019年11月27日 | PIC单片机基础2
2019-11-27 来源:eefocus
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单片机基础1
史海拾趣
|
我用的主控是51,晶振是12m 我用51控制语音芯片,语音芯片工作在三线串口模式,但是语音芯片根本就不响应,我用仿真器仿真后所有的指令送的都正确,现在不知问题在哪?大家帮满看看… 查看全部问答> |
|
想学蓝牙技术,但觉得无从着手。只有些C51的技术。 看了下书,主要是CSR和EBDK。 但书本介绍的太不清楚了,书没买好。也没具体的案例。以及开发的工具。 请问大家我要从哪下手呢?开发工具要在哪买?要多少钱呢?要掌握些什么知识呢?… 查看全部问答> |
|
我们一直是用Sqlce与桌面的sql库同步数据,但很多用户不用sql数据库,另外sqlce环境也占用内户,所以我想请教大家,还有别的同步数据方案吗?手持机上不用加载数据库环境的方案。… 查看全部问答> |
|
怀着兴奋的心情踏上2010IIC秋季展会征途,却抱着失落的心情而回,包括IIC展和LED展,好不容易度过了3个小时,我觉得必须通过这个总结来弥补今天的付出,好让我记忆此刻半导体的现状,所以其中有些言语或者会比较直白,又或者是 ...… 查看全部问答> |
|
韦东山老师的 书 还是不错的 论坛里有一个贴 但是里面缺了很多章 发个完整版的 如果有版权问题 请斑竹删除~~~ 觉得此书好,请自觉购买正版书籍!!! (共11个附件) [ 本帖最后由 常见泽1 于 2 ...… 查看全部问答> |
|
贴出我的程序,单通的,测直流信号还可以,800mv 1KHz的正弦信号误差十分大,只显示0.1XX(XX是两个变化很快的数字),求解是什么原因?怎么解决? #include \"msp430g2553.h\" #include \"12864_1.h\" unsigned int s1 = 0; unsigned char i = ...… 查看全部问答> |




