搜档网
当前位置:搜档网 › 指令PIC的指令详解

指令PIC的指令详解

伪指令
#include p16f877a.inc
list p=16f877a,r=dec
__config
__idlocs(用户利用它存放程序版本或日期等) __idlocs 0x1234
errorlevel 0,-302,-305 (编译信息输出显示等级及对对某些信息的单独设定)
#define/#undefine #define KEY1 PORTB,7
equ w_temp equ 0x20
cblock+endc: cblock 0x20 w_temp buffer:8 var1 endc
org 0x00
dt(定义表格数据 代替retlw)table addwf pcl,f
dt 0
dt 1,2,'3';retlw 1 ;retlw 2
;retlw 0x33('3')
dt "abc" ;retlw 'a' ;retlw 'b'
;retlw 'c'
de(源程序中定义片内eeprom的初值 其实地址0x2100) org 0x2100
de 0,1,2,3
de "ABCD";定义8个字节
fill(填充程序空间) fill 0x0000,5
fill (goto $),next_bloclk-$ (从当前填充至标号next)死循环
end
宏指令
banksel、pagesel、bankisel、clrc、setc、clrz、setz、clrdc、setdc、skpc、skpnc、skpdc、skpndc、bc、bnc、bz、bnz、bdc、bndc
macro自定义宏

1.ADD LITERAL TO W
ADDLW K (W)+K->W加立即数至W
ADDLW 0X15
W=0X10->0X25
2.ADD W TO F
ADDWF F,D ((W)+(F)->W/F)
ADDWF REG1,0 ADDWF FSR,1
3.ADD W AND CARRY D TO F
ADDWFC F,D
ADDWFC FSR,1 (W+FSR+C->FSR)
4.AND LITERAL AND W
ANDLW K
ANDLW 0x5F((W)并0x5F->W)
5.AND W WITH F
ANDWF F,D
ANDWF FSR 1 (W并FSR->W/F)
6.BIT CLEAR F
BCF F,B
BCF FLAG_REG,7 将FLAG_REG的D7清0
7.BIT SET F
BSF F,B
BSF PROTA,0 PROTA的D0置1
8.BIT TEST,SKIP IF CLEAR
BTFSC F,B
BTFSC FLAG,1 FALSE TRUE位测试 0跳转
9.BIT TEST,SKIP IF SET
BTFSS F,B
BTFSS FLAG,1 FALSE TRUE位测试 1跳转
10.BIT TOGGLE F
BTG F,B
BTG PROTC,4 位取反 PORTC=0111 0101->0110 0101
11.SUBROUTINE CALL
CALL 调用子程序
12.CLEAR F
CLRF FLAG_REG (F清零 置Z=1)
13.CLEAR W REGISTER
CLRW (W清零 置Z=1)
14.CLEAR WATCHDOG TIMER
CLRWDT(监视定时器清零 00h->WDT 0->WDT预定标器 1->TO' 1->PD')
https://www.sodocs.net/doc/9e5763018.html,PLEMENT F
COMF REG1,0(寄存器内容取反->W/F)
https://www.sodocs.net/doc/9e5763018.html,PARE F WITH W,SHIP IF F=W
CPFSEQ REG
https://www.sodocs.net/doc/9e5763018.html,PARE F WITH W,SHIP IF F>W
CPFSGT REG
https://www.sodocs.net/doc/9e5763018.html,PARE F WITH W,SHIP IF FCPFSLT REG
19.DECIMAL ADJUST W REGISTER
DAW REG1,0 (对F中内容进行10进制调整->F/W+F)
REG1=0XA5 C=0 DC=0->0X05 C=1 DC=0
20.DECREMENT F
DECF CNT,1(寄存器内容减1->W/F)
21.DECREMENT F,SHIP IF 0
DECFSZ CNT,1
GOTO ...
CONTINUE ...(减1后为0跳转至CONTINUE)
22.DECREMENT F,SHIO IF NOT 0
DECFSNZ CNT,0
GOTO ...
CONTINUE ...(减1后不为0跳转至CONTINUE)
23.UNCONDITIONAL BRANCH
GOTO 地址
24.INCREMENT F
INCF CNT,1(指令加1)
CNT=0XFF Z=0 ->CNT=0X00 Z=1 C=1
25.INCREMENT F,SHIP IF 0
INCFSZ F,D
26.INCREMENT F,SHIP IF NOT 0
INCFSNZ F,D
27.INCLUSIVE OR LITERAL WITH W
IORLW 0X35((W)或0X35->W)
28.INCLUSIVE OR W WITH F
IORWF RESULT,1 ((W)或RESULT->RESULT)
29.LONG CALL 长调用指令 ???和CALL有区别???
MOVLW HIGH 高位地址
MOVPF WREG,PCLATH 存放在PCLATH中
LCALL LOW 调用子程序(指令只含低8位地址)
30.MOVE F
MOVF REG,0 ((REG)->W)


31.MOVE F TO P
MOVFP F,P (F:00H-FFH P:00H-1FH)
MOVFP REG1,REG2
把数据存储单元传至某外围接口寄存器内容
32.MOVE LITERAL TO LOW NIBBLE IN BSR
MOVLB 0XA5 BSR=0X22->0X25(传立即数至BSR寄存器低4位 高4位为0)
33.MOVE LITERAL TO HIGH NIBBLE IN BSR
MOVLR 5 BSR=0X22->0X52 (传至高4位 低4位为0)
34.MOVE LITERAL TO W
MOVLW 0X5A W=0X5A (立即数传至W)
35.MOVE P TO F
MOVPF REG1,REG2 (F:00H-FFH P:00H-1FH)
把某外围接口寄存器内容传至数据存储单元
36.MOVE W TO F
MOVWF REG ((W)->REG)
37.NEGATE W
NEGW REG 0 (REG取反->F/F+W)取反的规则???P251
38.NO OPERATION
NOP
无操作 占用一个指令周期 PC+1
39.LOAD OPTION REGISTER
(W)->OPTION 只为可移植至PIC16C6X 不建议使用
40.RETURN FROM INTERRUPT
RETFIE
TOS->PC 1->GIE (中断允许位GIE开放中断)指令周期2
41.RETURN LITERAL TO W
RETLW K
K->W TOS->PC(立即数传至W 并返回地址至PC)指令周期2
CALL TABLE
TABLE ADDWF PC
RETLW K1
RETLW K2
...
RETLW KN
->W=0X07->W=K7?????
42.RETURN FROM SUBROUTINE
RETURN (TOS->PC 指令周期2)
43.ROTATE LEFT F THROUGH CARRY
RLF F,D/RLCF F,D
F(N)->D(N+1) F(7)->C C->D(0)
RLF REG1,0
REG1=1110 0110->1110 0110 C=0->1 W=1100 1100
44.ROTATE LEFT F NO CARRY
RLNCF F,D
无进位循环左移
45.ROTATE RIGHT F THROUGH CARRY
RRF F,D/RRCF F,D
RRF REG1,0
REG1=1110 0110->1110 0110 C=1->0 W=0111 0011
46.ROTATE RIGHT F NO CARRY
RRNCF F,D
无进位循环右移
47.SET F
SETF F,S
SETF REG,0
WREG=0X05->0XFF REG=0XDA->0XFF
48.SLEEP
OOH->WDT 0->WDT预分频器 1->TO'(定时时间) 0->PD'掉电状态
49.SUBTRACT W FROM LITERAL
SUBLW K
K-(W)->W
MOVLW 01H
SUBLW 02H W=01H C=1结果为正

