📄 pic16cxxx-7.htm
字号:
<html>
<head>
<title>PIC16Cxxx单片机应用与设计</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
BODY {font-size:12px;font-family:宋体;}
td {font-size:12px;font-family:宋体;}
A:link { COLOR: #0000ff; TEXT-DECORATION: underline}
A:visited { COLOR:#0000ff; TEXT-DECORATION: underline}
A:active { COLOR:red! important; TEXT-DECORATION: underline}
A:hover { TEXT-DECORATION: none}
.b24 a:link { FONT-SIZE: 12px; COLOR:#0000ff; TEXT-DECORATION: underline}
.b24 a:visited {FONT-SIZE: 12px; COLOR:#0000ff; TEXT-DECORATION: underline}
.b24 a:active { FONT-SIZE: 12px; COLOR:#0000ff; TEXT-DECORATION: underline}
.b24 a:hover { FONT-SIZE: 12px; COLOR:#990000; TEXT-DECORATION: none}
.lh13 { LINE-HEIGHT: 130%}
.lh15 { LINE-HEIGHT: 150%}
.lh17 { LINE-HEIGHT: 170%}
.lh19 { LINE-HEIGHT: 190%}
.lh30 { LINE-HEIGHT: 300%}
-->
</style>
</head>
<body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" >
<table width="775" border="0" align="center" cellpadding="0" cellspacing="0">
<tr align="center">
<td> </td>
</tr>
<tr align="center">
<td> <table width="700" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="41%" height="46" valign="top"><img src="logo.gif" width="205" height="41"></td>
<td height="46" width="59%" valign="bottom" align="right"> <table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="right"><b><font style="font-size:16px" color="#990000">——
—— —— 技术资料下载中心</font></b> </td>
</tr>
<tr>
<td height="8"></td>
</tr>
</table></td>
</tr>
<tr>
<td height="1" colspan="2"></td>
</tr>
<tr bgcolor="#990000">
<td height="1" colspan="2"></td>
</tr>
<tr>
<td colspan="2"> </td>
</tr>
<tr>
<td colspan="2"><font style="font-size:16px" color="#000000"><b>>> <a href="index.htm">PIC16CXXX单片机应用与设计</a>
\</b></font></td>
</tr>
<tr>
<td colspan="2"> </td>
</tr>
</table>
<table width="700" border="0" cellspacing="0" cellpadding="2" class="lh15">
<tr>
<td align="center"><b><font size="3">第七章 PIC16CXX指令系统</font><font size="3"></font></b></td>
</tr>
<tr>
<td> <p> </p></td>
</tr>
<tr valign="top">
<td height="300"> PIC16CXX每条指令长14位,指令由操作码和操作数组成。PIC16CXX共有35条指令,由操作对象可分为:<br>
1. 面向字节操作类<br> 2.
面向位操作类<br> 3. 常数操作和控制类操作。<br>
全部指令如图7.1所示。<br> <img src="image/a308.gif" width="702" height="1261">
注:(1)PIC16CXX有35条基本指令及二条附加指令,即TRIS和OPTION。在PIC16CXX中TRIS和OPTION寄存器是直接可寻址的,所以不必用这二条指令,保留它们只是为了和PIC16C5X向上兼容,即便于PIC16C5X代码向PIC16CXX的移植,见下节指令详介。<br>
(2)对I/O寄存器操作的指令,如"MOVF 6,1",使用的F6(RB口)的值是RB口脚上的状态值,而非输出锁存器的值。<br>
(3)"f"代表寄存器,"d"代表目的寄存器,当d=0,操作结果放入W寄存器,d=1,则结果放入
f寄存器。"b"代表位(0~7),K代表一个8位或11位的常数。
<p>§7.1 PIC16CXX 指令寻址方式<br>
<br>
PIC16XX单片机寻址方式根据操作数的来源,要分为寄存器间接寻址、立即数寻址、直接寻址和位寻址四种。<br>
<br>
一、寄存器间接寻址<br>
这种寻址方式通过寄存器F0、F4来实现。实际的寄存器地址放在F4的低5位中,通过F0来进行间接寻址。</p>
<p align="center"><img src="image/a309.gif" width="356" height="87"></p>
<p>上面这段程序把55H送入F5寄存器。间址寻址方式主要用于编写查表、写表程序,非常方便。请参考程序设计技巧。<br>
<br>
二、立即数寻址<br>
这种方式就是操作数为立即数,可直接从指令中获取。</p>
<p><img src="image/a310.gif" width="316" height="22"></p>
<p>三、直接寻址<br>
这种方式是对任何一寄存器直接寻址访问。<br>
<img src="image/a312.gif" width="310" height="43"> </p>
<p>四、位寻址<br>
这种寻址方式是对寄存器中的任一位(bit)进行操作。</p>
<p><img src="image/a313.gif" width="391" height="26"></p>
<p> <br>
§7.2 PIC16CXX 指令详介<br>
<br>
1. 立即数加法指令<br>
格式: ADDLW K<br>
<br>
代码: <img src="image/a314.gif" width="190" height="59"><br>
指令周期: 1<br>
操作: W+K→W<br>
影响状态位: C,DC,Z<br>
说明: W寄存器的内容与8位立即数K相加,结果放入W寄存器。<br>
例: ADDLW 60H ; W+60H→W<br>
───────────────────────────</p>
<p>2. 寄存器加法指令</p>
<p><br>
格式: ADDWF f,d<br>
<br>
代码: <img src="image/a315.gif" width="171" height="60"><br>
<br>
指令周期: 1<br>
操作: W+f→d<br>
影响状态位: C,DC,Z<br>
说明: W寄存器内容和f寄存器内容相加,结果存入f(d=1)或W(d=0)<br>
例: ADDWF 8,0 ; F8+W→W<br>
ADDWF 8,1 ; F8+W→F8<br>
───────────────────────────</p>
<p>3. 立即数逻辑"与"指令<br>
格式: ANDLW K<br>
<br>
代码:<img src="image/a316.gif" width="183" height="54"><br>
<br>
指令周期: 1<br>
操作: W∧K→K<br>
影响状态位: Z<br>
说明: W和8位立即数K相"与",结果存入W。<br>
例: ANDLW 55H,0 ; W∧55H→W<br>
───────────────────────────</p>
<p>4. 寄存器逻辑"与"指令<br>
格式: ANDWF f,d<br>
<br>
代码:<img src="image/a317.gif" width="161" height="61"><br>
<br>
指令周期: 1<br>
操作: W∧f→d<br>
影响状态位: Z<br>
说明: W寄存器内容和f寄存器内容相"与",结果放入W(d=0)或f(d=1)<br>
例: ANDWF 8,0 ; W∧F8→W<br>
ANDWF 8,1 ; W∧F8→F8<br>
───────────────────────────</p>
<p>5. 位清零指令<br>
格式: BCF f,b<br>
<br>
代码: <img src="image/a318.gif" width="156" height="53"><br>
<br>
指令周期: 1<br>
操作: 0→f(b)<br>
影响状态位: 无<br>
说明: 将f寄存器的b位清为0。<br>
例: BCF 8,0 ; 将F8的bit0清为0。<br>
BCF 8,2 ; 将F8的bit2清为0。<br>
───────────────────────────<br>
6. 位置"1"指令</p>
<p>格式: BSF f,b<br>
<br>
代码: <img src="image/a319.gif" width="154" height="59"><br>
<br>
指令周期: 1<br>
操作: 1→f(b)<br>
影响状态位: 无<br>
说明: 将f寄存器的b位置为1。<br>
例: BSF 5,1 ; 将F5(RA口)的bit1(RA1)置为"1"。<br>
───────────────────────────</p>
<p>7. 位测试,为"0"则跳指令<br>
格式: BTFSC f,b<br>
<br>
代码: <img src="image/a320.gif" width="151" height="56"><br>
<br>
指令周期: 1或2(产生跳转为2)<br>
操作: 如果f(b)=0则跳(PC+1→PC0<br>
影响状态位: 无<br>
说明: 测试f寄存器第b位,如f(b)=0则跳过下一条指令(PC+1→PC),否则顺序执行下<br>
去。<br>
例: ┌─ BTFSC 8,2 ; 测试F8的bit2<br>
bit2=0 │跳 MOVF 5,0 ; bit2=1,执行这条指令<br>
└─ INCF 9,1 ; bit2=0,则跳到这条指令。<br>
───────────────────────────<br>
8. 位测试,为"1"则跳指令<br>
格式: BTFSS f,b<br>
<br>
代码: <img src="image/a320.gif" width="151" height="56"><br>
<br>
指令周期: 1或2(产生跳转为2)<br>
操作: 如果f(b)=1则跳(PC+1→PC)<br>
影响状态位: 无<br>
说明: 测试f寄存器的第b位,如位f(b)=1则跳过下一条指令,否则顺序执行下去。<br>
<img src="image/a321.gif" width="409" height="70"> <br>
─────────────────────────── </p>
<p>9. 子程序调用指令<br>
格式: CALL K<br>
<br>
代码: <img src="image/a325.gif" width="197" height="57"><br>
<br>
指令周期: 2<br>
操作: PC+1→堆栈,K→PC910,0) PCLATH(4,3)→PC912,11)<br>
影响状态位: 无<br>
说明: 子程序调用。首先将PC加1推入堆栈,然后将常数K(11位)→PC(10,0),同时<br>
PCLATH(4,3)→PC(12,11),形成PC=子程序入口地址。<br>
<img src="image/a326.gif" width="373" height="149"><br>
───────────────────────────</p>
<p>10. 寄存器清零指令<br>
格式: CLRF f<br>
<br>
代码:<img src="image/a327.gif" width="157" height="54"><br>
<br>
指令周期: 1<br>
操作: 0→f<br>
影响状态位: Z<br>
说明: f寄存器被清为全零,状态位Z=1。<br>
例: CLRF 9 ; F9=00H<br>
───────────────────────────</p>
<p>11. W清零指令<br>
格式: CLRW<br>
<br>
代码: <img src="image/a328.gif" width="181" height="58"><br>
<br>
指令周期: 1<br>
操作: 0→W<br>
影响状态位: Z<br>
说明: W寄存器清全零,状态位Z=1。<br>
例: CLRW ; W=00H<br>
───────────────────────────</p>
<p>12. 看门狗计数器清零指令<br>
格式: CLRWDT<br>
<br>
代码: <img src="image/a330.gif" width="156" height="57"><br>
<br>
指令周期: 1<br>
操作: 00→WDT,0→WDT分频器<br>
影响状态位: 1→TO,1→PD<br>
说明: 清零WDT计数器,同时WDT分频器(如果欲分频倍数分配给WDT)也清为零。指<br>
令执行后状态位TO=1,PD=1。<br>
───────────────────────────</p>
<p>13. 寄存器取反指令<br>
格式: COMF f,d<br>
<br>
代码: <img src="image/a331.gif" width="163" height="54"><br>
<br>
指令周期: 1<br>
操作: f→d<br>
影响状态位: Z<br>
说明: f寄存器内容取反后送入W(d=0)或f本身(d=1)。<br>
例: COMF 8,0 ; F8→W<br>
COMF 8,1 ; F8→F8<br>
───────────────────────────<br>
14. 寄存器减1指令<br>
格式: DECF f,d<br>
<br>
代码: <img src="image/a332.gif" width="159" height="55"><br>
<br>
指令周期: 1<br>
操作: f-1→d<br>
影响状态位: Z<br>
说明: F寄存器内容减1后送入W(d=0)或f(d=1)。<br>
───────────────────────────<br>
15. 寄存器减1,结果为零则跳指令<br>
格式: DECFSZ f,d<br>
<br>
代码: <img src="image/a333.gif" width="153" height="61"><br>
<br>
指令周期: 1或29跳则为2)<br>
操作: f-1→d,结果为零则跳(PC+1→PC)<br>
影响状态位: 无<br>
说明: f寄存器内容减1存入W(d=0)或f(d=1)。如结果为0则跳过下一条指令(PC+1→PC)。<br>
<img src="image/a334.gif" width="362" height="66"> <br>
───────────────────────────</p>
<p>16. 无条件跳转指令<br>
格式: GOTO K<br>
<br>
代码: <img src="image/a335.gif" width="186" height="54"><br>
<br>
指令周期: 2<br>
操作: K→PC(10,0),PCLATH(4,3)→PC(12,11)<br>
影响状态位: 无<br>
说明: 无条件跳转,11位常数K→PC(10,0) PCLATH(4,3)→PC(12,11)。<br>
<img src="image/a336.gif" width="380" height="96"> <br>
───────────────────────────</p>
<p>17. 寄存器加1指令<br>
格式: INCF f,d<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -