综合资讯 技术文章 原文阅读 在线商城 下载专区 DATASHEET 技术论坛 商务频道

电子技术 | 技术资料 | 嵌入式系统 | 单片机专题 | DSP专题
EDA/PLD专题 | 电源技术专题 | 电子制作专题 | 其他综合 | 芯片选型

所在的位置:首页在线阅读单片机专题PIC12C5XX单片机应用与设计正文
 
第二章 PIC12C5XX 指令集及程序设计技巧

§2.1  PIC12C5XX 指令概述 

PIC12C5XX每条指令长12位,指令由操作码和操作数组成。PIC12C5XX共有33条指令,按操作分成三大类:
   1、面向字节操作类
   2、面向位操作类
   3、常数操作和控制操作类。

全部指令如表2.1所示。

向字节操作类指令

(11-6)

(5)

(4-0)

OPCODE d f(FILE#)

二进制代码      HEX  名称     助记符,操作数   操作

状态影响

0000 0000 0000

000

空操作

NOP

0000 001f ffff

02f

W送到f

MOVWF f

W→f

1,4

0000 0100 0000

040

W清零

CLRW -

0→W

Z

0000 011f ffff

06f

f清零

CLRF f

0→f

Z

4

0000 10df ffff

08f

f减去W

SUBWF f,d

f-W→d

C,DC,Z

1,2,4

0000 11df ffff

0Cf

f递减

DECF f,d

f-1→d

Z

2,4

0001 00df ffff

10f

W和f做或运算

IORWF f,d

W∨f→d

Z

2,4

0001 01df ffff

14f

W和f做与运算

ANDWF f,d

W∧f→d

Z

2,4

0001 10df ffff

18f

W和f做异或运算

XORWF f,d

W〇f→d

Z

2,4

0001 11df ffff

1Cf

W加f

ADDWF f,d

W+f→d

C,DC,Z

1,2,4

0010 00df ffff

20f

传送f到d

MOVF f,d

f→d

Z

2,4

0010 01df ffff

24f

f取补

COMF f,d

f→d

Z

2,4

0010 10df ffff

28f

f递增

INCF f,d

f+1→d

Z

2,4

0010 11df ffff

2Cf

f递减,为0则跳

DECFSZ f,d

f-1→d,skip if zero

Z

2,4

0011 00df ffff

30f

f循环右移

RRF f,d

f(n)→d(n-1),f(0)→C,C→d(7)

C

2,4

0011 01df ffff

34f

f循环左移

RLF f,d

f(n)→d(n+1),f(7)→C,C→d(0)

C

2,4

0011 10df ffff

38f

f半字节交换

SWAPF f,d

f(0.3)←→f(4-7)→d 

Z

2,4

0011 11df ffff

3Cf

f递增,为0则跳

INCFSZ f,d

f+1→d,skip if zero 

Z

2,4

面向位操作类指令

(11-8)

(7-5)

(4-0)

OPCODE b(BIT#) f(FILE#)

二进制代码      HEX  名称     助记符,操作数   操作

状态影响

0100 bbbf ffff

4bf

清除f的位b

BCF   f,b

0→f(b)

Z

2,4

0101 bbbf ffff

5bf

设置f的位b

BSF   f,b

1→f(b)

Z

2,4

0110 bbbf ffff

6bf

测试f的位b,为0则跳

BTFSC f,b

Test bit(b) in file(f):Skip if clear

Z

0111 bbbf ffff

7bf

测试f的位b,为0则跳

BTFSS f,b

Test bit(b) in file(f):Skip if clear

Z

 

常数操作和控制操作类指令

(11-8)

(7-0)

OPCODE   k(LITERAL)

二进制代码      HEX  名称     助记符,操作数   操作

状态影响

0000 0000 0010

002

写OPTION寄存器

OPTION -

W→OPTION register

0000 0000 0011

003

进入睡眠状态

SLEEP -

0→WDT,stop oscillator 

TO,PD

0000 0000 0100

004

清除WDT计时器

CLRWDT -

0→WDT(and prescaler,if assigned)

TO,PD

0000 0000 0fff

00f

设置I/O状态

TRIS   f

W→I/O control register f 

3

1000 kkkk kkkk

8kk

子程序带参数返回

RETLW  k

k→W,Stack→PC 

1001 kkkk kkkk

9kk

调用子程序

CALL   k

PC+1→Stack,K→PC

1

101k kkkk kkkk

Akk

跳转(K为9位)

GOTO   k

k→PC(9 bits) 

1100 kkkk kkkk

Ckk

常数置入W

MOVLW  k

k→W

Z

1101 kkkk kkkk

Dkk

常数和W做或运算

IORLW  k

k∨W→W

Z

1110 kkkk kkkk

Ekk

常数和W做与运算

ANDLW  k

k∧W→W

Z

1111 kkkk kkkk

Fkk

常数和W做异或运算

XORLW  k

k○W→W

Z

                               
表2.1   PIC12C5XX 指令集

   注:1、除GOTO指令外,任何有关写PC(F2)的指令(例如 CALL、MOVWF  2)都将会把PC寄存器的第9位清零。

     2、若对I/O口寄存器进行操作,如“SUBWF   6,1”,则使用的F6的值是当前GP口上的状态值,而非GP口输出锁存器里的值。

       3、指令“TRIS      6”将W寄存器中的内容写入GP的I/O口控制寄存器中:“1”关断对应端口的输出缓冲器,使其为输入(高阻)状态,“0”则使其为输出态。

     4、当预分频器(Prescaler)分配给TIMER0后,任何对TMR0寄存器(F1)写操作的指令都将使预分频器清零。

§2.2  PIC12C5XX 指令寻址方式 

PIC12C5XX单片机寻址方式根据操作数的来源,可分为寄存器间接寻址、立即数寻址、直接寻址和位寻址四种。

一、寄存器间接寻址

这种寻址方式通过寄存器F0(INDF)、F4(FSR)来实现。实际的寄存器地址放在FSR中,通过INDF来进行间接寻址。

    例:

        FSR             EQU             4
        INDF           EQU             0
        MOVLW      05H                           ; W=5
        MOVWF      FSR                                 ; W(=5)→F4
        MOVLW       55H                              ; W=55H
        MOVWF      INDF                             ; W(=55H)→F5

上面这段程序把55H送入F5寄存器。间址寻址方式主要用于编写查表、写表程序,非常方便。请参考§2.7程序设计技巧。

二、立即数寻址

这种方式就是操作数为立即数,可直接从指令中获取。

     例:         MOVLW      16H               ; 16H →W

三、直接寻址

这种方式是对任何一寄存器直接寻址访问。对PIC12C508,寄存器地址(5位)直接包括在指令中,对PIC12C509,寄存器地址中最高1位由FSR(F4)寄存器中的bit5决定,即体选位。

     例:     MOVWF       8                 ; W→F8寄存器

             MOVF        8,W                   ; F8→W

四、位寻址

这种寻址方式是对寄存器中的任一位(bit)进行操作。

     例:     BSF           11,0              ; 把F11的第0位置为“1”。  

§2.3  面向字节操作类指令  

这类指令共有18条,包括有数据传送、算术和逻辑运算、数据移位和交换等操作。它们的操作都是在W数据寄存器f之间进行,其指令码结构为:

(11—6) (5) (4—0)
OPCODE d f(File#)

           

高6位是指令操作码。第6位d是方向位。d=1,则操作结果存入f(数据寄存器),d=0,则操作结果存入W。低5位是数据寄存器地址,可选中32个寄存器。对于PIC12C509,则还要参考寄存器体选择器FSR的bit5选择存入哪一个寄存器体(bank0或bank1)。

       1、寄存器加法指令

         格式:       ADDWF     f,d

指令码: 000111 d fffff

     指令周期:   1
        操作:       W+f→d
        影响状态位: C,DC,Z
        说明:       将f寄存器和w相加,结果存入f(d=1)或W(d=0)。
        例:         ADDWF          8,0          ; F8+W→W

         ─────────────────────────────────

         2、寄存器与指令

         格式:       ANDWF     f,d

指令码: 000101 d fffff

         指令周期:   1
        操作:       W∧f→d
        影响状态位: Z
        说明:       将f寄存器和w做逻辑与运算,结果存入f(d=1)或W(d=0)。
        例:         ANDWF    10,0             ; F10∧W→W
                            ANDWF    10,1                ; F10∧W→F10

         ─────────────────────────────────

         3、寄存器清零指令

         格式:       CLRF         f

指令码: 0000011 fffff

         指令周期:   1
        操作:       0→f ,1→z
        影响状态位:z
        说明:       将f寄存器清零,状态位Z将被置为1。
        例:         CLRF               8           ; F8清为零(0→F8)

         ─────────────────────────────────

         4、W清零指令

         格式:       CLRW

指令码: 000001 0 00000

         指令周期:   1
        操作:       0→W,1→Z
        影响状态位: Z
        说明:       将W寄存器清零,状态位Z将被置为1。
              例:              CLRW                      ;W清为零,Z置为1

         ─────────────────────────────────

         5、寄存器取反指令

         格式:       COMF              f,d

指令码: 00 d fffff

         指令周期:   1
        操作:       f→d
        影响状态位: Z
        说明:       将f寄存器内容做逻辑求反运算,结果存入f(d=1)或W(d=0)。
        例:         COMF              12,0        ; F12取反→F12
                     COMF              12,1         ; F12取反→W

         ─────────────────────────────────

         6、寄存器减1指令

         格式:        DECF      f,d

指令码: 000011 d fffff

         指令周期:    1
        操作:        f-1→d
        影响状态位:  C,DC,Z
        说明:        f寄存器内容减1存入f(d=1)或W(d=0)。
      例:          DECF      15,1             ; F15-1→F15
                        DECF      15,0            ; F15-1→W

         ─────────────────────────────────

         7、寄存器减1,结果为零则跳指令

         格式:        DECFSZ          f,d

指令码: 0010 11df ffff

         指令周期:    1或2(产生跳转时为2)

         操作:        f-1→d; 结果为零则跳(PC+1→PC)

         影响状态位:  无

         说明:        将f寄存器内容减1存入f(d=1)或W(d=0)。如果结果为0,则跳过

                       下一条指令不执行。否则顺序执行下一条指令。

         例:           ┌───DECFSZ       10,1                 ; F10-1→F10,如果F10为0

               F10=0  │      MOVLW       55H          ; 则跳过MOVLW 55H指令

                     └──→MOVF           12,0

         ─────────────────────────────────

         8、寄存器加1指令

         格式:        INCF        f,d

指令码: 001010 d fffff

         指令周期:    1

         操作:        f+1→d

         影响状态位:  C,DC,Z

         说明:        f寄存器加1,结果存入f(d=1)或W(d=0)。

         例:          INCF      10,0                     ; F10+1→W

                       INCF      10,1             ; F10+1→F10

         ─────────────────────────────────

         9、寄存器加1,结果为零则跳指令

         格式:        INCFSZ           f,d

指令码: 001111 d fffff

         指令周期:    1或2(产生跳转时为2)

         操作:     f+1→d,结果为零则跳(PC+1→PC)

         影响状态位:  无

         说明:    将f寄存器内容加1存入f(d=1)或W(d=0),如果结果为零则PC值

                       加1跳过下一条指令。

         例:          L00P   ┌─INCFSZ  8,1   ; 将F8寄存器加1,结果存入F8,

                              │  GOTO    LOOP  ; 加1后结果为零则跳到MOVWFF9指令

                       F8=0   └→MOVWF   9

         ─────────────────────────────────

         10、寄存器或指令

         格式:       IORWF      f,d

指令码: 000100 d fffff

         指令周期:   1

         操作:       W∨f→d

         影响状态位: Z

         说明:       将f寄存器内容和W内容做逻辑或运算,结果存入f(d=1)或W(d=0)。

         例:         IORWF      18,1              ; F18∨W→F18

                      IORWF     18,0              ; F18∨W→W

         ─────────────────────────────────

         11、f寄存器传送指令

         格式:        MOVF     f,d

指令码: 001000 d fffff

         指令周期:    1

         操作:        f→d

         影响状态位:  Z

         说明:        将f寄存器内容传送至W(d=0)或自己本身f(d=1)。如果是传给

                       自己,一般是用来影响状态位Z,即可判断f是否为零。

         例:        MOVF   10,1    ; F10→F10

                       BTFSS    3,2     ; 判断F3的第二位,即Z状态位。如果F10=0,则Z=1。

         ─────────────────────────────────

         12、W寄存器传送指令

         格式:         MOVWF       f

指令码: 000000 1 fffff

         指令周期:     1

         操作:         W→f

         影响状态位:   无

         说明:         将W内容传给f寄存器。

         例:           MOVWF              6            ; W→F6(B口)

         ─────────────────────────────────

         13、空操作指令

         格式:        NOP

指令码: 000000 000000

         指令周期:     1

         操作:         无任何操作

         影响状态位:   无

         说明:         不做任何操作,只有使PC加1。

         ─────────────────────────────────

         14、带进位位左移指令

         格式:        RLF   f,d

指令码: 001101 d fffff

         指令周期:     1

         操作:         f(n)→d(n+1),f(7)→c,c→d(0)

         影响状态位:   C

         说明:         将f寄存器左移,结果存入f(d=1)或W(d=0)。f左移时,其最高

                        位(bit7)移入状态位C(进位位),如下图:

                        进位位

                ┌──┐   ┌──┬──┬──┬──┬──┬──┬──┬──┐

            ┌─┤ C  │← │D7 │ D6 │D5 │ D4 │D3 │ D 2│ D1 │ D0│    ←─┐

            │  └──┘   └──┴──┴──┴──┴──┴──┴──┴──┘        │

       └──────────────────────────────────┘

         例:           RLF    8,1               ; F8左移→F8

                        RLF    8,0               ; F8左移→W

       ─────────────────────────────────

         15、带进位位右移指令

         格式:         RRF     f,d

指令码: 001100 d fffff

         指令周期:     1

         操作:         f(n)→d(n-1),f(0)→c,c→d(7)

         影响状态位:   C

         说明:         将f寄存器右移,结果存入f(d=1)或W(d=0)。f右移时,其最低

                        位(bito)移入状态位C,而原来的状态位C移入f最高位(bit7),

                        如下图:

    ┌────────────────────────────┐

                  │进位位       │

                  │    ┌─┐  ┌──┬─┬──┬─┬──┬─┬──┬─┐│

                  └─→│C │→│D7 │D6│D5 │D4│D3 │D2│ D1 │D0│─┘

                        └─┘  └──┴─┴──┴─┴──┴─┴──┴─┘

         例:           RRF    8 ,1            ;F8右移→F8

                        RRF    8,0             ;F8右移→W

         ─────────────────────────────────

         16、寄存器减法指令

         格式:       SUBWF     f,d

指令码: 000010 d fffff

         指令周期:     1

         操作:         f-w→d

         影响状态位:   C,DC,2

         说明:         将f寄存器内容减去W内容,结果存入f(d=1)或W(d=0)。

         例:           CLRF           20            ;F20=0

                        MOVLW       1            ; W=1

                        SUBWF        20,1        ; F20-W=0-1=-1→F20

                                                 ; C=0,运算结果为负。

         ─────────────────────────────────

         17、寄存器交换指令

         格式:        SWAPF  f,d

指令码: 001110 d fffff

         指令周期:     1

         操作:         f(0-3)→d(4-7),f(4-7)→d(0-3)

         影响状态位:   无

         说明:         将f寄存器内容的高4位(bit7-bit4)和低4位(bit3-bit0)交换

                        结果存入f(d=1)或W(d=0)。

         例:           MOVLW     56H

                        MOVWF      8             ; F8=56H

                        SWAPF      8,1               ; F8交换,结果存入F8,则F8=65H。

         ─────────────────────────────────

         18、寄存器异或运算指令

         格式:        XORWF   f,d

指令码: 00010 d fffff

         指令周期:     1

         操作:         W○f→d 

         影响状态位:   Z

         说明:         将f寄存器和W进行异或运算,结果存入f(d=1)或W(f=0)。 

         例:           XORWF   5,1              ; F5○W→F5(A口)

                        XORWF   5,0              ; F5○W→W

§2.4  面向位操作类指令  

这类指令共有4条,指令码基本结构为:

(11—8) (7—5) (4—0)
OPCODE bbb file#

高4位是操作码。bit5-bit7是位地址(可寻址8个位),bito-bit4是寄存器地址。

         19、位清零指令

         格式:       BCF    f,b

指令码: 0100 bbb fffff

         指令周期:    1

         操作:        0→f(b)

         影响状态位:  无

         说明:        将f寄存器的b位清为0。

        例:          BCF 8,2                   ; 将F8的第2位(bif2)清为0。

         ─────────────────────────────────

         20、位置1指令

         格式:        BSF f,b

指令码: 0101 bbb fffff

         指令周期:    1

         操作:        1→f(b)

         影响状态位:  无

         说明:        将f寄存器的b位置为1。

        例:          BSF 8,2                   ; 将F8的第2位(bif2)清为1。

         ─────────────────────────────────

         21、位测试,为零则跳指令

         格式:        BTFSC     f,b

指令码: 0110 bbb fffff

         指令周期:    1或2(产生跳转则为2)

         操作:        如果f(b)=0则跳(PC+1→PC)

         影响状态位:  无

         说明:    


返回 上一页 下一页   信息发布:工号01   转引自: 【 】 【打印】 【关闭

关于我们 ┋ 友情链接


深圳市南山科技园深南花园A座14D
电话:0755-88305872 传真:0755-88305880
Copyright©2005-2009 无忧电子开发网版权所有

粤ICP备05064233号