MOVLW 02H
SUBLW 02H W=0 C=1结果为0

MOVLW 02H
SUBLW 01H W=FF C=0结果为负
50.SUBTRACT W FROM F
SUBWF F,D
MOVLW 3
MOVWF REG1
MOVLW 2
SUBWF REG1,0 W=1 C=1

MOVLW 2
MOVWF REG1
MOVLW 2
SUBWF REG1,0 W=0 C=1

MOVLW 2
MOVWF REG1
MOVLW 3
SUBWF REG1,0 W=FF C=0
51.SUBTRACT W FROM F WITH BORROW
SUBWFB F,D
(F)-(W)-C->F/W带借位F-W减法
MOVLW 4
MOVWF REG1
MOVWF REG1
MOVLW 2
SUBWFB REG1,0 设C初始为1 则W=1 C=1
52.SWAP F
SWAPF F,D
SWAPF REG1,1
REG1=0XA5->0XA5 W=0X5A REG1=0X5A?????
53.TABLE READ
TABLRD T,I,F
TABLRD 1,1,REG
REG=OX53->0XAA TBLATH=0XAA->0X12 TBLATL=0X55->0X34 TBLPTR=0XA356->0XA3567 存储单元=0X1234->0X5678???传高字节???
TBLAT中一个字节传至F T=0传高字节 T=1传低字节;TBLPTR指向的程序存储单元内容传至表锁存器TBLAT;I=1 TBLPTR+1 I=0 TBLPTR不变 存储单元的值为何改变?????周期2 若F=PC则3周期
54.TABLE WRITE
TABWT T,I,F
TABWT 0,1,REG
REG=0X53->0X53 TBLATH=0XAA->0X53 TBLATL=0X55->0X55
TBLPTR=0XA356->0XA357存储单元=0XFFFF->0X5355
F值传至16为TBLAT表锁存器 T=0传低字节 T=1传至高字节;TBLAT内容写入TBLPTR指向的程序存储器单元;I=1 TBLPTR+1 I=0 TBLPTR不变 指令周期2若F=PC 这周期3
55.TABLE L

ATCH READ
TLRD T,F 表锁存读
TBLATH=0X00 TBLATL=0XAF T=0 RAM=0XAF TBLATH=0X00 TBLATL=0XAF
56.TABLE LATCH WRITE
TLWT T,F 表锁存写
RAM=0XB7 TBLATH=0X00 TBLATL=0X00 T=0 RAM=0XB7 TBLATH=0X00 TBLATL=0XB7
57.LOAD TRIS REGISTER I/O 控制寄存器TRIS设置指令 不建议使用
58.TEST F,SKIP IF 0
TSTFSZ CNT F等于0跳转
GOTO ...(CNT!=0)
ZERO (CNT==0)
59.EXCLUSIVE OR LITERAL WITH W
XORLW K (W)异或K->W
XORLW 0XAF
W=0XB5->0X1A
60.EXCLUSIVE OR W WITH F
XORWF F D (W)异或(F)->(W)(F)
XORWF REG1,1
W=0XB5->0XB5 REG1=0XAF->0X1A

直观助记符:
BCF 3,0(进位位C清零)=CLRC
BSF 3,0(进位位C置1)=SETC
CLRDC BCF 3,1
SETDC BSF 3,1
CLRZ BCF 3,2
SETZ BSF 3,2
SKPC(有进位间跳)=BTFSS 3,0
SKPNC(无进位间跳)=BTFSC 3,0
SKPDC BTFSS 3,1
SKPNDC BTFSC 3,1
SKPZ BTFSS 3,2
SKPNZ BTFSC 3,2 影响Z???
TSTF F(测试寄存器是否全零)=MOVF F,1 影响Z
MOVFW F((F)->W) MOVF F,0 影响Z
NEGF F,D取补码 COMF F,1 影响Z
ADDCF F,D内容加进位 BTFSC 3,0 影响Z ???为0跳转???
INCF F,D
SUBCF F,D内容减进位 BTFSC 3,0
DECF F,D
ADDDCF F,D BTFSC 3,1
INCF F,D
SUBDCF F,D BTFSC 3,1
DECF F,D
B K 无条件转移 GOTO K
BC K 有进位转移 BTFSC 3,0
GOTO K
BNC K 无进位转移 BTFSS 3,0
GOTO K
BDC K BTFSC 3,1
GOTO K
BNDC K BTFSS 3,1
GOTO K
BZ K BTFSC 3,2
GOTO K
BNZ K BTFSS 3,2
GOTO K


清零CLRW CLRF CLRWDT
算术运算ADDLW K ADDWF F,D SUBLW K SUBWF F,D DECF F,D INCF F,D
逻辑运算ANDLW K ANDWF F,D IORLW K或 IORWF F,D XORLW K异或 XORWF F,D RLF F,D RRF F,D
MOVLW K MOVF F,D MOVWF F NOP
半字节交换指令SWAPF F,D可用于中断现场保护:MOVF W-TEMP SWAPF STATUS,W MOVWF S-TEMP-->SWAPF S-TEMP,W SWAPF STATUS,W SWAPF W-TEMP,W
(W置于后一操作数?)
子程序调用CALL GOTO跳转
(CALL都是无返回值的?CALL的子程序都是无参数?)
取反COMF F,D
DECFSZ F,D INCFSZ F,D
位操作BSF F,B BCF F,B BTFSS F,B BTFSC F,B
返回RETLW K RETURN SLEEP RETFIE(RETURN FROM INTERRUPT WITH ENABLE)
懒得算延时:3XY+4X+5(x外循环Y内循环)
255-->196100
20mhz 0.05us T=0.2us


1、程序的基本格式
先介绍二条伪指令:
EQU ——标号赋值伪指令
ORG ——地址定义伪指令
PIC16C5X在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为:
PIC16C54/55:1FFH
PIC16C56:3FFH
PIC16C57/58:7FFH
一般来说,PIC的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。
TITLE This is …… ;程序标题
;--------------------------------------
;名称定义和变量定义
;--------------------------------------
F0 EQU 0
RTCC EQU 1
PC EQU 2
STATUS EQU 3
FSR EQU

 4
RA EQU 5
RB EQU 6
RC EQU 7

PIC16C54 EQU 1FFH ;芯片复位地址
PIC16C56 EQU 3FFH
PIC16C57 EQU 7FFH
;-----------------------------------------
ORG PIC16C54 GOTO MAIN ;在复位地址处转入主程序
ORG 0 ;在0000H开始存放程序
;-----------------------------------------
;子程序区
;-----------------------------------------
DELAY MOVLW 255

