十年专注单片机方案开发的方案公司英锐恩,分享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是寄存器地址。
影响状态位: 无