技术热线: 4007-888-234
设计开发

专注差异化嵌入式产品解决方案 给智能产品定制注入灵魂给予生命

开发工具

提供开发工具、应用测试 完善的开发代码案例库分享

技术支持

从全面的产品导入到强大技术支援服务 全程贴心伴随服务,创造无限潜能!

新品推广

提供新的芯片及解决方案,提升客户产品竞争力

新闻中心

提供最新的单片机资讯,行业消息以及公司新闻动态

PIC12C5XX 单片机指令集+程序设计技巧

更新时间: 2019-03-23
阅读量:2493

十年专注单片机方案开发的方案公司英锐恩,分享PIC12C5XX 单片机指令集及程序设计技巧。英锐恩现提供服务产品涉及主控芯片:8位单片机、16位单片机、32位单片机及各类运算放大器等。

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是寄存器地址。

XORWF 5,0 ; F5○W→W

§2.4 面向位操作类指令 

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

(11—8)

(7—5)

(4—0)

OPCODE

bbb

file#

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

XORWF 5,0 ; F5○W→W

§2.4 面向位操作类指令 

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

(11—8)

(7—5)

(4—0)

OPCODE

bbb

file#

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

影响状态位: 无