RETLW 0
;------------------------------------------
;主程序区
;------------------------------------------
MAIN
MOVLW B‘00000000’
TRIS RB ;RB已由伪指令定义为6,即B口

LOOP
BSF RB,7 CALL DELAY
BCF RB,7 CALL DELAY

GOTO LOOP
;-------------------------------------------
END ;程序结束
注:MAIN标号一定要处在0页面内。
分享本文到:



帖子: 29

积分: 94

Rank: 2

专家等级:

paul1983发表于 2008-12-17 23:09 | 只看该作者 回复 引用 评分 报告 返回版面 TOP
得分:0
2楼:
程序设计基础
2、程序设计基础
1) 设置 I/O 口的输入/输出方向
PIC16C5X的I/O 口皆为双向可编程,即每一根I/O 端线都可分别单独地由程序设置为输入或输出。这个过程由写I/O控制寄存器TRIS f来实现,写入值为“1”,则为输入;写入值为“0”,则为输出。
MOVLW 0FH ;0000 1111(0FH)
输入 输出
TRIS 6 ;将W中的0FH写入B口控制器,
;B口高4位为输出,低4位为输入。
MOVLW 0C0H ; 11 000000(0C0H)
RB4,RB5输出0 RB6,RB7输出1
2) 检查寄存器是否为零
如果要判断一个寄存器内容是否为零,很简单,现以寄存器F10为例:
MOVF 10,1 ;F10→F10,结果影响零标记状态位Z
BTFSS STATUS,Z ;F10为零则跳
GOTO NZ ;Z=0即F10不为零转入标号NZ处程序
┋ ;Z=1即F10=0处理程序
3) 比较二个寄存器的大小
要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位C来判断。注意,相减的结果放入W,则不会影响二寄存器原有的值。
例如F8和F9二个寄存器要比较大小:
MOVF 8,0 ;F8→W

SUBWF 9,0 ;F9—W(F8)→W
BTFSC STATUS,Z ;判断F8=F9否
GOTO F8=F9
BTFSC STATUS,C ;C=0则跳
GOTO F9>F8 ;C=1相减结果为正,F9>F8
GOTO F9
4) 循环n次的程序
如果要使某段程序循环执行n次,可以用一个寄存器作计数器。下例以F10做计数器,使程序循环8次。
COUNT EQU 10 ;定义F10名称为COUNT(计数器)

MOVLW 8
MOVWF COUNT LOOP ;循环体
LOOP

DECFSZ COUNT,1 ;COUNT减1,结果为零则跳
GOTO LOOP ;结果不为零,继续循环
┋ ;结果为零,跳出循环
5)“IF……THEN……”格式的程序
下面以“IF X=Y THEN GOTO NEXT”格式为例。
MOVF X,0 ;X→W
SUBWF Y,0 ;Y—W(X)→W
BTFSC STATUS,Z ;X=Y 否
GOTO NEXT ;X=Y,跳到NEXT去执行。
┋ ;X≠Y
6)“FOR……NEXT”格式的程序
“FOR……NEXT”程序使循环在某个范围内进行。下例是“FOR X=0 TO 5”格式的程序。F10放X的初值,F11放X的终值。
START EQU 10
DAEND EQU 11

MOVLW 0
MOVWF START ; 0→START(F10)
MOVLW 5
MOVWF DAEND ;5→DAEND(F11)
LOOP

INCF START,1 ;START值加1
MOVF START,0
SUBWF DAEND,0 ;START=DAEND ?(X=5否)
BTFSS STATUS,Z
GOTO LOOP ;X<5,继续循环
┋ ;X=5,结束循环
7)“DO WHILE……END”格式的程序
“DO WHILE……END”程序是在符合条件下执行循环。下例是“DO WHILE X=1”格式的程序。F10放X的值。
X EQU 10

MOVLW 1
MOVWF X ;1→X(F10),作为初值
LOOP

MOVLW 1
SUBWF X,0
BTFSS STATUS,Z ;X=1否?
GOTO LOOP ;X=1继续循环

 ;X≠1跳出循环
8) 查表程序
查表是程序中经常用到的一种操作。下例是将十进制0~9转换成7段LED数字显示值。若以B口的RB0~RB6来驱动LED的a~g线段,则有如下关系:



设LED为共阳,则0~9数字对应的线段值如下表: 十进数 线段值 十进数 线段值
0 C0H 5 92H
1 C9H 6 82H
2 A4H 7 F8H
3 B0H 8 80H
4 99H 9 90H

PIC的查表程序可以利用子程序带值返回的特点来实现。具体是在主程序中先取表数据地址放入W,接着调用子程序,子程序的第一条指令将W置入PC,则程序跳到数据地址的地方,再由“RETLW”指令将数据放入W返回到主程序。下面程序以F10放表头地址。
MOVLW TABLE ;表头地址→F10
MOVWF 10

MOVLW 1 ;1→W,准备取“1”的线段值
ADDWF 10,1 ;F10 W =“1”的数据地址
CALL CONVERT
MOVWF 6 ;线段值置到B口,点亮LED

CONVERT MOVWF 2 ;W→PC TABLE
RETLW 0C0H ;“0”线段值
RETLW 0F9H ;“1”线段值

RETLW 90H ;“9”线段值
9)“READ……DATA,RESTORE”格式程序
“READ……DATA”程序是每次读取数据表的一个数据,然后将数据指针加1,准备取下一个数据。下例程序中以F10为数据表起始地址,F11做数据指针。
POINTER EQU 11 ;定义F11名称为POINTER

MOVLW DATA
MOVWF 10 ;数据表头地址→F10
CLRF POINTER ;数据指针清零

MOVF POINTER,0
ADDWF 10,0 ;W =F10 POINTER

INCF POINTER,1 ;指针加1
CALL CONVERT ;调子程序,取表格数据

CONVERT MOVWF 2 ;数据地址→PC
DATA RETLW 20H ;数据

RETLW 15H ;数据
如果要执行“RESTORE”,只要执行一条“CLRF POINTER”即可。
10) 延时程序
如果延时时间较短,可以让程序简单地连续执行几条空操作指令“NOP”。如果延时时间长,可以用循环来实现。下例以F10计算,使循环重复执行100次。
MOVLW D‘100’
MOVWF 10
LOOP

 DECFSZ 10,1 ;F10—1→F10,结果为零则跳
GOTO LOOP

延时程序中计算指令执行的时间和即为延时时间。如果使用4MHz振荡,则每个指令周期为1μS。所以单周期指令时间为1μS,双周期指令时间为2μS。在上例的LOOP循环延时时间即为:(1 2)*100 2=302(μS)。在循环中插入空操作指令即可延长延时时间:
MOVLW D‘100’
MOVWF 10
LOOP NOP
NOP
NOP
DECFSZ 10,1
GOTO LOOP

