单片机代理商深圳英锐恩为您分享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 &nbs