延时时间=(1 1 1 1 2)*100 2=602(μS)。
用几个循环嵌套的方式可以大大延长延时时间。下例用2个循环来做延时:
MOVLW D‘100’
MOVWF 10
LOOP MOVLW D‘16’
MOVWF 11
LOOP1 DECFSZ 11,1
GOTO LOOP1
DECFSZ 10,1
GOTO LOOP

延时时间=1 1 [1 1 (1 2)*16-1 1 2]*100-1=5201(μS)
11) RTCC计数器的使用
RTCC是一个脉冲计数器,它的计数脉冲有二个来源,一个是从RTCC引脚输入的外部信号,一个是内部的指令时钟信号。可以用程序来选择其中一个信号源作为输入。RTCC可被程序用作计时之用;程序读取RTCC寄存器值以计算时间。当RTCC作为内部计时器使用时需将RTCC管脚接VDD或VSS,以减少干扰和耗电流。下例程序以RTCC做延时:
RTCC EQU 1

CLRF RTCC ;RTCC清0
MOVLW 07H
OPTION ;选择预设倍数1:256→RTCC
LOOP MOVLW 255 ;RTCC计数终值
SUBWF RTCC,0
BTFSS STATUS,Z ;RTCC=255?
GOTO LOOP

这个延时程序中,每过256个指令周期RTCC寄存器增1(分频比=1:256),设芯片使用4MHz振荡,则:
延时时间=256*256=65536(μS)
RTCC是自振式的,在它计数时,程序可以去做别的事情,只要隔一段时间去读取它,检测它的计数值即可。
12) 寄存器体(BANK)的寻址
对于PIC16C54/55/56,寄存器有32个,只有一个体(BANK),故不存在体寻址问题,对于PIC16C57/58来说,寄存器则有80 个,分为4个体(BANK0-BANK3)。在对F4(FSR)的说明中可知,F4的bit6和bit5是寄存器体寻址位,其对应关系如下:

Bit6 Bit5 BANK 物理地址
 0 0BANK0 10H~1FH
 0 1BANK1 30H~3FH
 1 0BANK2 50H~5FH
 1 1BANK3 70H~7FH

当芯片上电RESET后,F4的bit6,bit5是随机的,非

上电的RESET则保持原先状态不变。
下面的例子对BANK1和BANK2的30H及50H寄存器写入数据。
例1.(设目前体选为BANK0)
BSF 4,5 ;置位bit5=1,选择BANK1
MOVLW DATA
MOVWF 10H ; DATA→30H
BCF 4,5
BSF 4,6 ;bit6=1,bit5=0选择BANK2
MOVWF 10H ;DATA→50H
从上例中我们看到,对某一体(BANK)中的寄存器进行读写,首先要先对F4中的体寻址位进行操作。实际应用中一般上电复位后先清F4的bit6和bit5为0,使之指向BANK0,以后再根据需要使其指向相应的体。
注意,在例子中对30H寄存器(BANK1)和50H寄存器(BANK2)写数时,用的指令“MOVWF 10H”中寄存器地址写的都是“10H”,而不是读者预期的“MOVWF 30H”和“MOVWF 50H”,为什么?
让我们回顾一下指令表。在PIC16C5X的所有有关寄存器的指令码中,寄存寻址位都只占5个位:fffff,只能寻址32个(00H—1FH)寄存器。所以要选址80个寄存器,还要再用二位体选址位PA1和PA0。当我们设置好体寻址位PA1和PA0,使之指向一个BANK,那么指令“MOVWF 10H”就是将W内容置入这个BANK中的相应寄存器内(10H,30H,50H,或70H)。
有些设计者第一次接触体选址的概念,难免理解上有出入,下面是一个例子:
例2:(设目前体选为BANK0)
MOVLW 55H 
MOVWF 30H ;欲把55H→30H寄存器
MOVLW 66H
MOVWF 50H ;欲把66H→50H寄存器
以为“MOVWF 30H”一定能把W置入30H,“MOVWF 50H”一定能把W置入50H,这是错误的。因为这两条指令的实际效果是“MOVWF 10H”,原因上面已经说明过了。所以例2这段程序最后结果是F10H=66H,而真正的F30H和F50H并没有被操作到。
建议:为使体选址的程序清晰明了,建议多用名称定义符来写程序,则不易混淆。 例3:假设在程序中用到BANK0,BANK1,BANK2的几个寄存器如下:

BANK0 地址 BANK1 地址 BANK2 地址 BANK3 地址
A 10H B 30H C 50H · 70H
· · · · · · · ·
· · · · · · · ·

A EQU 10H ;BANK0
B EQU 10H ;BANK1
C EQU 10H ;BANK2

FSR EQU 4
Bit6 EQU 6
Bit5 EQU 5
DATA EQU 55H

MOVLW DATA
MOVWF A
BSF FSR,Bit5
MOVWF B ;DATA→F30H
B

CF FSR,Bit5
BSF FSR,Bit6
MOVWF C ;DATA→F50H

程序这样书写,相信体选址就不容易错了。
13) 程序跨页面跳转和调用
下面介绍PIC16C5X的程序存储区的页面概念和F3寄存器中的页面选址位PA1和PA0两位应用的实例。
(1)“GOTO”跨页面
例:设目前程序在0页面(PAGE0),欲用“GOTO”跳转到1页面的某个地方
KEY(PAGE1)。
STATUS EQU 3
PA1 EQU 6
PA0 EQU 5

BSF STATUS,PA0 ;PA0=1,选择PAGE页面
GOTO KEY ;跨页跳转到1页面的KEY

KEY NOP ;1页面的程序

(2)“CALL”跨页面
例:设目前程序在0页面(PAGE0),现在要调用——放在1页面(PAGE1)的子程序DELAY。

BSF STATUS,PA0 ;PA0=1,选择PAGE1页面
CALL DELAY ;跨页调用
BCF STATUS,PA0 ;恢复0页面地址

DELAY NOP ;1页面的子程序

注意:程序为跨页CALL而设了页面地址,从子程序返回后一定要恢复原来的页面地址。
(3)程序跨页跳转和调用的编写
读者看到这里,一定要问:我写源程序(.ASM)时,并不去注意每条指令的存放地址,我怎么知道这个GOTO是要跨页面的,那个CALL是需跨页面的?的确,开始写源程序时并知道何时会发生跨页面跳转或调用,不过当你将源程序汇编时,就会自动给出。当汇编结果显示出:
X X X(地址)“GOTO out of Range"
X X X(地址)“CALL out of Range"
这表明你的程序发生了跨页面的跳转和调用,而你的程序中在这些跨页GOTO和CALL之前还未设置好相应的页面地址。这时应该查看汇编生成的.LST文件,找到这些GOTO和CALL,并查看它们要跳转去的地址处在什么页面,然后再回到源程序(.ASM)做必要的修改。一直到你的源程序汇编通过(0 Errors and Warnnings)。
(4)程序页面的连接
程序4个页面连接处应该做一些处理。一般建议采用下面的格式: 即在进入另一个页面后,马上设置相应的页面地址位(PA1,PA0)。 页面处理是PIC16C5X编程中最麻烦的部分,不过并不难。只要做了一次实际的编程练习后,就能掌握了。

1

评分次数

weimao228




帖子: 29


积分: 94

Rank: 2

专家等级:

paul1983发表于 2008-12-17 23:10 | 只看该作者 回复 引用 评分 报告 返回版面 TOP
得分:0
3楼:
PIC 8位单片机汇编语言常用指令
各大类单片机的指令系统是没有通用性的,它是由单片机生产厂家规定的,所以用户必须遵循厂家规定的标准,才能达到应用单片机的目的。
PIC 8位单片机共有三个级别,有相对应的指令集。基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。其指令向下兼容。

在这里笔者介绍PIC 8位单片机汇编语言指令的组成及指令中符号的功能,以供初学者阅读相关书籍和资料时快速入门。

一、PIC汇编语言指令格式
PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:
标号 操作码助记符 操作数1,操作数2;注释
指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。
1?北旰拧∮隡CS-51系列单片机功能相同,标号代表指令的符号地址。在程序汇编时,已赋以指令存储器地址的具体数值。汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。再有标号不能用操作码助记符和寄存器的代号表示。标号也可以单独占一行。
2?辈僮髀胫?记符 该字段是指令的必选项。该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
3?辈僮魇? 由操作数的数据值或以符号表示的数据或地址值组成。若操作数有两个,则两个操作数之间用逗号(,)分开。当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。还可以是被定义过的标号、字符串和ASCⅡ码等。具体表示时,规定在二进制数前冠以字母“B”,例如 B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数

前冠以“H”,例如H2F。在这里 PIC 8位单片机默认进制是十六进制,在十六进制数之前加上Ox,如H2F可以写成Ox2F。
指令的操作数项也是可选项。
PIC系列与MCS-51系列8位单片机一样,存在寻址方法,即操作数的来源或去向问题。因PIC系列微控制器采用了精简指令集(RISC)结构体系,其寻址方式和指令都既少而又简单。其寻址方式根据操作数来源的不同,可分为立即数寻址、直接寻址、寄存器间接寻址和位寻址四种。所以PIC系列单片机指令中的操作数常常出现有关寄存器符号。有关的寻址实例,均可在本文的后面找到。
4?弊⑹汀∮美炊猿绦蜃餍┧得鳎?便于人们阅读程序。注释开始之前用分号(;)与其它部分相隔。当汇编程序检测到分号时,其后面的字符不再处理。值得注意:在用到子程序时应说明程序的入口条件、出口条件以及该程序应完成的功能和作用。

二、清零指令(共4条)
1?奔拇嫫髑辶阒噶?
实例:CLRW;寄存器W被清零
说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。
2?笨疵殴范ㄊ逼髑辶阒噶睢?
实例:CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)
说明:WDT是英语Watchdog Timer的缩写字母。CLR见上述说明。注意该两条指令无操作数。
3?奔拇嫫鱢清零指令。指令格式:CLRF f
实例:CLRF TMRO;对TMRO清零
说明:在PIC系列8位单片机中,常用符号F(或f)代表片内的各种寄程器和F的序号地址。F取值按PIC系列不同型号而不同,一般为 Ox00~Ox1F/7F/FF。TMRO代表定时器/计数器TMRO,所以CLRF对寄程器清零,采用了直接寻址方式直接给出要访问的寄存器TMRO。
4?蔽磺辶阒噶睢V噶罡袷? BCF f,b
实例:BCF REG1,2;把寄存器REG1的D2位清零
说明:BCF是英语Bit Clear F的缩写。指令格式中的F,同上说明;符号b是表示PIC片内某个8位数据寄存器F的位号(或位地址),所以b的取值为0~7或D0~D7。实例中REG 是Register的缩写。实例中的2代表指令格式中的b=2即寄存器REG1的D2位。
通过上述四条清零指令格式和实例,可以说明,学习PIC系列8位单片机的指令时应首先了解指令的助记符意义(功能),再有就是它的表达方式。初学者没有必要死记指令,重要是理解和实践。

三、面向字节、常数与控制操作的指令
1?贝?送立即数至工作寄存器W指令
指令格式:MOVLW k;k表示常数、立即数和标号
说明:MOVLW是Move Literal to w的缩写
实例:MOVL 0x1E;常数30送W
2?盗/O口控制寄存器TRIS设置指令
指令格式;

TRIS f
说明;TRIS f是Load TRIS Register的缩写。其功能是把工作寄存器W的内容送入I/O口控制寄存器f。当W=0时,置对应I/O口为输出;W=1,置I/O口为输入。
实例:MOVLW 0x00 ;把00H送入W
TRIS RA ;置PIC RA口为输出
MOVLW 0xFF ;把FFH送入W
TRIS RB ;置PIC RB口为输入
说明:这是PIC汇编语言中常用的几条指令,即设置某个I/O口(这里是RA口和RB口)为输入或输出的语句。可见,识读指令时,一应充分理解语句格式的功能,二应前后联系阅读。
3?盬寄存器内容送寄存器f(W内容保持不变)指令
指令格式:MOVWF f
说明:MOVWF是Move W to f的缩写
实例:MOVLW 0x0B;送0BH送W
MOVWF 6 ;送W内容到RB口
说明:第一条指令0x0B(常数11)送工作寄存器W,第二条指令,把W内容常数11送到寄存器F6中,查表F6即为RB口,所以PORT_B(B口)=0BH=D11
4?奔拇嫫鱢传送指令
指令格式:MOVF f,d
说明:MOVF是Move f的缩写。F代表PIC中的某个寄存器。指令中的d规定:d=0时,f内容送W;d=1时,f内容送寄存器。
实例:MOVF 6,0 ;RB口内容送W
MOVWF 8 ;RB口内容送f8
说明:第一条指令中的6代表寄存器f=6,查寄存器表f=6为RB口;0代表d=0,代表选择的目标为寄存器W。第二条指令中的8代表寄存器f=8。所以两条指令结果是把RB口的内容送f8。至于f8内容是多少?还应在汇编语言开始时附加指令,这里从略。
5?笨詹僮髦噶?
指令格式:NOP
说明:NOP是英语No Operation的缩写。NOP无操作数,所以称为空操作。执行NOP指令只使程序计数器PC加1,所以占用一个机器周期。
实例:MOVLW 0xOF ;送OFH到W
MOVWF PORT_B ;W内容写入B口
NOP ;空操作
MOVF PORT_B,W ;读操作
说明:该三条指令是一种对I/O口的B口连续操作的实例,其目的达到写入B口的内容要读出时,应保证写、读之间有个稳定时间,因此加入了空操作指令NOP。
6?蔽尢跫?跳转指令
指令格式:GOTO k
说明:执行该条指令时,将指令转移到指定的地址(跳转)。指令中的k,常与程序中的标号联系起来。
实例:见第9条指令中
7?奔拇嫫髂谌菁?1,结果为零的间跳指令
指令格式:DECFSZ f,d
说明:DECFSZ是英语Decrement f,Skip of not 0的缩写。符号f,d代表的意义,前述已作说明。该条指令是指寄存器的内容减1存入W(d=0)或f(d=1)中。若指令执行结果减1不为零,指令顺序执行;为零时,就间跳下一条指令后再执行(等效顺序执行一条空指令NOP),实际指令中,当d=1时,该项常被略去。
8?奔

拇嫫髂谌菁?1,结果为零间跳指令
指令格式:INCFSZ f,d
说明:INCFSZ是英语Increment f,Skip of 0的缩写。该条指令与上一条(7)指令差别仅在于“1”上,即执行这条指令时,寄存器f内容加1,若结果不为零,则指令顺序执行;为零则指令间跳执行。执行这条指令的其它逻辑关系与上条相同。
9?弊映绦蚍祷刂噶?
指令格式:RETLW k
说明:RETLW是Return Literal to W的缩写。该指令代表子程序返回,返回前先把8位立即数送W。
实例:PIC某个汇编语言的延时子程序(摘要):
(1)BELY MOVLW 0xC5 ;送延时常数0C5H入W
(2) MOVWF COUNT2;0C5H送入计数器2
(3) CLRF COUNT1;对计数器1清零
(4)LOOP INCFSZ COUNT1;计数器1加1计数器1加
1结果不为零,跳转循环
(5) GOTO LOOP ;
(6) DECTSZ CPUNT2 ;计数2减1计数器2减1
结果不为零,跳转循环重
复执行第4条指令
(7) GOTO LOOP ;
(8) RETLW 0 ;子程序执行结束返回
说明:程序中的注释已分别对每条指令的功能作了说明,补充说明1?钡敝葱械?(4)条加1指令结果为零时,就间跳转到执行第(6)条指令。2?钡敝葱械? (6)条减1指令结果为零时,就间跳转到第(8)条子程序返回,整个延时指令才算完成。3?奔剖?器1或2代表PIC中某个寄存器,该寄存器由程序开始的伪指令赋值决定(关于伪指令今后将作专门介绍)。本文关于指令的注释将与前述指令中的略有不同。前述指令注释时是对指令具体完成的功能给以说明,这种注释方法对初学者确实易于接受和理解,但是实际应用中的PIC产品汇编语言的注释通常是以程序要做什么(或指令的作用)而不是说指令的直接功能。鉴于上述原因,下述的指令注释将改变过去的注释方法,用程序应起的作用作注释。
10?奔某唐靼胱纸诮换恢噶?
指令格式:SWAPF f,d
说明:SWAPF是Swap f的合写。符号f、d的意义与前述的相同。该条指令的功能是寄存器f的高4位与低4位交换,即指令执行前,若寄存器f的8位状态为D7、D6、D5、 D4、D3、D2、D1、D0,执行后的8位状态变为D3、D2、D1、D0、D7、D6、D5、D4,其结果存入W(d=0)或f(d=1)中。
实例:中断现场保护是中断技术中重要部分。由于PIC16C××指令系统中没有进栈PUSH和出栈POP指令,所以只能用其它指令来实现。因为在主程序中常常用到工作寄存器W和状态寄存器STATUS,所以中断现场保护常要保护寄存器W和STATUS。
下面是对PIC16C7×系列芯片中断现场保护的

实例程序。
MOVWF W_TEMP ;将W内容存入到临时寄存器
W_TEMP中
SWAPF STATUS,W ;交换STATUS与W内容
MOVWF STATUS_TEMP ;将STATUS的内容存入到临
… 时寄存器STATUS_TEMP中
中断服务程序

SWAPF STATUS_TEMP,W;交换STATUS_TEMP与W
的内容
MOVWF STATUS ;STATUS复原成原来的状态
SWAPF W_TEMP,F ;交换内容
SWAPF W_TEMP,W ;W复原成原来的状态
说明:上述程序中各条指令的注释基本上都是以程序应达到的目的而注释的,对每条指令的功能几乎未涉及。这是初学者应特别注意的。
11?弊映绦虻饔弥噶?(Subroutine Call)
指令格式:CALL k;k为立即地址
说明:子程序调用,不同型号芯片的实现方法不尽相同,其共同点是首先将返回地址((PC)+1)压栈保护,再转入所调用的子程序入口地址执行(与MCS-51指令功能相似)。
指令格式模式:HERE CALL DELAY;调用延时子程序

DELAY MOVLW 0x80 ;延时子程序
RETLW 0
说明:调用指令执行前,PC=地址HERE
调用指令执行后,PC=地址DELAY(标号),堆栈指针TOS=HERE+1(返回地址)。
实例:见下条指令的实例
12?奔拇嫫髂谌萑》粗噶?
指令格式:COMF f,d
说明:COMF是Complement f的缩写。其中d=1时,操作(f)→f;d=0时,操作(f)→w。
功能:寄存器f内容取反后送入W(d=0)或f自身(d=1)。
实例: ORG 0x1FF
GOTO MAIN
ORG 0
DELAY …
MAIN MOVLW 0 ;主程序开始
TRTS 5 ;设置RA口为输出
BCF 5,0 ;置RA口0位为0
LOOP CALL DELAY;闪动延时
COMF 5?? ;RA口求反(亮—灭—
亮……控制)
GOTO LOOP ;循环

说明:上述指令是一种PIC16C54 LED发光控制实验部分程序。其中延时子程序DELY未列出,但不影响本条指令的识读。程序中的主程序开始的三条指令,均已介绍过,紧跟着的CALL指令是调用执行子程序,其入口地址为标号DELAY。子程序执行结束后,又执行COMF 5的LED发光亮—灭…亮—灭……控制指令。后面一条GOTO LOOP指令是达到LED循环点亮目的。
13?泵嫦蛭坏牟僮髦噶?(共4条,PIC高级产品多增一条)
该类指令除一条位清零外,另有一条寄存器f位b的置1指令和另外两条位跳步指令(PIC高级产品多增一条f的b位触发转换指令)。
(1)位置1指令。指令格式 BSF f,b
说明:BSF是Bit Set f的缩写。F和b的意义与前述相同,该条指令

的功能是将寄存器f的b位置1。
(2)位测试、为零间跳指令。指令格式 BTFSC f,b
说明:BTFSC是Bit Test,Skip if Clear的缩写。指令功能是测试寄存器f位“b”,如为0,跳过下一条指令;为1顺序执行,即当f(b)=0时,就不执行当前指令而执行下一条指令(间跳),即用一条空指令NOP代替它,所以该条指令占用2个指令周期。
(3)位测试、为1间跳指令。指令格式 BTFSS f,b
说明:BTFSS是Bit Test,Skip if Set的缩写。其指令的逻辑功能与上条相反,位测试f(b)=1就间跳执行,f(b)=0顺序执行。
上面介绍的PIC 8位单片机汇编语言指令仅是部分指令,此外还有循环左、右移指令;W和寄存器f相“加”、相“与”指令和进入睡眠方式等指令。





各大类单片机的指令系统是没有通用性的,它是由单片机生产厂家规定的,所以用户必须遵循厂家规定的标准,才能达到应用单片机的目的。
PIC 8位单片机共有三个级别,有相对应的指令集。基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。其指令向下兼容。
在这里笔者介绍PIC 8位单片机汇编语言指令的组成及指令中符号的功能,以供初学者阅读相关书籍和资料时快速入门。
一、PIC汇编语言指令格式
PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:
标号 操作码助记符 操作数1,操作数2;注释
指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。
1?标号 与MCS-51系列单片机功能相同,标号代表指令的符号地址。在程序汇编时,已赋以指令存储器地址的具体数值。汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。再有标号不能用操作码助记符和寄存器的代号表示。标号也可以单独占一行。
2?操作码助记符 该字段是指令的必选项。该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指

令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
3?操作数 由操作数的数据值或以符号表示的数据或地址值组成。若操作数有两个,则两个操作数之间用逗号(,)分开。当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。还可以是被定义过的标号、字符串和ASCⅡ码等。具体表示时,规定在二进制数前冠以字母“B”,例如B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。在这里PIC 8位单片机默认进制是十六进制,在十六进制数之前加上Ox,如H2F可以写成Ox2F。
指令的操作数项也是可选项。
PIC系列与MCS-51系列8位单片机一样,存在寻址方法,即操作数的来源或去向问题。因PIC系列微控制器采用了精简指令集(RISC)结构体系,其寻址方式和指令都既少而又简单。其寻址方式根据操作数来源的不同,可分为立即数寻址、直接寻址、寄存器间接寻址和位寻址四种。所以PIC系列单片机指令中的操作数常常出现有关寄存器符号。有关的寻址实例,均可在本文的后面找到。
4?注释 用来对程序作些说明,便于人们阅读程序。注释开始之前用分号(;)与其它部分相隔。当汇编程序检测到分号时,其后面的字符不再处理。值得注意:在用到子程序时应说明程序的入口条件、出口条件以及该程序应完成的功能和作用。
二、清零指令(共4条)
1?寄存器清零指令
实例:CLRW;寄存器W被清零
说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。
2?看门狗定时器清零指令。
实例:CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)
说明:WDT是英语Watchdog Timer的缩写字母。CLR见上述说明。注意该两条指令无操作数。
3?寄存器f清零指令。指令格式:CLRF f
实例:CLRF TMRO;对TMRO清零
说明:在PIC系列8位单片机中,常用符号F(或f)代表片内的各种寄程器和F的序号地址。F取值按PIC系列不同型号而不同,一般为Ox00~Ox1F/7F/FF。TMRO代表定时器/计数器TMRO,所以CLRF对寄程器清零,采用了直接寻址方式直接给出要访问的寄存器TMRO。
4?位清零指令。指令格式 BCF f,b
实例:BCF REG1,2;把寄存器REG1的D2位清零
说明:BCF是英语Bit Clear F的缩写。指令格式中的F,同上说明;符号b是表示PIC片内某个8位数据寄存器F的位号(或位地址),所以b的取值为0~7或D0~D7。实例中REG是Register的缩写。实例中的2代表指令格式中的b=2即寄

存器REG1的D2位。
通过上述四条清零指令格式和实例,可以说明,学习PIC系列8位单片机的指令时应首先了解指令的助记符意义(功能),再有就是它的表达方式。初学者没有必要死记指令,重要是理解和实践。
? 

三、面向字节、常数与控制操作的指令
1?传送立即数至工作寄存器W指令
指令格式:MOVLW k;k表示常数、立即数和标号
说明:MOVLW是Move Literal to w的缩写
实例:MOVL 0x1E;常数30送W
2?I/O口控制寄存器TRIS设置指令
指令格式;TRIS f
说明;TRIS f是Load TRIS Register的缩写。其功能是把工作寄存器W的内容送入I/O口控制寄存器f。当W=0时,置对应I/O口为输出;W=1,置I/O口为输入。
实例:MOVLW 0x00 ;把00H送入W
TRIS RA ;置PIC RA口为输出
MOVLW 0xFF ;把FFH送入W
TRIS RB ;置PIC RB口为输入
说明:这是PIC汇编语言中常用的几条指令,即设置某个I/O口(这里是RA口和RB口)为输入或输出的语句。可见,识读指令时,一应充分理解语句格式的功能,二应前后联系阅读。
3?W寄存器内容送寄存器f(W内容保持不变)指令
指令格式:MOVWF f
说明:MOVWF是Move W to f的缩写
实例:MOVLW 0x0B;送0BH送W
MOVWF 6 ;送W内容到RB口
说明:第一条指令0x0B(常数11)送工作寄存器W,第二条指令,把W内容常数11送到寄存器F6中,查表F6即为RB口,所以PORT_B(B口)=0BH=D11
4?寄存器f传送指令
指令格式:MOVF f,d
说明:MOVF是Move f的缩写。F代表PIC中的某个寄存器。指令中的d规定:d=0时,f内容送W;d=1时,f内容送寄存器。
实例:MOVF 6,0 ;RB口内容送W
MOVWF 8 ;RB口内容送f8
说明:第一条指令中的6代表寄存器f=6,查寄存器表f=6为RB口;0代表d=0,代表选择的目标为寄存器W。第二条指令中的8代表寄存器f=8。所以两条指令结果是把RB口的内容送f8。至于f8内容是多少?还应在汇编语言开始时附加指令,这里从略。
5?空操作指令
指令格式:NOP
说明:NOP是英语No Operation的缩写。NOP无操作数,所以称为空操作。执行NOP指令只使程序计数器PC加1,所以占用一个机器周期。
实例:MOVLW 0xOF ;送OFH到W
MOVWF PORT_B ;W内容写入B口
NOP ;空操作
MOVF PORT_B,W ;读操作
说明:该三条指令是一种对I/O口的B口连续操作的实例,其目的达到写入B口的内容要读出时,应保证写、读之间有个稳定时间,因此加入了空操作指令NOP。
6?无条件跳转指令
指令格式:GOTO k
说明

:执行该条指令时,将指令转移到指定的地址(跳转)。指令中的k,常与程序中的标号联系起来。
实例:见第9条指令中
7?寄存器内容减1,结果为零的间跳指令
指令格式:DECFSZ f,d
说明:DECFSZ是英语Decrement f,Skip of not 0的缩写。符号f,d代表的意义,前述已作说明。该条指令是指寄存器的内容减1存入W(d=0)或f(d=1)中。若指令执行结果减1不为零,指令顺序执行;为零时,就间跳下一条指令后再执行(等效顺序执行一条空指令NOP),实际指令中,当d=1时,该项常被略去。
8?寄存器内容加1,结果为零间跳指令
指令格式:INCFSZ f,d
说明:INCFSZ是英语Increment f,Skip of 0的缩写。该条指令与上一条(7)指令差别仅在于“1”上,即执行这条指令时,寄存器f内容加1,若结果不为零,则指令顺序执行;为零则指令间跳执行。执行这条指令的其它逻辑关系与上条相同。
9?子程序返回指令
指令格式:RETLW k
说明:RETLW是Return Literal to W的缩写。该指令代表子程序返回,返回前先把8位立即数送W。
实例:PIC某个汇编语言的延时子程序(摘要):
(1)BELY MOVLW 0xC5 ;送延时常数0C5H入W
(2) MOVWF COUNT2;0C5H送入计数器2
(3) CLRF COUNT1;对计数器1清零
(4)LOOP INCFSZ COUNT1;计数器1加1计数器1加
1结果不为零,跳转循环
(5) GOTO LOOP ;
(6) DECTSZ CPUNT2 ;计数2减1计数器2减1
结果不为零,跳转循环重
复执行第4条指令
(7) GOTO LOOP ;
(8) RETLW 0 ;子程序执行结束返回
说明:程序中的注释已分别对每条指令的功能作了说明,补充说明1?当执行第(4)条加1指令结果为零时,就间跳转到执行第(6)条指令。2?当执行第(6)条减1指令结果为零时,就间跳转到第(8)条子程序返回,整个延时指令才算完成。3?计数器1或2代表PIC中某个寄存器,该寄存器由程序开始的伪指令赋值决定(关于伪指令今后将作专门介绍)。

本文关于指令的注释将与前述指令中的略有不同。前述指令注释时是对指令具体完成的功能给以说明,这种注释方法对初学者确实易于接受和理解,但是实际应用中的PIC产品汇编语言的注释通常是以程序要做什么(或指令的作用)而不是说指令的直接功能。鉴于上述原因,下述的指令注释将改变过去的注释方法,用程序应起的作用作注释。
10?寄程器半字节交换指令
指令格式:SWAPF f,d
说明:SWAPF是Swap f的合写。符号f、d的意义与前述的相同。该条指令的功能是寄存器f的高4位与低4位交换,即

指令执行前,若寄存器f的8位状态为D7、D6、D5、D4、D3、D2、D1、D0,执行后的8位状态变为D3、D2、D1、D0、D7、D6、D5、D4,其结果存入W(d=0)或f(d=1)中。
实例:中断现场保护是中断技术中重要部分。由于PIC16C××指令系统中没有进栈PUSH和出栈POP指令,所以只能用其它指令来实现。因为在主程序中常常用到工作寄存器W和状态寄存器STATUS,所以中断现场保护常要保护寄存器W和STATUS。
下面是对PIC16C7×系列芯片中断现场保护的实例程序。
MOVWF W_TEMP ;将W内容存入到临时寄存器
W_TEMP中
SWAPF STATUS,W ;交换STATUS与W内容
MOVWF STATUS_TEMP ;将STATUS的内容存入到临
… 时寄存器STATUS_TEMP中
中断服务程序

SWAPF STATUS_TEMP,W;交换STATUS_TEMP与W
的内容
MOVWF STATUS ;STATUS复原成原来的状态
SWAPF W_TEMP,F ;交换内容
SWAPF W_TEMP,W ;W复原成原来的状态
说明:上述程序中各条指令的注释基本上都是以程序应达到的目的而注释的,对每条指令的功能几乎未涉及。这是初学者应特别注意的。
11?子程序调用指令(Subroutine Call)
指令格式:CALL k;k为立即地址
说明:子程序调用,不同型号芯片的实现方法不尽相同,其共同点是首先将返回地址((PC)+1)压栈保护,再转入所调用的子程序入口地址执行(与MCS-51指令功能相似)。
指令格式模式:HERE CALL DELAY;调用延时子程序

DELAY MOVLW 0x80 ;延时子程序
RETLW 0
说明:调用指令执行前,PC=地址HERE
调用指令执行后,PC=地址DELAY(标号),堆栈指针TOS=HERE+1(返回地址)。
实例:见下条指令的实例
12?寄存器内容取反指令
指令格式:COMF f,d
说明:COMF是Complement f的缩写。其中d=1时,操作(f)→f;d=0时,操作(f)→w。
功能:寄存器f内容取反后送入W(d=0)或f自身(d=1)。
实例: ORG 0x1FF
GOTO MAIN
ORG 0
DELAY …
MAIN MOVLW 0 ;主程序开始
TRTS 5 ;设置RA口为输出
BCF 5,0 ;置RA口0位为0
LOOP CALL DELAY;闪动延时
COMF 5? ;RA口求反(亮—灭—
亮……控制)
GOTO LOOP ;循环

说明:上述指令是一种PIC16C54 LED发光控制实验部分程序。其中延时子程序DELY未列出,但不影响本条指令的识读。程序中的主程序开始

的三条指令,均已介绍过,紧跟着的CALL指令是调用执行子程序,其入口地址为标号DELAY。子程序执行结束后,又执行COMF 5的LED发光亮—灭…亮—灭……控制指令。后面一条GOTO LOOP指令是达到LED循环点亮目的。
13?面向位的操作指令(共4条,PIC高级产品多增一条)
该类指令除一条位清零外,另有一条寄存器f位b的置1指令和另外两条位跳步指令(PIC高级产品多增一条f的b位触发转换指令)。
(1)位置1指令。指令格式 BSF f,b
说明:BSF是Bit Set f的缩写。F和b的意义与前述相同,该条指令的功能是将寄存器f的b位置1。
(2)位测试、为零间跳指令。指令格式 BTFSC f,b
说明:BTFSC是Bit Test,Skip if Clear的缩写。指令功能是测试寄存器f位“b”,如为0,跳过下一条指令;为1顺序执行,即当f(b)=0时,就不执行当前指令而执行下一条指令(间跳),即用一条空指令NOP代替它,所以该条指令占用2个指令周期。
(3)位测试、为1间跳指令。指令格式 BTFSS f,b
说明:BTFSS是Bit Test,Skip if Set的缩写。其指令的逻辑功能与上条相反,位测试f(b)=1就间跳执行,f(b)=0顺序执行。
上面介绍的PIC 8位单片机汇编语言指令仅是部分指令,此外还有循环左、右移指令;W和寄存器f相“加”、相“与”指令和进入睡眠方式等指令。鉴于报纸版面的限制,不在这里一一介绍,今后将在程序的应用试验中再作补充说明。

竞赛试题:
10?有一RB(8位)寄存器,其工作状态RB=OxB8,对它执行指令:
BCF RB,4
执行后的RB=B ;Ox ;O 和D 。
11?指令中的标号是可选项,在什么条件下可派上用场?
12?请计算上文中(1)~(8)延时程序的延时时间。已知所用的某个PIC芯片的晶振为20MHz,每个指令周期执行时间为0?2μs,除跳转指令是双周期外,其它指令是单周期指令。

13?请把下列程序加注释,程序中的“5”代表RA(F5)口;“6”代表RB(F6)口。
CLRW ;MOVLW OFFH
TRIS 5 TRIS 6
BCF 5,1 BCF 5?0
BSF 5,0 … 右排接左 



相关主题